【MOOC】易错题汇总
派生类构造函数的成员初始化列表中,不能包含的初始化项是()。
这里所说的“基类的子对象”即基类的数据成员
在C++中,构造函数不能被继承,因此,派生类的构造函数必须通过调用基类的构造函数来初始化基类子对象。
在派生类初始化列表直接初始化基类的成员,被称为“越级初始化”,是会报错的。
举个栗子:
我们先创建一个基类,里面有一个int型子对象
class A{
protected:
int n;//基类的子对象
public:
A();
A(int temp):n(temp){}
};
然后创建一个派生类,并用派生类构造函数的初始化列表来进行“越级初始化”
class B:public A{
public:
B(int temp):n(temp){}//对基类子对象n进行初始化
};
在主函数中调用
int main()
{
B(1);
return 0;
}
结果报错:[Error] class ‘B’ does not have any field named ‘n’
所以越级初始化是不可以的,但是可以“越级赋值”(自造名词哈哈)
class B:public A{
public:
///B(int temp):n(temp){}
///改为
B(int temp){n=temp};
};
这样就可以完美运行了。
因此,派生类的构造函数必须通过调用基类的构造函数初始化基类成员,不能够在派生类初始化列表直接初始化基类的成员
类模板与模板类的区别
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CSZGgNyv-1579091773306)(https://cdn.jsdelivr.net/gh/cnatom/images/images/20191219095637.png)]
回顾一下基本概念
——类模板是指:
template <class T>
class A{
...........
};
——类模板实例化:从通用的类模板定义中生成类的过程称为模板实例化,如:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vZ1Gh7ow-1579091773307)(https://cdn.jsdelivr.net/gh/cnatom/images/images/20191219100943.png)]
所以说题目中D选项就是错误的,类模板实例化出来的是类的实例,而不是对象。
——模板类是啥?? 参考一下《C++ Primer Plus》解释:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9jq1wTxW-1579091773307)(https://cdn.jsdelivr.net/gh/cnatom/images/images/asdasdasx.png)]
也就是说:
Stack<int> obj;
//Stack<int>是模板类
//而obj是由这个模板类所声明的一个对象
所以说A.C选项是错误的,产生的模板类应该是tanytemp<int>
我认为此答案可能错误,欢迎在评论区批评指正!
关于this指针的描述
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4e6Eg1b0-1579091773308)(https://cdn.jsdelivr.net/gh/cnatom/images/images/20191219101637.png)]这个题看走眼了啊啊啊啊啊啊啊
——C选项:形参(obj)到实参(this)的拷贝过程中才创建this指针(实参),由系统自动生成
——D选项:this指针的显示使用:
class A{
private:
int num;
public:
A(int num=0){
this->num = num;//显示使用了this指针
}
}
刚刚在敲上述代码的时候发现了一个问题,如果构造函数这样写:
A(int num=0):this->num(num){}
就会爆出两个错误:
[Error] expected '{' before 'this'
[Error] expected identifier before 'this'
产生了一个新的问题,“能不能在构造函数的初始化列表使用this指针?”
带着疑问,搜了一下网上的解释:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a1Ipb2Dt-1579091773308)(https://cdn.jsdelivr.net/gh/cnatom/images/images/20191219103633.png)]
但是通过刚刚的例子,可以明显的看出,在构造函数的初始化列表中是不能用this指针的。具体原因,等以后重新翻看文档寻找答案(貌似涉及到底层的东西?)
类在什么时候产生对象?
产生对象的几种情况:
example x(5);//类名 对象名;
example arr[2] = {1,2};//数组的方式,产生两个
x=example(15);//用example(15)生成一个临时对象,再将对象赋给同类对象x
不禁让我想起了另一个题
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mXHgq5yq-1579091773309)(https://cdn.jsdelivr.net/gh/cnatom/images/images/20191219105035.png)]
这里只是定义了三个PAT型的指针,并没有产生任何对象,调用构造函数也就无从谈起了。