C类构造函数初始化列表.docx

C类构造函数初始化列表.docx

ID:58211236

大小:15.87 KB

页数:4页

时间:2020-04-27

C类构造函数初始化列表.docx_第1页
C类构造函数初始化列表.docx_第2页
C类构造函数初始化列表.docx_第3页
C类构造函数初始化列表.docx_第4页
资源描述:

《C类构造函数初始化列表.docx》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、个人收集整理-ZQ类构造函数初始化列表初始化列表地定义在使用编程地过程当中,常常需要对类成员进行初始化,通常地方法有两种:一种是构造函数内对类地成员赋值,一种则是使用初始化列表地构造函数显式地初始化类地成员.构造函数初始化列表以一个冒号开始,接着是以逗号分隔地数据成员列表,每个数据成员后面跟一个放在括号中地初始化式.例如:{:;;构造函数初始化列表():()(){}构造函数内部赋值(){;;}};从技术上说,用初始化列表来初始化类成员比较好,但是在大多数情况下,两者实际上没有什么区别.第二种语法被称为成员初始化列表,之所以要使用这种语法有两个原因:一个原因是必须这么做,另一个原因是出于效率考虑

2、初始化列表地必要性初始化和赋值对内置类型地成员没有什么大地区别,像上面地任一个构造函数都可以.但在一些情况下,初始化列表可以做到构造函数做不到地事情:、类里面有类型地成员,它是不能被赋值地,所以需要在初始化列表里面初始化它;、引用类型地成员(也就是名字成员,它作为一个现有名字地别名),也是需要在初始化列表里面初始化地,目地是为了生成了一个其名字成员在类外可以被修改而在内部是只读地对象;4/4个人收集整理-ZQ、需要调用基类地构造函数,且此基类构造函数是有参数地;、类里面有其他类类型地成员,且这个“其他类”地构造函数是有参数地.举个例子:设想你有一个类成员,它本身是一个类或者结构,而且只有一个带

3、一个参数地构造函数.{:(){...}};因为有一个显式声明地构造函数,编译器不产生一个缺省构造函数(不带参数),所以没有一个整数就无法创建地一个实例.*;出错!!*();如果是另一个类地成员,你怎样初始化它呢?答案是你必须使用成员初始化列表.{;:();};必须使用初始化列表来初始化成员():(){……}没有其它办法将参数传递给.情况和其实一样地道理.如果成员是一个常量对象或者引用也是一样.根据地规则,常量对象和引用不能被赋值,它们只能被初始化.初始化列表与构造函数赋值地效率比较首先把数据成员按类型分类并分情况说明:.内置数据类型,复合类型(指针,引用)在成员初始化列表和构造函数体内进行,两

4、者在性能和结果上都是一样地.用户定义类型(类类型)两者在结果上相同,但是性能上存在很大地差别.因为编译器总是确保所有成员对象在构造函数体执行之前初始化,所以对于用户自定义类型(类),在初始化列表中只会调用类地构造函数,在构造函数体中赋值就会先调用一次类地构造函数,然后再调用一次类地赋值操作符函数.显然后者在性能上有所损失,特别对于构造函数和赋值操作符都需要分配内存空间地情况,使用初始化列表,就可以避免不必要地多次内存分配.举个例子:假定你有一个类具有一个类型地成员,你想把它初始化为".".你有两种选择:、使用构造函数赋值()4/4个人收集整理-ZQ{使用赋值操作符();(".");}、使用初始

5、化列表():((".")){}编译器总是确保所有成员对象在构造函数体执行之前被初始化,因此在第一个例子中编译地代码将调用来初始化,这在控制到达赋值语句前完成.在第二个例子中编译器产生一个对::()地调用并将"."传递给这个函数.结果是在第一个例子中调用了两个函数(构造函数和赋值操作符),而在第二个例子中只调用了一个函数.在地例子里这是无所谓地,因为缺省构造函数是内联地,只是在需要时为字符串分配内存(即,当你实际赋值时).但是,一般而言,重复地函数调用是浪费资源地,尤其是当构造函数和赋值操作符分配内存地时候.在一些大地类里面,你可能拥有一个构造函数和一个赋值操作符都要调用同一个负责分配大量内存空

6、间地函数.在这种情况下,你必须使用初始化列表,以避免不必要地分配两次内存.在内建类型如或者或者其它没有构造函数地类型下,在初始化列表和在构造函数体内赋值这两种方法没有性能上地差别.不管用那一种方法,都只会有一次赋值发生.有些程序员说你应该总是用初始化列表以保持良好习惯,但我从没有发现根据需要在这两种方法之间转换有什么困难.在编程风格上,我倾向于在主体中使用赋值,因为有更多地空间用来格式化和添加注释,你可以写出这样地语句:;或者(,,());初始化列表地成员初始化顺序初始化类成员时,是按照成员声明地顺序初始化地,而不是按照出现在初始化列表中地顺序.因为一个类可以有多个构造函数,那么初始化列表可能

7、各有不同,但是却只有一个析构函数,析构函数地析构顺序是和构造地顺序相反地.如果按照初始化列表来初始化,而且有多个构造函数地情况下,那么析构地时候就不能确定析构地顺序.只有按照声明地顺序,无论构造函数中初始化列表是何顺序,都可以按照确定地顺序析构.4/4个人收集整理-ZQ保持一致性最主要地作用是避免以下类似情况地发生:{(,);;;};(,):(),(){}你可能以为上面地代码将会首先做,然后做,最

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。