[Effective C++]条款05:了解C++默默编写并调用哪些函数

  • 编译器可以暗自为 class 创建 defaut 构造函数、copy 构造函数、 copy assignment 操作符,以及析构函数

写下一个 empty class,如果你自己没声明,编译器就会为它声明(编译器版本的)一个 copy 构造函数、一个 copy assignment 操作符和一个析构函数。如果你也没有声明任何构造函数,编译器也会为你声明一个 default 构造函数。所有这些函数都是 public 且 inline 的。

你写下:

class Empty {};

就好像你写下:

class Empty {
public:
    Empty(){...}                              // default构造函数
    Empty(const Empty& rhs) {...}             // copy构造函数
    Empty& operator=(const Empty& rhs) {...}  // copy assignment 操作符
    ~Empty() {...}                            // 析构函数
};

惟有当这些函数被需要(被调用),它们才会被编译器创建出来。

编译器为你写函数:

  • default 构造函数和析构函数:给编译器一个地方用来放置“藏身幕后”的代码,比如调用 base classes 和 non- static 成员变量的构造函数和析构函数(编译器产出的析构函数是个 non- virtual,除非这个 class 的 base class 自身声明有 virtual 析构函数)
  • copy 构造函数和 copy assignment 操作符:编译器创建的版本只是单纯地将来源对象的每一个 non- static 成员变量拷贝到目标对象(对于内含 reference 成员或 const 成员的 classes,编译器会拒绝为它们生成 copy assignment 操作符;如果某个 base classes 将 copy assignment操作符声明为 private,编译器将拒绝为其 derived classes 生成 copy assignment 操作符
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值