`
mquv_site
  • 浏览: 38950 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

C++学习-构造函数初始化列表(4)

 
阅读更多
作者:gzshun. 原创作品,转载请标明出处!
来源:http://blog.csdn.net/gzshun


从概念上讲,可以认为构造函数分两个阶段进行:
1.初始化阶段;
2.普通的计算阶段。(计算阶段由构造函数函数体中的所有语句组成)
不管成员是否在构造函数初始化列表中显示初始化,类类型的数据成员总是在初始化阶段初始化。初始化发生在计算阶段的开始之前。
建议:使用构造函数初始化列表
注:必须对任何const或引用类型成员以及没有默认构造函数的类类型的任何成员使用初始化式。
一般使用构造函数初始化列表,可以避免发生编译错误。
讲解:没有默认构造函数的类?是什么意思?
在大部分编译器中,声明一个类,若类没有显示的声明和定义构造函数,那么编译器就会在编译阶段生成一个默认构造函数。如果用户在该类中声明了一个构造函数,那么编译器就不会生成默认构造函数,而是使用了用户自己定义的构造函数,为了避免编译错误,最好使用构造函数初始化列表对该类的对象进行初始化。
-----摘自于《C++ Primer 中文版 第4版》

类成员的初始化包括类对象成员与类数据成员的初始化。初始化比较关键的是构造函数的初始化列表,在构造函数中成员初始化列表中也需要次序的。只有构造函数才能有成员初始化的效果,普通的成员函数没有这功能,比如:

这个初始化是错误的,setXY并非是构造函数,所以普通成员函数只能通过赋值的形式来设置变量或对象的值。

这里声明一个类CInit,如下:


一.构造函数的初始化列表的基本使用
这是正常的初始化列表的用法
初始化:

达到的结果相当于
赋值:


二.成员初始化的次序
在构造函数初始化列表中,成员初始化的次序就是声明成员的次序。
例子1:张三想先用x初始化mX,再用mX初始化mY

此时的结果是:

mX与mY均被成功的初始化。


例子2:李四想先初始化mY,再用mY初始化mX

此时的结果是:

从结果可以很明显的看出,mX没有被初始化,而mY成功被初始化为3。


从这里可以看出,构造函数是以变量的声明顺序来执行初始化的动作,所以例子2中,构造函数先初始化mX,但此时mY是未初始化过的,所以导致这种情况。在构造函数的初始化列表中,最好要按照类中成员变量的声明顺序来初始化。


三.在什么情况下使用构造函数初始化列表?
1.const对象
2.引用类型对象
因为const对象与引用类型对象只能够初始化,不能赋值,所以必须在初始化列表中进行初始化。
3.类对象(下文说明)


四.构造函数中,赋值初始化与初始化列表初始化,哪个效率更高?为什么?
先来看一个例子,便可知分晓:

1.若CInit的构造函数为:

执行结果为:
在构造函数CInit的初始化列表初始化mObj对象时,调用了复制构造函数1次,总共需要1个行为。

2.若CInit的构造函数为:

执行结果为:

在构造函数体中赋值mObj对象时,首先调用默认构造函数,其次是调用operator=赋值运算符,总共需要2个行为。

所以可以得出这么一个结论:对于用户自定义的类类型,使用构造函数初始化列表进行初始化的效率,比在构造函数体中赋值初始化的效率更高。对于内置类型,效率是差不多的。

五.构造函数初始化列表的使用例子

执行结果:


Happy Learning!

分享到:
评论

相关推荐

    C++构造函数初始化列表

    关于“C++构造函数初始化列表 ”的实例分析

    成员初始化列表与构造函数体中的区别详细解析

    C++ Primer中在讲构造函数初始化列表的时候有这么一段话:无论是在构造函数初始化列表中初始化成员,还是在构造函数体中对它们赋值,最终结果是相同的。不同之处在于,使用构造函数初始化列表的版本初始化数据成员,...

    C++ 构造函数初始化列表的好处

     Derive 类构造函数两个 Base 类型的参数,分别赋给该类两个 Base 类型的成员变量 b1、b2,一个使用初始化列表,一个使用等于号赋值。输出结果如下:  前两行输出是主函数前两行构造 b1、b2 对像时调用的带...

    c++ 子类构造函数初始化及父类构造初始化的使用

    主要介绍了c++ 子类构造函数初始化及父类构造初始化的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    C++类构造函数初始化列表

    构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。例如: class CExample { public: int a; float b; //构造函数初始化列表 CExample(): a(0...

    c++初始化列表和构造函数初始化区别.pdf

    c++初始化列表和构造函数初始化区别.pdf

    C++关于构造函数的初始化

    关于C++构造函数初始化的详细介绍,值得学习的东西哦

    关于C++中构造函数初始化成员列表的总结

    1.只能在构造函数初始化列表初始化的成员变量的类型?  a.const成员变量  b.引用类型的成员变量  c.static不能在初始化列表中进行...以上就是小编为大家带来的关于C++中构造函数初始化成员列表的总结全部内容了,希望

    c++基础语法:构造函数初始化列表

    它本身是一个类或者是一个结构,而且这个成员它只有一个带参数的构造函数,而没有默认构造函数,这时要对这个类成员进行初始化,就必须调用这个类成员的带参数的构造函数,如果没有初始化列表,那么他将无法完成第一...

    c++ 构造函数的初始化列表

    首先,运行下图中的C++代码,输出是...在C++中,成员变量的初始化顺序与变量在类型中的声明顺序相同,而与它们在构造函数的初始化列表中的顺序无关。因此在这道题中,会首先初始化n1,而初始n1的参数n2还没有初始化,是

    C++中的构造函数、析构函数剖析

    C++中的构造函数、析构函数剖析 在C+ + 中, 构造函数是一个在构件对象的时 候调用的特殊的函数, 其目的是对对象进行初始 化工作, 从而使对象被使用之前可以处于一种合 理的状态。析构函数是在撤消对象时, 收回对象 ...

    cpp代码-C++:初始化列表:2.向构造函数传递参数

    cpp代码-C++:初始化列表:2.向构造函数传递参数

    C++初始化列表使用

    讲解了为什么要初始化列表,初始化列表和在构造函数中赋值的区别

    C++构造函数初始化顺序详解

    2.缺省构造函数时,系统将自动调用该缺省构造函数初始化对象,缺省构造函数会将所有数据成员都初始化为零或空 3.创建一个对象时,系统自动调用构造函数 析构函数 1.析构函数没有参数,也没有返回值。不能重载,也...

    C++构造函数初始化顺序

    C++构造函数按下列顺序被调用:  (1)任何虚拟基类的构造函数按照它们被继承的顺序构造;  (2)任何非虚拟基类的构造函数按照它们被继承的顺序构造;  (3)任何成员对象的构造函数按照它们声明的顺序调用;  (4...

    构造函数的部分初始化

    构造函数的部分初始化,可以更好地了解函数如何初始化

    计数器实现了默认构造函数用于初始化,c++面向对象程序设计书上的习题

    实现了默认构造函数用于初始化,c++面向对象程序设计书上的习题

    详解C++中构造函数,拷贝构造函数和赋值函数的区别和实现

    构造函数是一种特殊的类成员函数,是当创建一个类的对象时,它被调用来对类的数据成员进行初始化和分配内存。(构造函数的命名必须和类名完全相同) 首先说一下一个C++的空类,编译器会加入哪些默认的成员函数 默认...

Global site tag (gtag.js) - Google Analytics