C++ 初学者常遇到的初始化列表(Initializer List)问题,主要发生在以下场景:
当类包含构造函数和析构函数时,C++ 规定必须使用初始化列表。这是因为构造函数和析构函数不能自动调用,需要初始化列表明确列出这些函数的参数。
例如:
class MyClass {
public:
MyClass() : m_value(42) {}
~MyClass() {}
private:
int m_value;
};
如果类没有拷贝构造函数和赋值运算符,编译器将默认生成一个,但编译器生成的拷贝构造函数和赋值运算符通常没有考虑初始化和赋值操作。如果类需要自定义拷贝构造函数和赋值运算符,则必须在类定义中显式声明,并使用初始化列表。
例如:
class MyClass {
public:
MyClass(const MyClass& other) : m_value(other.m_value) {}
MyClass& operator=(const MyClass& other) {
m_value = other.m_value;
return *this;
}
private:
int m_value;
};
new
运算符创建对象当使用 new
运算符创建对象时,如果类没有默认构造函数,编译器会生成一个构造函数。如果类有自定义构造函数,则必须使用初始化列表。
例如:
MyClass* obj = new MyClass(); // 使用自定义构造函数
new
运算符创建对象,同时初始化当使用 new
运算符创建对象,并同时初始化对象时,必须使用初始化列表。
例如:
MyClass* obj = new MyClass(42); // 使用自定义构造函数和初始化列表
总之,当类包含构造函数和析构函数,类无拷贝构造函数和赋值运算符,使用 new
运算符创建对象,或同时初始化对象时,必须使用初始化列表。
领取专属 10元无门槛券
手把手带您无忧上云