成员初始值设定项列表的使用如何防止在 C++ 中创建冗余对象?
How usage of member initializer list prevents creation of redundant object in c++?
我有一个关于使用和不使用构造函数成员初始化列表初始化对象的区别的问题。
在下面的代码片段中有两个classes Test1
和Test2
每个都有两个构造函数,这两个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
我的问题
- 为什么
Test2
的对象创建了两次? (没有成员初始化器创建的那个。)
Test2
的冗余对象发生了什么?它是否仍然占用一些内存?
- 成员初始化器列表在初始化 class 成员变量时如何工作?
- 使用成员初始值设定项列表是否有任何性能优势? (因为 Test1 只创建了一次)
您的 Example
构造函数(隐含地)等同于
Example() : objTest1(Test1(50)), objTest2()
{
objTest2 = Test2(50);
}
即objTest2
对象隐式构造并初始化一次(这是编译器插入的)。
然后你在体内显式构造并初始化一个临时Test2
对象,用于分配到objTest2
.
另请注意,在初始化列表中 objTest1(Test1(50))
构造一个临时 Test1
对象,并将其传递给 copy-constructor 以初始化 objTest1
(虽然大多数编译器应该省略这个复制)。您可以将其简化为简单的 objTest1(50)
.
我有一个关于使用和不使用构造函数成员初始化列表初始化对象的区别的问题。
在下面的代码片段中有两个classes Test1
和Test2
每个都有两个构造函数,这两个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
我的问题
- 为什么
Test2
的对象创建了两次? (没有成员初始化器创建的那个。) Test2
的冗余对象发生了什么?它是否仍然占用一些内存?- 成员初始化器列表在初始化 class 成员变量时如何工作?
- 使用成员初始值设定项列表是否有任何性能优势? (因为 Test1 只创建了一次)
您的 Example
构造函数(隐含地)等同于
Example() : objTest1(Test1(50)), objTest2()
{
objTest2 = Test2(50);
}
即objTest2
对象隐式构造并初始化一次(这是编译器插入的)。
然后你在体内显式构造并初始化一个临时Test2
对象,用于分配到objTest2
.
另请注意,在初始化列表中 objTest1(Test1(50))
构造一个临时 Test1
对象,并将其传递给 copy-constructor 以初始化 objTest1
(虽然大多数编译器应该省略这个复制)。您可以将其简化为简单的 objTest1(50)
.