這些都是很經典的類與對象的問題,在加上繼承,多態,還有C++11的異常,一道題裏面富含着多個知識點,所以稱他們爲經典。當然還有一些新穎的,比較簡單但是存在誤區的題。都有總結和解釋,** // 解釋的部分都爲拓展**
注意: 題目無關痛癢,主要是我有隻是的總結和拓展。
- 問題:程序輸出什麼?
知識點:異常+繼承、多態 + C++11類型轉換
class B
{
public:
virtual void f()
{
cout << "B " << endl;
}
};
class D : public B
{
public:
void f()
{
cout << "D " << endl;
}
};
int main()
{
B b;
try
{
//B* bb = new B();
//D* rd = dynamic_cast<D*> (bb); // 非法的,dynamic_cast檢測出來,就把D* 的rd置爲nullptr, 以致不能rd->f()
//rd->f();
D& rd = dynamic_cast<D&>(b); // 檢測出來是非法的,所以下面的catch就是截獲這個異常
rd.f();
//D d;
//D* ptr = new D();
//B& pb = dynamic_cast<B&>(d); // B類的引用指向的是d類的 父類指針指向子類,只能調用父類成員或者子類中的虛函數
//pb.f();
//B* ppb = dynamic_cast<B*>(ptr); // B類的指針指向d類的指針ptr 子類指針指向父類,只能調用父類成員或者子類中的虛函數
//ppb->f();
}
catch (bad_cast&)
{
B b;
b.f();
}
system("pause");
}
- 程序怎麼可以輸出1/2 ?
知識點:重載輸出函數也可以用void,傳參得傳標準輸出流對象。
class A
{
int a;
int q;
public:
A(int x, int y)
:a(x)
, q(y)
{}
void operator<<(ostream& out)
{
cout << a << "/" << q << endl;//都可以輸出 a/q
out << a << "/" << q << endl; //藉助標準輸出 可以輸出 a/q
}
};
int main()
{
A o1(1, 2);
o1.operator<<(cout);// 將標準輸出流傳參
system("pause");
}
- 程序怎麼可以輸出n值?
知識點:私有不可訪問,共有可以訪問(看清楚)
class A
{
private:
static int n;
int val;
public:
A()
{
n++;
}
void show()
{
cout << n << endl;
}
};
int A::n = 0;
int main()
{
A a;
a.show(); // 只能通過成員函數訪問靜態成員
//cout << A::n << endl; //私有成員,不可訪問
system("pause");
}
- 讓類外完成模板類內成員函數的實現
知識點:模板類+ const作用
template <class T1, class T2>
class R
{
T1 val1;
T2 val2;
public:
R(T1 _val1, T2 _val2)
:val1(_val1)
, val2(_val2)
{}
void show() const; // 後面+const 表示類的成員不能被修改
void show() //不加const的時候說明類的成員可以被修改
{
val1 = 100;
val2 = 100;
cout << val1 << " " << val2 << endl;
}
};
template<class T1, class T2>
void R<T1,T2>::show() const // 在類外完成函數
{
cout << val1 <<" " << val2 << endl;
}
int main()
{
const R<int, int> r(1, 2); //const首先會調用const,輸出 1 2
r.show();
system("pause");
}
- B對象中的共有成員變量有幾個?
知識點:繼承方法
class A
{
private:
int a = 10;
public:
int b = 10;
};
class B :public A //共有繼承
{
private:
int a = 100;
public:
int b = 100;
};
int main()
{
B b;
b.A::b = 100; // 因爲是共有繼承,b除了能訪問對象的b成員,還可以通過這種訪問a類的b成員
system("pause");
}
注意:
- B類的對象b不管以哪一種方式繼承(private,public,protect),成員變量都是4個(A類的a和b,B類的a和b),只是作用域不同,而 B類的對象b訪問不到而已。。
- 共有成員變量與繼承方式有關。
而共有成員變量是B類對象b能訪問到的變量,在這裏是pubic繼承,所以是2個(A類的b和B類的b)
- 下列程序輸出什麼?
知識點: 異常
int f(int s)
{
try
{
if (s < 10)
throw string("abc"); // 一定要拋一個string的對象,下面才能catch 注意!!! string類型纔可以
}
catch (string s)
{
cout << s << endl; //在這裏輸出第一次 s
throw; // throw沒有指定拋什麼異常,再次將這個string("abc")異常拋向第一次的catch中
}
cout << "#" << endl;
}
int main()
{
int i = 9;
try{
f(i);
}
catch (string s) // 再一次捕獲異常字符串,輸出異常string字符串。
{
cout << s << endl;
}
system("pause");
}
- 打印"***"的方式
int main()
{
string test = ("***");
string* s = new string(test);
cout << *s << endl; //這樣也可以輸出"***"
system("pause");
}
知識點:string類的構造,erase,find接口的使用
int main()
{
string s1("abcdefghigklmn");
string s2(s1, 6, 7);//從s1第6個位置開始往後的7個元素
s2.append("abc");
cout << s2 << endl;
// s2.erase(3); //將s2下標第3個往後的全部刪除
s2.erase(3, 1); //從下標第3個開始刪除1個
cout << s2 << endl;
cout << s2.find("abcd") << endl; //查找這個字符串在 s2的起始位置,要是沒有的話返回整形最大值,因爲-1的size_t爲整形最大值
cout << s2,find(abc) <<endl; // 有的話,返回s2第一次出現“abc”,a的位置
system("pause");
}