Effective C++之五

    重点:了解C++自动合成和调用的缺省构造、Copy构造、赋值和析构函数

 

    即使你定义了一个空类,C++编译器也会为你生成上述函数。准确地说,是在需要的时候生成。见而言之,它们做以下工作:

    - 缺省构造和析构,调用基类和成员对象的缺省构造和析构函数

    - copy构造和赋值操作,简单地复制每一个成员对象的值。对于基本类型,就是bitwise复制。

 

    《C++对象模型》[1]中对缺省构造函数有更多的说明。以下四种情况,编译器会合成缺省的构造函数:

      1) 成员对象有缺省的构造函数时,将调用其缺省构造函数

      2) 基类有缺省构造函数时,会调用基类的构造函数

      3) 类中声明了虚函数时,则会生成虚函数指针、虚函数表相关代码

      4) 类从虚基类继承时,要确定访问虚基类的偏移量。

      值得注意的是,在合成的缺省构造函数中,基本类型的成员变量包括数组成员变量,都不会被初始化。如果仅定义了一个Template构造函数,编译器还是会合成一个缺省构造函数。

 

      有三种情况会用到Copy构造,分别是:

      1) 显式初始化操作,又可分为三种语法形式(假设已经定义了X x0):

          1.1  X x1(x0);

          1.2  X x2 = x0;        // 这是Copy构造,不是赋值

          1.3  X x3 = X(x0);

      2) 参数对象,即对象以传值方式作为函数参数

      3) 函数返回值,即函数返回一个对象。

    

      按C++标准,只有有价值(nontrivial)的copy构造才会被合成,确定构造函数是否有价值的标准是:是否展现“bitwise copy”。以下四种情况无法使用bitwise copy:

     1) 至少有一个成员对象声明了copy构造,无论是设计者声明的,还是编译器自动合成的

     2) 至少有一个基类声明了copy构造

     3) 类中声明了至少一个虚函数

     4) 类派生自至少一个虚基类。

 

     赋值操作与copy构造类似,不再详述。析构函数再后面的条款中有叙述,也不再详述。

 

    [1] 参见《C++对象模型》2.1和2.2节。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值