在C++中,成员初始化表达式列表(Member Initializer List)是一种在构造函数体内部初始化类成员的方式。它通常用于初始化那些没有默认构造函数的成员,或者需要特定初始值的成员。成员初始化表达式列表位于构造函数体的花括号 {} 之前,并紧跟在构造函数头之后。
下面是一个简单的例子来说明成员初始化表达式列表的用法:
#include <iostream>
#include <string>
class MyClass {
public:
MyClass() {
std::cout << "default constructor called." << std::endl;
};
MyClass(int value, const std::string& name)
: memberValue(value), memberName(name) { // 成员初始化表达式列表
std::cout << "Constructor called." << std::endl;
}
void print() {
std::cout << "Value: " << memberValue << ", Name: " << memberName << std::endl;
}
private:
int memberValue;
std::string memberName;
};
int main() {
MyClass obj(10, "Example"); //声明类的实例时,编译器会基于重载决策选择要调用的构造函数
MyClass other; //声明类的实例时,编译器会基于重载决策选择要调用的构造函数
obj.print();
return 0;
}
运行结果:
Constructor called.
default constructor called.
Value: 10, Name: Example
在这个例子中,MyClass 类有两个私有成员变量:memberValue 和 memberName。构造函数 MyClass(int value, const std::string& name) 使用成员初始化表达式列表来初始化这两个成员变量。在构造函数体内,使用 std::cout 输出一条消息来表明构造函数已被调用。在 main 函数中,创建一个 MyClass 对象 obj,并调用其 print 方法来打印成员变量的值。
注意,成员初始化表达式列表中的初始化顺序与成员变量在类定义中的声明顺序相同,而不是它们在初始化列表中的顺序。在某些情况下,成员之间的初始化顺序可能很重要,特别是当成员之间存在依赖关系时。
成员初始化表达式列表在性能优化方面也非常有用,因为它允许在构造函数体执行任何代码之前直接初始化成员变量。这可以避免不必要的默认构造和赋值操作,从而提高效率。