Ada*_*enz 6 c++ oop constructor initialization
通过直接初始化传递临时对象来初始化对象时我有些困惑.
这是我想要了解的代码:
class Foo {
public:
Foo() { cout << "ctor()\n"; }
Foo(int) { cout << "ctor(int)\n"; }
Foo(const Foo&) { cout << "cpy-ctor\n"; }
Foo& operator=(const Foo&) { cout << "copy-assignment\n"; return *this; }
};
int main() {
Foo();// ctor (temporary object). it is not a function prototype because it requires a return type.
cout << endl;
Foo f; // ctor()
cout << endl;
Foo f2(Foo(7)); // ctor only once
cout << endl;
Foo f3(Foo(Foo(7))); // ctor(int), cpy-ctor() only once
cout << endl;
Foo f4(Foo(Foo(Foo(7)))); // ctor(int), cpy-ctor() only once
cout << endl;
Foo f5(Foo(Foo(Foo(Foo(7))))); // ctor(int), cpy-ctor(), cpy-ctor
cout << endl;
}
Run Code Online (Sandbox Code Playgroud)
Foo();.在Foo f;调用默认ctor 的第二个调用中没有新内容.
Foo(Foo(7))我认为编译器会创建一个临时对象,然后将其传递给复制构造函数来构造对象,f2但它只调用一个参数构造函数Foo(int).这是否意味着编译器应用一些优化来删除不必要的副本?
现在Foo f3(Foo(Foo(7)));它在调用ctor和cpy-ctor,但为什么呢?同样的f4,虽然它有所不同?
最后只Foo f5(Foo(Foo(Foo(Foo(7)))));调用一次ctor和cpy-ctor两次?
我想知道究竟发生了什么,我也尝试了相同的代码,没有优化和不同的级别,但结果是一样的.谢谢.