- 4
- 0
- 约2.88千字
- 约 5页
- 2017-06-10 发布于北京
- 举报
C++类构造函数初始化列表初始化列表的定义 在使用C++编程的过程当中,常常需要对类成员进行初始化,通常的方法有两种:一种是构造函数内对类的成员赋值,一种则是使用初始化列表的构造函数显式的初始化类的成员。 构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。例如: class CExample { public: int a; float b; //构造函数初始化列表 CExample(): a(0),b(8.8) {} //构造函数内部赋值 CExample() { a=0; b=8.8; } }; 从技术上说,用初始化列表来初始化类成员比较好,但是在大多数情况下,两者实际上没有什么区别。第二种语法被称为成员初始化列表,之所以要使用这种语法有两个原因:一个原因是必须这么做,另一个原因是出于效率考虑 初始化列表的必要性 初始化和赋值对内置类型的成员没有什么大的区别,像上面的任一个构造函数都可以。但在一些情况下,初始化列表可以做到构造函数做不到的事情: 1、类里面有const类型的成员,它是不能被赋值的,所以需要在初始化列表里面初始化它; 2、引用类型的成员(也就是名字成员,它作为一个现有名字的别名),也是需要在初始化列表里面初始化的,目的是为了生成了一个其名字成员在类外可以被修改而在内部是只读的对象; 3、需要调用基类的构造函数,且此基类构造函数是有参数的; 4、类里面有其他类类型的成员,且这个“其他类”的构造函数是有参数的。 举个例子:设想你有一个类成员,它本身是一个类或者结构,而且只有一个带一个参数的构造函数。 classCExampleOld { public: CExampleOld(int x) { ... } }; 因为CExampleOld有一个显式声明的构造函数,编译器不产生一个缺省构造函数(不带参数),所以没有一个整数就无法创建CExampleOld的一个实例。 CExampleOld* pEO = new CExampleOld; // 出错!! CExampleOld* pEO = new CExampleOld(2); // OK 如果CExampleOld是另一个类的成员,你怎样初始化它呢?答案是你必须使用成员初始化列表。 class CExampleNew { CExampleOldm_EO; public: CExampleNew(); }; // 必须使用初始化列表来初始化成员 m_EO//CExampleNew::CExampleNew() : m_EO(2) {……} 没有其它办法将参数传递给m_EO。 情况3和4其实一样的道理。如果成员是一个常量对象或者引用也是一样。根据C++的规则,常量对象和引用不能被赋值,它们只能被初始化。 初始化列表与构造函数赋值的效率比较 首先把数据成员按类型分类并分情况说明: 1.内置数据类型,复合类型(指针,引用) 在成员初始化列表和构造函数体内进行,两者在性能和结果上都是一样的 2.用户定义类型(类类型) 两者在结果上相同,但是性能上存在很大的差别。 因为编译器总是确保所有成员对象在构造函数体执行之前初始化,所以对于用户自定义类型(类),在初始化列表中只会调用类的构造函数,在构造函数体中赋值就会先调用一次类的构造函数,然后再调用一次类的赋值操作符函数。 显然后者在性能上有所损失,特别对于构造函数和赋值操作符都需要分配内存空间的情况,使用初始化列表,就可以避免不必要的多次内存分配。 举个例子:假定你有一个类CExample具有一个CString类型的成员m_str,你想把它初始化为Hi,how are you.。你有两种选择: 1、使用构造函数赋值 CExample::CExample() { // 使用赋值操作符 // CString::operator=(LPCTSTR); m_str = _T(Hi,how are you.); } 2、使用初始化列表 CExample::CExample() : m_str(_T(Hi,how are you.)) {} 编译器总是确保所有成员对象在构造函数体执行之前被初始化,因此在第一个例子中编译的代码将调用CString::Cstring来初始化m_str,这在控制到达赋值语句前完成。在第二个例子中编译器产生一个对CString:: CString(LPCTSTR)的调用并将Hi,how are you.传递给这个函数。结果是在第一个例子中调用了两个CString函数(构造函数和赋值操作符),而在第二个例子中只调用了一个函数。 在CString的例子里这是无所谓的,因为缺省构造函数是内联的,CString只是在需要时为字符串分配内存(即,当你实际赋值时)。但
您可能关注的文档
- CEO10岁小孩都该知道快乐的6个好习惯.docx
- cfdnouh铁的重要化合物说课.doc
- cforEachvarStatus属性.doc
- Cf刷稀有永久角色方法.doc
- CF如何帮自己刷经验等级.doc
- cf战队名字格式设计.doc
- CF手游新地图幽灵模式:失落的遗迹玩法.docx
- CF手游超级生化模式打法介绍两种模式区别讲解.docx
- CF比CSOL好的N大理由.docx
- CF穿越火线游戏名字大全.doc
- 广东省广州省实验中学教育集团2025-2026学年八年级上学期期中考试物理试题(解析版).docx
- 广东省广州大学附属中学2025-2026学年八年级上学期奥班期中物理试题(解析版).docx
- 广东省广州市第八十六中学2025-2026学年八年级上学期期中物理试题(含答案).docx
- 广东省广州市第八十九中学2025-2026学年八年级上学期期中考试物理试题(解析版).docx
- 广东省广州市第二中学2025-2026学年八年级上学期期中考试物理试题(含答案).docx
- 广东省广州市第八十六中学2025-2026学年八年级上学期期中物理试题(解析版).docx
- 广东省广州市第八十九中学2025-2026学年八年级上学期期中考试物理试题(含答案).docx
- 广东省广州市第二中学2025-2026学年八年级上学期期中考试物理试题(解析版).docx
- 2026《中国人寿上海分公司营销员培训体系优化研究》18000字.docx
- 《生物探究性实验教学》中小学教师资格模拟试题.docx
最近下载
- 肺隔离症诊疗指南(2025年版).docx
- 2021届贵州省遵义市高三年级第一次统考物理试卷含答案.pdf VIP
- 精品解析:北京市海淀区2025-2026学年九年级上学期期末考试物理试题(解析版).docx VIP
- 2025年山西省中考数学备考全指南(知识点归纳,必考知识点、真题模拟试卷及解析).docx VIP
- 心血管疾病的风险评估与管理课件.pptx VIP
- 离婚协议书(2026官方标准版).docx VIP
- HG_T 3706-2014 工业用孔网钢骨架聚乙烯复合管.doc VIP
- 湖北省学位英语考试真题2023.pdf VIP
- 船舶焊接 垂直气电焊 垂直气电焊.ppt VIP
- 2024湖北省学位英语考试真题及答案.docx VIP
原创力文档

文档评论(0)