[Effective C++读书笔记]005_条款05_了解C++默默编写并调用哪些函数
其实这一点在C++的基础类入门书,如C++ primer里面也有说过,不过很少有人去注意而已,作者把这一点提出来,是为了提醒我们。
这一条款的内容如下:就是说当你书写下面的【代码片段1】的时候,其实经过编译器处理后,你所书写的代码本质上是【代码片段2】:
代码片段1(你亲自手写的):
1 class A{ 2 3 };
代码片段2(编译器帮你生成的):
1 class A{ 2 public: 3 A() { ... } 4 A(const A& rhs) { ... } 5 ~A() { ... } 6 7 A& operator =(const A& rhs) { ... } 8 };
从上面可以看出来,编译器为我们补充声明了:
1. 无参构造函数
2. 拷贝构造函数
3. 析构函数
4. 赋值操作符=
在本条款中,作者又说明了另外一点,那就是关于赋值操作符=的生成规则,到底是生成呢,还是不生成呢?我们来看两个例子:
1 #include <iostream> 2 using namespace std; 3 4 class A{ 5 }; 6 7 int main(){ 8 A a1; 9 A a2; 10 a1 = a2; 11 return 0; 12 }
结果:编译运行成功!
1 #include <iostream> 2 using namespace std; 3 4 class A{ 5 public: 6 int value; 7 const int constValue; 8 A(int v):constValue(v){} 9 }; 10 11 int main(){ 12 A a1(10); 13 A a2(20); 14 a1 = a2; 15 return 0; 16 }
结果:编译失败,提示“Error:没有与这些操作数匹配的‘=’运算符”。
这说明了:
当类中有引用,常量定义时,编译器不会为其生成‘=’运算符的函数。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架