编写高质量代码——首选初始化列表实现类成员的初始化

来源:互联网 发布:港股交易软件 编辑:程序博客网 时间:2024/06/08 07:52

构造函数:对类成员变量完成初始化赋值操作。

类成员的初始化方式:1)在构造函数体中赋值完成(“=”本质是赋值操作)     
                   2)用初始化类成员列表完成,是真正的初始化。
===============================================================
只能使用“初始化参数列表”的情况:
1)const 成员变量

2)如果类B中含有A类型的成员变量,而类A中又禁止了赋值操作(private...)

如下:

class A{
private :
    A operator=(const A&);    
};
class B{
public :
    B(){};
    ~B(){};
private :
    A m_A;
};

--------------------------------

采用构造函数内赋值的方式对成员变量m_A进行初始化:

B::B(){

   m_A = A();// A A::operator=(const A&)’是私有的

}

采用初始化列表参数方式解决:

B::B:m_A(A()){ }

即使没有禁用赋值操作,仍推荐使用初始化参数列表的方式。

===============================================================

构造函数体内赋值初始化方式存在两个问题:

1)比起初始化列表,效率偏低

如下:

class A{    

};
class B{
public :
    B(){};
    ~B(){};
private :
    A m_A;
};

B::B(){

   m_A = A();/* 在该过程中,会产生临时对象,临时对象的构造、析构会造成无谓的效率损耗,而初始化列表方式可以避免 */

}

2)留有安全隐患:C++会悄悄生成默认的赋值函数,对于千变万化的类而言,默认的赋值操作很可能存在问题。

===============================================================

对初始化列表的说明,即初始化的顺序。

==与构造函数中的赋值方式不同,初始化列表中成员变量出现的顺序并不是真正初始化的顺序,初始化的顺序取决于成员变量在类中的声明顺序。

Note:只有保证成员变量声明的顺序与初始化列表顺序一致才能真正保证其效率。

0 0