初始化列表
- 电脑硬件
- 2025-09-20 13:42:02

一:声明,定义,赋值的区别
①:声明
这里,int _year; int _month;int _day; 是成员变量的声明,它们告诉编译器:
类 Date中有三个成员变量_year和 _month和_day。
它们的类型分别都是 int
此时,编译器并没有为 a 和 b 分配内存,因为类的定义只是一个蓝图,只有在创建类的对象时,才会为这些成员变量分配内存。
②:定义
int main() { Date d1;//这叫定义 return 0; }成员变量的定义实际上发生在创建类的对象时,当创建 Date 的对象 d1 时,编译器会为 d1 的成员变量分配内存。这时成员变量才真正被定义(即分配了内存空间)。
③:赋值
在构造函数体内这里,构造函数体内通过赋值操作改变成员变量的值
二:为何要有初始化列表有三种值,必须在定义的时候立刻赋予初始值 如下:
A:那意思是我们之前的构造函数的体内不叫立刻赋予初始值?
Q:是的,构造函数体内对成员变量的操作不叫“立刻赋予初始值”,而是赋值,因为构造函数体内的操作是在成员变量已经存在(已经分配内存)后,再改变它们的值,这叫作赋值。
为什么这三种值必须在定义时立马初始化?
这些成员变量的特性决定了它们必须在定义时立马初始化:
常量成员变量(const):
常量一旦初始化后,其值不能被修改。
因此,必须在定义时赋予初始值。
引用成员变量:
引用必须在定义时绑定到一个对象,且之后不能重新绑定。
因此,必须在定义时赋予初始值。
没有默认构造函数的类类型成员变量:
如果类没有默认构造函数,则必须通过参数化构造函数初始化。
因此,必须在定义时赋予初始值。
所以C++创建一个叫初始化列表,初始化列表会让这三种值在定义的时候就能被立刻赋予初始值
初始化列表:以一个冒号开始,逗号间隔的数据成员列表。
class MyClass { public: MyClass(int x, int& r, int m) : a(x), ref(r), member(m) //冒号开始,逗号间隔 { // 正确:使用初始化列表初始化 } private: const int a; // 常量成员变量 int& ref; // 引用成员变量 MyMemberClass member; // 没有默认构造函数的类类型成员变量 }; 三: 初始化列表的注意事项① :每个成员变量再初始化列表中只能出现一次,即 初始化只能初始化一次
MyClass(int x, int& r, int m) : a(x), a(x),ref(r), member(m) //只能出现一次!!! { }②:成员变量在类中的声明顺序就是在初始化列表中的初始化顺序,与其在初始化列表中出现的顺序无关。
用一道题来理解②:
class A { public: A(int a) :_a1(a) , _a2(_a1) // 先执行它 {} void Print() { cout << _a1 << " " << _a2 << endl; } private: int _a2; // _a2 先声明 int _a1; }; int main() { A aa(1); aa.Print(); }此时的结果是:
解释:
因为我们先声明的是 _a2,所以在初始化列表里我们先初始化的是 _a2,因为这里是 _a2(_a1), _a1 此时还是没有得到传过去的 1,所以此时_a1还是随机值,所以 _a2 就被初始化成随机值了。按照声明顺序然后是 _a1, _a1 接收到了1,自然会初始化成 1,最后按顺序打印c 1 和 随机值。
上一篇
网络流算法:Dinic算法
下一篇
Linux---共享内存