Effective C++学习5 条款05:了解C++默默编写并调用了哪些函数

一个类一般都包含有构造,析构,copy构造以及copy assignment(也就是operator=)函数,如果用户没有自己声明其中的某一个函数,那么编译器就自动为它声明一个default的函数。这个函数是public并且inline的。不过编译器也很偷懒,它只会在需要这些函数时才会自动去创建它。

那么这些default函数都干了些什么呢?default构造和析构函数主要给编译器一个地方来放置“藏身幕后”的代码的,比如调用base classes和non-static成员变量的构造函数和析构函数。注意default析构函数除非base class的析构是virtual的,否则都是virtual的。而如果你已经自己定义了一个构造函数,那么编译器将不再为你自动生成default构造函数来掩盖掉你自己的版本。

而copy构造函数和copy assignment函数只是单纯的将所有每一个non-static成员变量拷贝至目标对象。copy构造函数会“拷贝原对象内的每一个bits”到目标对象内来完成初始化。而copy assignment函数基本类似,唯一不同的是需要符合:代码合法且有适当机会证明其有意义,才可以通过编译。什么意思呢?请看下面的代码:

那么我们发现如果赋值,那么其中的引用namevalue就可以更改了,就是说引用是可以指向不同的对象,那当然是不行的,所以编译器会拒绝这一行为,报错。同样如果类中有const成员,也无法通过编译器。另外,如果base class的copy assignment函数为private,那么derived class无法自动生成copy assignment函数,因为base class 的部分无法修改(被private修饰了)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值