EffectiveC++详解:条款05-了解C++默默编写并调用哪些函数

本文探讨C++中编译器自动为类生成的默认函数,包括拷贝构造函数、拷贝赋值运算符、析构函数及默认构造函数。详解编译器拒绝生成拷贝赋值运算符的情况,如成员变量为引用或const类型,或基类拷贝赋值运算符被声明为删除或private。

@Author:CSU张扬
@Email:csuzhangyang@gmail.com or csuzhangyang@qq.com
@我的网站: https://www.cppbug.com

条款05-了解C++默默编写并调用哪些函数

当我们写了一个空类,意味着什么

当我们定义一个空类时,编译器会为我们自动声明拷贝构造函数拷贝赋值运算符析构函数,若你没有声明任何构造函数,编译器会声明一个默认构造函数,这些函数都是 publicinline

例如我们定义一个空类:class Empty { };,等同于下面这段代码:

class Empty {
public:
    Empty() { ... };
    Empty(cosnt Empty& rhs) { ... }
    ~Empty() { ... }
    Empty& operator=(const Empty& rhs) { ... }
}

注意:

  1. 编译器合成的析构函数是 non-virtual 的。
  2. 对于拷贝构造函数和拷贝赋值运算符,编译器合成的版本只是单纯的将对象每个 non-static 成员拷贝到目标对象。

编译器什么时候拒绝生成拷贝赋值运算符

  1. 类的成员变量是 引用 类型时。因为C++不允许改变引用的对象。
  2. 类的成员变量是 const 类型时。因为C+++不允许修改常量。
  3. 基类的拷贝赋值运算符声明为 删除的(C++11) 或者 private 的,那么编译器拒绝为它的派生类生成拷贝赋值运算符。因为 若生成了拷贝赋值运算符,派生类的拷贝赋值运算符同时也会处理基类部分的成员变量,而基类没有该函数,所以没办法赋值。

总结

  • 编译器会暗自为类声明拷贝构造函数拷贝赋值运算符析构函数默认构造函数
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值