64,654
社区成员
发帖
与我相关
我的任务
分享
问题一:
在派生情况下,我知道了 当复制B对象时(B X2 = X1)
(1)当派生类B没有提供显示复制构造函数时,会调用缺省的复制构造函数,并且在调用派生类的缺省复制构造函数之前,
会自动调用其基类的复制构造函数(可能是显示的或缺省的)
//复制B对象时(B X2 = X1)不调用拷贝构造函数 调用操作符= 所以下面的2问就无从谈起
//如果是显式的 你在派生类的初始化列表中要显式调用
(2)那么在派生类B提供了显示的复制构造函数 但没有在构造函数的初始化列表中给出基类的构造函数调用时,会自动调
用基础类的构造函数吗?是哪个基类构造函数(缺省构造函数还是缺省复制构造函数)?
//拷贝构造函数也是要显式调用基类的构造函数 若基类有默认构造函数则不用
问题二:
在派生情况下,当B对象互相赋值时(X2 = X1)
(1)当派生类B没有提供显示拷贝赋值操作符=时,会调用缺省的拷贝赋值操作符=,那么在这种缺省的情况下,
在执行它之前 会自动调用基类的拷贝赋值操作符=吗(可能是显示的或缺省的)?
(2)当派生类B提供了显示拷贝赋值操作符=时,那么会在执行前 自动调用基类的拷贝赋值操作符=吗(可能是显示的或缺省的)
还是在派生类显示拷贝赋值操作符=中必须显示地调用基类的拷贝赋值操作符?
具体看程序吧
#include <iostream>
using namespace std;
class a
{
public:
a(int a)
{
data = a;
cout << "a(int a)" << endl;
}
private:
int data;
};
class b:public a
{
public:
b(int b):a(b)
{
data2 = b;
cout << "b(int b)" << endl;
}
b(const b ©):a(2)
{
data2 = copy.data2;
cout << "b(const b ©)" << endl;
}
private:
int data2;
};
int main()
{
b classB(10);
b classBB(classB);//调用拷贝构造函数
b classBBB = classBB;//被编译器优化了 调用了拷贝构造函数
classB = classBB;//调用了赋值操作符
return 0;
}