1. 就地初始化、初始化列表
在C++中,成员变量可以通过就地初始化和初始化列表进行初始化。
-
就地初始化:在C++11及更高版本中,可以在声明成员变量时直接进行初始化。例如:
class MyClass { public:int x = 5; // 就地初始化 };
这样,在创建
MyClass
类的对象时,x
成员变量会被初始化为5。 -
初始化列表:在构造函数中使用初始化列表来初始化成员变量。例如:
class MyClass { public:int x;MyClass() : x(5) {} // 初始化列表 };
在这个例子中,构造函数
MyClass()
使用初始化列表: x(5)
来初始化x
成员变量为5。初始化列表可以在构造函数的参数列表之后使用冒号:
开始,并按照成员变量的声明顺序列出初始化语句。
通常来说,就地初始化更为简洁,而初始化列表则更为灵活,可以在构造函数中对多个成员变量进行复杂的初始化操作。
2. 必须使用初始化列表的场景
有一些情况下,必须使用初始化列表对成员变量进行初始化,而不能使用就地初始化或在构造函数内进行赋值操作。这些情况通常涉及到成员变量是 const
类型、引用类型或者属于基类的情况。下面分别举例说明:
-
const
类型成员变量:const
类型的成员变量必须在对象构造时进行初始化,并且只能通过初始化列表来初始化。class MyClass { public:const int x;MyClass(int value) : x(value) {} // 必须使用初始化列表 };
-
引用类型成员变量:引用类型成员变量必须在对象构造时绑定到一个对象,因此只能通过初始化列表来初始化。
class MyClass { public:int& x;MyClass(int& ref) : x(ref) {} // 必须使用初始化列表 };
-
基类成员变量:如果类中包含一个基类,而基类没有默认构造函数,那么在派生类的构造函数中必须使用初始化列表来调用基类的构造函数。
class Base { public:Base(int value) {} };class Derived : public Base { public:Derived(int value) : Base(value) {} // 必须使用初始化列表 };
在这些情况下,使用初始化列表是必须的,因为这些特殊类型的成员变量在对象构造时需要特殊处理,而且它们不能在构造函数的函数体内进行赋值。