C++ 注意派生类初始化基类的构造函数方式
class A
{
public:
virtual ~A() {}
int a{ 100 };
int b{ 200 };
};
class B :public A
{
public:
B() = default;
B(const B&b)
//:A(b) // OK, 委托构造函数形式
{
A::A(b); // 这不行,创造了一个临时对象,a,b值没有受到影响
c = b.c;
}
B& operator=(const B&b)
{
if (this == &b)
{
return *this;
}
A::operator=(b); // 可以的
c = b.c;
return *this;
}
int c{ 300 };
};
注意派生列的拷贝构造函数,应用改用委托构造函数的形式,不要像operator=拷贝赋值运算符一样,在函数内部调用了。拷贝赋值运算符在派生类拷贝赋值运算符内部调用时没有问题的。
int main()
{
B b1;
B b2;
b2.c = 3;
b2.b = 2;
b2.a = 1;
B b3(b2);
cout << b3.a << " " << b3.b << " " << b3.c << '\n';
b3 = b2;
cout << b3.a << " " << b3.b << " " << b3.c << '\n';
system("pause");
return EXIT_SUCCESS;
}
输出:
100 200 3
1 2 3
请按任意键继续. . .
从输出可见,b3 拷贝构造, a,b 的值没有受到影响,用 委托构造函数形式 是可以的。赋值运算符没有问题。
浙公网安备 33010602011771号