[Effective C++读书笔记]005_条款05_了解C++默默编写并调用哪些函数

本文详细解析了C++中默认生成的成员函数,包括无参构造函数、拷贝构造函数、析构函数及赋值操作符=。通过具体代码示例展示了编译器自动生成这些函数的条件与限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

其实这一点在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:没有与这些操作数匹配的‘=’运算符”。

这说明了:

当类中有引用,常量定义时,编译器不会为其生成‘=’运算符的函数。

转载于:https://www.cnblogs.com/alephsoul-alephsoul/archive/2012/10/21/2733061.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值