1.介绍:
初始化成员列表是 C++ 中的一种构造函数语法,允许在对象构造时直接初始化类的成员变量,而不是先默认初始化再赋值
2.用法:
ClassName(参数列表) : 成员1(参数1), 成员2(参数2), ... {// 构造函数体
}
(1)冒号 : 后面是初始化成员列表。
(2)每个成员用括号 () 或大括号 {} 直接初始化。
(3)成员的初始化顺序与类中声明的顺序一致,而不是在初始化列表中书写的顺序。
例如:
class MyClass {int x;int y;
public:MyClass() : y(2), x(1) {} // x 会先被初始化,然后 y 初始化
};
3. 作用
(1)初始化列表可以直接构造成员变量,避免了默认构造和赋值的两步操作,减少了性能开销;对于简单的内置类型(如 int、double),区别不大;但对于复杂类型(如自定义类或 STL 容器),效率提升明显。
(2)const 和引用成员变量只能通过初始化列表进行初始化,不能在构造函数体内赋值。
例如:
class MyClass {const int value; // 常量int& ref; // 引用
public:MyClass(int v, int& r) : value(v), ref(r) {} // 必须用初始化列表
};
4. 区别
初始化成员列表&构造函数体内赋值
特性 | 初始化成员列表 | 构造函数体内赋值 |
---|---|---|
效率 | 更高,因为直接初始化 | 较低,可能有额外的默认构造和赋值 |
支持 const 或引用 | 支持 | 不支持 |
适用性 | 更推荐,特别是有复杂类型成员时 | 可用于简单类型,但不建议 |
初始化成员列表
class MyClass {
private:int x;std::string name;public:// 构造函数使用成员初始化列表MyClass(int val, const std::string& str) : x(val), name(str) {// 构造函数体内通常没有做任何操作}
};
构造函数体内赋值
class MyClass {
private:int x;std::string name;public:// 构造函数使用构造函数体内赋值MyClass(int val, const std::string& str) {// 构造函数体内赋值x = val;name = str;}
};