PRINTED构造函数初始化列表整理归纳注释版2015.doc

PRINTED构造函数初始化列表整理归纳注释版2015.doc

ID:59253044

大小:26.50 KB

页数:3页

时间:2020-09-08

PRINTED构造函数初始化列表整理归纳注释版2015.doc_第1页
PRINTED构造函数初始化列表整理归纳注释版2015.doc_第2页
PRINTED构造函数初始化列表整理归纳注释版2015.doc_第3页
资源描述:

《PRINTED构造函数初始化列表整理归纳注释版2015.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、构造函数初始化列表以下所有程序在code::blocks中编译运行,使用GNUGCCcompiler一、什么是构造函数初始化列表构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。例如:classMyClass{public:MyClass():x(1),y(2){}private:intx;inty;};MyClass():x(1),y(2){}就是构造函数初始化列表,分别将MyClass的两个成员变量x和y初始化为1和2.以上的构造函数初始化列表跟普

2、通的构造函数:MyClass(){x=1;y=2;}效果相同。二、使用构造函数初始化列表的原因使用构造函数初始化列表有以下两个原因:1.必要性(1)类中某一成员的类型是没有默认构造函数的类(或结构体)如果类中存在这样一个成员,它的类型是没有默认构造函数(就是只有带参数的构造函数)的类或结构体,这时要对这个类成员进行初始化就只能调用这个类成员的带参数的构造函数,如果没有初始化列表,那么他将无法完成这一步。错例:classMyClassA{public:MyClassA(inta){x=a;}//带参数的构造函数i

3、ntx;};classMyClassB{public:MyClassAca;};报错:error:nomatchingfunctionforcallto'MyClassA::MyClassA()'

4、就是说MyClassA缺少不带参数的默认构造函数MyClassA::MyClassA()为了验证,可以为MyClassA补上MyClassA(),编译通过。还可以通过构造函数初始化列表来解决这一问题:正确例程:classMyClassA{public:MyClassA(inta){x=a;}//带参数的构造函数int

5、x;};classMyClassB{public:MyClassB():ca(111){};//构造函数初始化列表MyClassAca;};这时x初始化为111.还有以下情况需要用到构造函数初始化列表。(2)类中含有const成员或引用类型成员当类成员中含有const或是引用类型成员时,他们也必须要通过成员初始化列表进行初始化,因为这两种对象要在声明后马上初始化,而在构造函数中,做的是对他们的赋值,这样是不被允许的。错误例子:classMyClassA{public:MyClassA(){x=1;}consti

6、ntx;};编译报错:1.error:uninitializedmember'MyClassA::x'with'const'type'constint'

7、(x作为常整型变量没有经过初始化)。2.error:assignmentofread-onlydata-member'MyClassA::x'

8、(错误:构造函数中对只读变量x进行赋值操作)要解决以上问题,可以使用初始化列表。正确例子:classMyClassA{public:MyClassA():x(1){};//构造函数初始化列表constintx;};对于

9、引用型变量,亦如是。2.效率性类对象要通过构造函数构造,对于没有初始化列表的构造函数,进入构造函数体后进行的是赋值操作。赋值和初始化是不同的,这里存在着效率的差异,如果不用成员初始化列表,那么类对自己的类成员分别进行一次隐式的默认构造函数调用,和一次复制操作符调用,这样做效率就得不到保障。注意:构造函数需要初始化的数据成员,不论是否出现在构造函数的成员初始化列表中,都会在该处完成初始化,并且初始化的顺序和其在声明时的顺序是一致的,与列表的先后顺序无关,所以要特别注意,保证两者顺序一致才能真正保证其效率。程序:#

10、includeusingnamespacestd;classMyClassA{public:MyClassA():y(1),x(2){};//构造函数初始化列表intx;inty;};intmain(){MyClassAca;cout<<"x="<

11、re

12、可以看到,即使初始化列表中y在x前,但是,初始化时依旧按照声明时的顺序:先x后y。再看一个很具启发性意义的程序:#includeusingnamespacestd;classMyClassA{public:MyClassA(inta,intb);//构造函数intx;inty;};MyClassA::MyClassA(inta,intb):y(a),x(y){

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

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

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