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 的值没有受到影响,用 委托构造函数形式 是可以的。赋值运算符没有问题。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
2024-02-27 C# 简单反射加载 DLL 实例