成员初始值设定项列表的使用如何防止在 C++ 中创建冗余对象?

How usage of member initializer list prevents creation of redundant object in c++?

我有一个关于使用和不使用构造函数成员初始化列表初始化对象的区别的问题。

在下面的代码片段中有两个classes Test1Test2每个都有两个构造函数,这两个classes的对象是在默认情况下创建的另一个 class Example 的构造函数。 Test1 的对象是使用成员初始化列表中的一个参数创建的,而 Test2 的对象是使用 Example.

的构造函数主体中的一个参数创建的
class Test1 {
public:
    Test1()      { cout << "Test1 is created with no argument"; }
    Test1(int a) { cout << "Test1 is created with 1 argument"; }
};

class Test2 {
public:
    Test2()      { cout << "Test2 is created with no argument"; }
    Test2(int a) { cout << "Test2 is created with 1 argument"; }
};

class Example {
public:
    Test1 objTest1;
    Test2 objTest2;

    Example() : objTest1(Test1(50)) 
    {
            objTest2 = Test2(50);
    }
};

int main() 
{
    Example e;
}

以上代码的输出是:

Test1 is created with 1 argument

Test2 is created with no argument

Test2 is created with 1 argument

我的问题

您的 Example 构造函数(隐含地)等同于

Example() : objTest1(Test1(50)), objTest2()
{
        objTest2 = Test2(50);
}

objTest2对象隐式构造并初始化一次(这是编译器插入的)。

然后你在体内显式构造并初始化一个临时Test2对象,用于分配objTest2.


另请注意,在初始化列表中 objTest1(Test1(50)) 构造一个临时 Test1 对象,并将其传递给 copy-constructor 以初始化 objTest1(虽然大多数编译器应该省略这个复制)。您可以将其简化为简单的 objTest1(50).