c++初始化列表及构造函数调用构造函数

来源:互联网 发布:吉诺比利04奥运会数据 编辑:程序博客网 时间:2024/06/10 17:25
class CLS{public:int m_Is;CLS(int i):m_Is(i){cout << "constructor" << endl;}CLS(){cout << "default constructor" << endl;m_Is = 1;CLS(0);}};int main(){CLS obj;cout << obj.m_Is << endl;return 1;}


vc6.0验证,输出结果为1。

 

原因:

调用默认构造函数,执行m_Is = 1;将成员赋值为1;

再执行 CLS(0); 这个地方由于只是产生一个临时对象,并未对obj对象的成员变量产生影响;

所以obj.m_Is的值输出为1。

 

关于初始化列表参考http://www.cnblogs.com/graphics/archive/2010/07/04/1770900.html

为什么使用初始化列表

初始化类的成员有两种方式,一是使用初始化列表,二是在构造函数体内进行赋值操作

主要是性能问题,对于内置类型,如int, float等,使用初始化类表和在构造函数体内初始化差别不是很大,但是对于类类型来说,最好使用初始化列表,为什么呢?由上面的测试可知,使用初始化列表少了一次调用默认构造函数的过程,这对于数据密集型的类来说,是非常高效的。同样看上面的例子,我们使用初始化列表来实现Test2的构造函数

struct Test2{    Test1 test1 ;    Test2(Test1 &t1):test1(t1){}}

使用同样的调用代码

输出结果如下

Construct Test1
Copy constructor for Test1

第一行输出对应 调用代码的第一行

第二行输出对应Test2的初始化列表,直接调用拷贝构造函数初始化test1,省去了调用默认构造函数的过程

所以一个好的原则是,能使用初始化列表的时候尽量使用初始化列表

哪些东西必须放在初始化列表中

除了性能问题之外,有些时场合初始化列表是不可或缺的,以下几种情况时必须使用初始化列表

1. 常量成员,因为常量只能初始化不能赋值,所以必须放在初始化列表里面

2. 引用类型,引用必须在定义的时候初始化,并且不能重新赋值,所以也要写在初始化列表里面

3. 没有默认构造函数的类类型,因为使用初始化列表可以不必调用默认构造函数来初始化,而是直接调用拷贝构造函数初始化

 

原创粉丝点击