首页 > 解决方案 > 为什么不将临时对象传递给对象初始化调用复制构造函数?

问题描述

我对通过直接初始化传递临时对象来初始化对象有些困惑。

这是我想理解的代码:

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 f;在调用默认 ctor的第二次调用中没有任何新内容。

这是否意味着编译器应用了一些优化来删除不必要的副本?

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

标签: c++oopconstructorinitialization

解决方案


推荐阅读