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