C++构造函数

Default Constructor

需要合成default constructor的情形:

带有Default Constructor的Member Class Object

  1. 如果一个 class 没有任何 constructor ,但它内含一个 member object ,而后者有 default constructor,那么这个 class 的隐式 default constructor 就是有用的,编译器需要为该class合成出一个 default constructor。

如果class A内含一个或一个以上的member class object,那么class A的每一个constructor必须调用每一个member classes的default constructor。编译器会扩张已存在的constructors,在其中安插一些代码,使得 user code 被执行之前,先调用必要的 default constructors。

c++语言要求以member objects在class中的声明顺序来调用各个constructors。

  1. 如果一个没有任何constructors的class派生自一个带有default constructor的base class,那么这个derived class的default constructor会被视为有用的,需要被合成出来。

如果设计者提供多个constructors,但其中都没有 default constructor ,那么编译器会扩张现有的每一个 constructor ,将用以调用所有必要之default constructors的程序代码加进去。

  1. class声明(继承)一个virtual function。

  2. class 派生自一个继承链,其中有一个或多个virtual base classes。

Copy Constructor

如果class 没有提供一个显式的copy constructor,当class object以相同class的另一个object作为初始值时,内部以default memberwise initialization手法完成。也就是把每一个内建的或派生的data member的值,从某个object拷贝一份到另一个object上。

当 class 不展现出 bitwise copy semantics(位逐次拷贝)时,才会合成出copy constructor。
有4种情况:
1. 当class内含一个member object,而后者的class声明有一个copy constructor。
2. 当class继承自一个base class而后者存在一个copy constructor时。
3. 当class声明了一个或多个virtual functions时。
4. 当class派生自一个继承串链,其中有一个或多个virtual base classes。

成员初始化

在下列情况下,必须使用member initialization list:
1. 当初始化一个 reference member 时。
2. 当初始化一个 const member 时。
3. 当调用一个 base class 的 constructor ,而它拥有一组参数时。
4. 当调用一个member class 的constructor,而它拥有一组参数时。

class Word
{
    String _name;
    int _cnt;
public:
    Word()
    {
        _name = 0;
        _cnt = 0;
    }
};

这种方式会先产生一个临时性的 String object,然后将它初始化,之后以一个assignment运算符将临时性object指定给_name,随后再摧毁那个临时性object。

将int型的变量_cnt放在初始化链表中没有必要,因为它已经是一个行为良好的member。

list中的项目顺序是由class中的members声明顺序决定的,不是由 initialization list决定的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值