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. 没有默认构造函数的类类型,因为使用初始化列表可以不必调用默认构造函数来初始化,而是直接调用拷贝构造函数初始化
- c++初始化列表及构造函数调用构造函数
- c++ 构造函数初始化列表,构造函数的调用顺序
- 构造函数初始化列表
- 构造函数初始化列表
- 构造函数初始化列表
- 构造函数初始化列表
- 构造函数初始化列表
- 构造函数初始化列表
- 构造函数初始化列表
- 构造函数初始化列表
- 构造函数初始化列表
- 构造函数初始化列表
- 构造函数初始化列表
- 构造函数初始化列表
- 构造函数初始化列表
- 构造函数初始化列表
- 构造函数初始化列表
- 构造函数初始化列表
- 使用Spring MVC3构建Web应用详细教程
- 排序
- windows Server 2003 IIS 网站发布说明书
- 设计模式纵谈-Decarator,Facade,FlyWeight,Template Method,Command
- The 12th Zhejiang University Programming Contest
- c++初始化列表及构造函数调用构造函数
- 三个数比较大小
- 计算机学习心得
- 对随机数据排序
- 比较两个数的大小
- POJ 1062 DijStra 变形 枚举
- 计算机学习心得
- 操作系统——存储
- 生成并运行按钮