热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C++构造函数与初始化列表详解

本文深入探讨了C++中构造函数的初始化列表,包括赋值与初始化的区别、初始化列表的使用规则、静态成员初始化等内容。通过实例和调试证明,详细解释了初始化列表在对象创建时的重要性。

引言

C++中的构造函数用于在创建对象时初始化其成员变量。初始化列表是构造函数的一个重要特性,它允许我们在对象创建时对成员变量进行精确初始化。本文将详细介绍初始化列表的使用方法及其注意事项。

赋值与初始化的区别

在创建对象时,编译器会调用构造函数来为对象的成员变量提供初始值。然而,构造函数体内的语句只能称为赋初值,而不是初始化。初始化是指在变量定义时赋予初值,而赋值是在变量已经定义后给予新值。因此,构造函数体内可以多次赋值,但初始化只能发生一次。

初始化列表

初始化列表以冒号开始,接着是一个由逗号分隔的数据成员列表,每个成员变量后面跟一个放在括号中的初始值或表达式。初始化列表是对象成员变量定义的地方,确保在对象创建时正确初始化。

不能对同一个变量多次进行初始化

每个成员变量在初始化列表中只能出现一次,因为初始化只能进行一次。此外,某些类型的成员变量必须在初始化列表中初始化:

  • 引用成员变量:引用必须在定义时初始化,并且不能重新赋值。
  • const成员变量:该变量初始化后不能再赋值。
  • 自定义类型成员:如果类没有默认构造函数,则需要在初始化列表中调用其他构造函数进行初始化。

拷贝构造函数中的初始化列表

即使在拷贝构造函数中,也可以使用初始化列表来初始化成员变量。

不使用初始化列表初始化A类对象

如果不使用初始化列表定义A类对象,编译器会调用无参构造函数进行初始化。注意,编译器不会自动调用有参构造函数,除非显式传递参数。

自定义类型成员有相应默认构造函数

当自定义类型成员有默认构造函数时,编译器会自动调用该构造函数进行初始化。尽量使用初始化列表初始化,以确保自定义类型成员变量先被正确初始化。

初始化顺序

成员变量在类中声明的次序决定了它们在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关。

调试证明

通过Visual Studio 2017进行调试,验证了上述初始化顺序的规则。

类中的static成员初始化

声明为static的类成员称为静态成员,静态成员变量必须在类外进行初始化。静态成员为所有类对象所共享,不属于某个具体的实例。

C++11的新特性

C++11支持非静态成员变量在声明时进行初始化赋值,但这只是给成员变量设置缺省值,并不是真正的初始化。例如:

class Date { public: Date() : _year(10) {} void Print() { cout <<_year <<"-" <<_month <<"-" <<_day <

推荐阅读
  • 本文探讨了《魔兽世界》中红蓝两方阵营在备战阶段的策略与实现方法,通过代码展示了双方如何根据资源和兵种特性进行战士生产。 ... [详细]
  • 在多线程编程环境中,线程之间共享全局变量可能导致数据竞争和不一致性。为了解决这一问题,Linux提供了线程局部存储(TLS),使每个线程可以拥有独立的变量副本,确保线程间的数据隔离与安全。 ... [详细]
  • 本文详细介绍了 Apache Jena 库中的 Txn.executeWrite 方法,通过多个实际代码示例展示了其在不同场景下的应用,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!-----&# ... [详细]
  • 文件描述符、文件句柄与打开文件之间的关联解析
    本文详细探讨了文件描述符、文件句柄和打开文件之间的关系,通过具体示例解释了它们在操作系统中的作用及其相互影响。 ... [详细]
  • 本文详细探讨了VxWorks操作系统中双向链表和环形缓冲区的实现原理及使用方法,通过具体示例代码加深理解。 ... [详细]
  • 深入理解Java泛型:JDK 5的新特性
    本文详细介绍了Java泛型的概念及其在JDK 5中的应用,通过具体代码示例解释了泛型的引入、作用和优势。同时,探讨了泛型类、泛型方法和泛型接口的实现,并深入讲解了通配符的使用。 ... [详细]
  • Linux设备驱动程序:异步时间操作与调度机制
    本文介绍了Linux内核中的几种异步延迟操作方法,包括内核定时器、tasklet机制和工作队列。这些机制允许在未来的某个时间点执行任务,而无需阻塞当前线程,从而提高系统的响应性和效率。 ... [详细]
  • 并发编程:深入理解设计原理与优化
    本文探讨了并发编程中的关键设计原则,特别是Java内存模型(JMM)的happens-before规则及其对多线程编程的影响。文章详细介绍了DCL双重检查锁定模式的问题及解决方案,并总结了不同处理器和内存模型之间的关系,旨在为程序员提供更深入的理解和最佳实践。 ... [详细]
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • Codeforces Round #566 (Div. 2) A~F个人题解
    Dashboard-CodeforcesRound#566(Div.2)-CodeforcesA.FillingShapes题意:给你一个的表格,你 ... [详细]
  • 深入了解 Windows 窗体中的 SplitContainer 控件
    SplitContainer 控件是 Windows 窗体中的一种复合控件,由两个可调整大小的面板和一个可移动的拆分条组成。本文将详细介绍其功能、属性以及如何通过编程方式创建复杂的用户界面。 ... [详细]
  • ###问题删除目录时遇到错误提示:rm:cannotremoveusrlocaltmp’:Directorynotempty即使用rm-rf,还是会出现 ... [详细]
  • 实体映射最强工具类:MapStruct真香 ... [详细]
  • 本文介绍了几种不同的编程方法来计算从1到n的自然数之和,包括循环、递归、面向对象以及模板元编程等技术。每种方法都有其特点和适用场景。 ... [详细]
author-avatar
787849993_8c653d
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有