經典筆試選擇題總結(類與對象篇)

這些都是很經典的類與對象的問題,在加上繼承,多態,還有C++11的異常,一道題裏面富含着多個知識點,所以稱他們爲經典。當然還有一些新穎的,比較簡單但是存在誤區的題。都有總結和解釋,** // 解釋的部分都爲拓展**

注意: 題目無關痛癢,主要是我有隻是的總結和拓展

  1. 問題:程序輸出什麼?
    知識點:異常+繼承、多態 + 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. 程序怎麼可以輸出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");
}
  1. 程序怎麼可以輸出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");

}
  1. 讓類外完成模板類內成員函數的實現
    知識點:模板類+ 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");
}

  1. 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)
  1. 下列程序輸出什麼?
    知識點: 異常
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");
}

  1. 打印"***"的方式
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");
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章