为什么不将临时对象传递给对象初始化来调用复制构造函数?

时间:2019-02-08 20:23:19

标签: 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;
}
  • 正如您在上面看到的那样,在第一个调用中可以。它创建一个调用默认构造函数的右值对象。由于它不提供返回类型,因此编译器可以轻松地将其视为对象声明。 Foo();

调用默认ctor的第二个调用Foo f;中没有新内容。

  • 我对第三个调用感到困惑: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吗?

我想知道到底发生了什么,我也尝试了相同的代码,但没有进行优化,但级别不同,但结果是相同的。谢谢。

0 个答案:

没有答案