C++细节思考
在其他很多语言(比如Java、C#)中,成员变量的初始化应该都是放在构造函数的函数体里的。但是C++中提倡的是通过初始化列表(initializer list)的方式初始化成员变量,这两者之间有什么区别吗?我们来写个例子测试一下:
class Member {
public:Member() { std::cout << "constructor" << std::endl; }Member(int x) { std::cout << "constructor, x=" << x << std::endl; }
};class A {
public:A() : m(100) {}
private:Member m;
};int main() {A a;
}
输出结果:
constructor, x=100
destructor
看起来符合预期,对不对?现在我改成在构造函数体里初始化的方式:
class A {
public:A() { m = Member(100); }
private:Member m;
};
你会惊奇的发现,输出的结果有所不同:
constructor
constructor, x=100
destructor
这个Member成员变量被创建了2次!第1次是用空构造函数创建的,然后在执行A的构造函数的时候又用Member的带参数的构造函数创建了一遍。显然,这种方式的性能是比较低的,因此在C++中,应尽量使用初始化列表的方式初始化成员变量。