c++ 类的成员初始化
c++ 类的成员初始化
- 成员变量初始化
- 基类初始化
成员变量初始化
对于类成员变量的初始化,成员初始化列表比在构造函数体内赋值更高效。
class MyClass
{
public:// 方式1:成员初始化列表(推荐)MyClass() : num(10), str("hello") {}// 方式2:构造函数体内赋值(效率较低)MyClass() {num = 10; // 这里实际是赋值操作,不是初始化str = "hello"; // 先调用默认构造函数,再调用赋值运算符}private:int num;std::string str;
};
对于非 POD 类型的成员变量(如 std::string, 自定义类等),使用初始化列表可以避免不必要的默认构造+赋值的开销:
class Performance
{
public:// 高效:直接调用 std::string 的构造函数Performance() : str("hello") {}// 低效:先调用默认构造函数生成空字符串,再赋值Performance() { str = "hello"; }private:std::string str;
};
对于以下类型的成员变量,必须使用初始化列表:const 常量成员, 引用成员, 没有默认构造函数的类类型成员
class MustUseInitializerList
{
public:MustUseInitializerList(int& ref) : const_value(42), // const 成员必须初始化my_ref(ref), // 引用成员必须初始化no_default_ctor(100) // 没有默认构造函数的成员必须初始化{}private:const int const_value;int& my_ref;class NoDefault {public:NoDefault(int x) {} // 没有默认构造函数} no_default_ctor;
};
基类初始化
当你的类继承自基类时,必须在成员初始化列表中调用基类的构造函数:
class Base
{
public:Base(int value) { /* ... */ }
};class Derived : public Base
{
public:// 正确:通过初始化列表调用基类构造函数Derived() : Base(42) { /* ... */ }// 错误:若基类没有默认构造函数,这样写会编译失败// Derived() { /* 这里无法调用 Base 的构造函数 */ }
};