经典笔试选择题总结(类与对象篇)

这些都是很经典的类与对象的问题,在加上继承,多态,还有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");
}

猜你喜欢

转载自blog.csdn.net/weixin_43939593/article/details/105576341