作者:787849993_8c653d | 来源:互联网 | 2024-12-26 14:19
本文深入探讨了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 <