目录一、什么是初始化列表二、初始化列表和函数体内赋值有什么区别三、哪些成员必须使用初始化列表1. const 成员变量2. 引用成员变量3. 没有默认构造函数的自定义类型成员四、初始化顺序五、小结一、什么是初始化列表在C中构造函数除了可以在函数体内给成员变量赋值也可以使用初始化列表。普通写法class Date { public: Date(int year, int month, int day) { _year year; _month month; _day day; } private: int _year; int _month; int _day; };初始化列表写法class Date { public: Date(int year, int month, int day) ; _year(year) , _month(month) , _day(day) { } private: int _year; int _month; int _day; };初始化列表写在构造函数参数列表后面以冒号 : 开始多个成员之间用逗号分隔。二、初始化列表和函数体内赋值有什么区别函数体内写_year year;本是上是赋值。初始化列表写: _year(year)本质上是初始化。简单理解初始化列表成员函数创建时直接初始化 函数体内赋值成员变量创建后再赋值对于普通变量 int、char、double成员你两种写法很多时候结果一样。但有些成员必须使用初始化列表。三、哪些成员必须使用初始化列表主要有三类1. const 成员变量 2. 引用成员变量 3. 没有默认构造函数的自定义类型成员1. const 成员变量class A { public: A(int x) : _x(x) { } private: const int _x; };const 成员变量创建后不能修改所以必须在初始化列表中初始化。2. 引用成员变量class A { public: A(int x) : _ref(x) { } private: int _ref; };引用必须在定义时初始化所以引用成员也必须使用初始化列表。3. 没有默认构造函数的自定义类型成员class B { public: B(int x) : _x(x) { } private: int _x; }; class A { public: A(int x) : _b(x) { } private: B _b; };因为 B 没有无参构造函数所以 A 中的 _b 必须在初始化列表中显式初始化。四、初始化顺序成员变量的初始化顺序不是看初始化列表中的书写顺序而是看成员变量在类中的声明顺序。例如class A { public: A(int x) : _a1(x) , _a2(_a1) { } private: int _a2; int _a1; };虽然初始化列表中先写 _a1但成员变量声明时 _a2 在前所以实际会先初始化 _a2。因此建议初始化列表的书写顺序和成员变量的声明顺序保持一致。这样代码更清晰也不容易出错。五、小结本篇主要学习了构造函数初始化列表。需要记住初始化列表写在构造函数参数列表后面初始化列表以 : 开始多个成员变量之间用逗号隔开函数体内是赋值初始化列表才是初始化const 成员变量必须使用初始化列表引用成员变量必须使用初始化列表没有默认构造函数的自定义类型成员必须使用初始化类表成员变量初始化顺序由声明顺序决定初始化列表书写顺序建议和成员声明顺序保持一致建议优先使用初始化列表写构造函数。初始化列表是构造函数中的重要内容。理解它之后才能更好的处理 const 成员、引用成员和自定义类型成员的初始化问题。
C++学习笔记24:构造函数初始化列表
发布时间:2026/5/23 0:45:10
目录一、什么是初始化列表二、初始化列表和函数体内赋值有什么区别三、哪些成员必须使用初始化列表1. const 成员变量2. 引用成员变量3. 没有默认构造函数的自定义类型成员四、初始化顺序五、小结一、什么是初始化列表在C中构造函数除了可以在函数体内给成员变量赋值也可以使用初始化列表。普通写法class Date { public: Date(int year, int month, int day) { _year year; _month month; _day day; } private: int _year; int _month; int _day; };初始化列表写法class Date { public: Date(int year, int month, int day) ; _year(year) , _month(month) , _day(day) { } private: int _year; int _month; int _day; };初始化列表写在构造函数参数列表后面以冒号 : 开始多个成员之间用逗号分隔。二、初始化列表和函数体内赋值有什么区别函数体内写_year year;本是上是赋值。初始化列表写: _year(year)本质上是初始化。简单理解初始化列表成员函数创建时直接初始化 函数体内赋值成员变量创建后再赋值对于普通变量 int、char、double成员你两种写法很多时候结果一样。但有些成员必须使用初始化列表。三、哪些成员必须使用初始化列表主要有三类1. const 成员变量 2. 引用成员变量 3. 没有默认构造函数的自定义类型成员1. const 成员变量class A { public: A(int x) : _x(x) { } private: const int _x; };const 成员变量创建后不能修改所以必须在初始化列表中初始化。2. 引用成员变量class A { public: A(int x) : _ref(x) { } private: int _ref; };引用必须在定义时初始化所以引用成员也必须使用初始化列表。3. 没有默认构造函数的自定义类型成员class B { public: B(int x) : _x(x) { } private: int _x; }; class A { public: A(int x) : _b(x) { } private: B _b; };因为 B 没有无参构造函数所以 A 中的 _b 必须在初始化列表中显式初始化。四、初始化顺序成员变量的初始化顺序不是看初始化列表中的书写顺序而是看成员变量在类中的声明顺序。例如class A { public: A(int x) : _a1(x) , _a2(_a1) { } private: int _a2; int _a1; };虽然初始化列表中先写 _a1但成员变量声明时 _a2 在前所以实际会先初始化 _a2。因此建议初始化列表的书写顺序和成员变量的声明顺序保持一致。这样代码更清晰也不容易出错。五、小结本篇主要学习了构造函数初始化列表。需要记住初始化列表写在构造函数参数列表后面初始化列表以 : 开始多个成员变量之间用逗号隔开函数体内是赋值初始化列表才是初始化const 成员变量必须使用初始化列表引用成员变量必须使用初始化列表没有默认构造函数的自定义类型成员必须使用初始化类表成员变量初始化顺序由声明顺序决定初始化列表书写顺序建议和成员声明顺序保持一致建议优先使用初始化列表写构造函数。初始化列表是构造函数中的重要内容。理解它之后才能更好的处理 const 成员、引用成员和自定义类型成员的初始化问题。