6

我只是创建了一个这样的类:

class GreatClass
{
public:
    GreatClass(){cout<<"Default Constructor Called!\n";}
    GreatClass(GreatClass &gc){cout<<"Copy Constructor Called!\n";}
    GreatClass(const GreatClass &gc){cout<<"Copy Constructor (CONST) Called!\n";}
    ~GreatClass(){cout<<"Destructor Called.\n";}
    GreatClass& operator=(GreatClass& gc){cout<<"Assign Operator Called!";return gc;}
    const GreatClass& operator=(const GreatClass& gc){cout<<"Assign Operator (CONST) Called!";return gc;}
};

GreatClass f(GreatClass gc)
{
    return gc;
}

在 main() 函数中,有两个版本:

版本#1:

int main()
{
    GreatClass g1;
    GreatClass G = f(g1);
}

版本#2:

int main()
{
    GreatClass g1;
    f(g1);
}

它们都生成相同的输出:

Default Constructor Called!
Copy Constructor Called!
Copy Constructor Called!
Destructor Called.
Destructor Called.
Destructor Called.

我不明白为什么我分配f(g1)G. 此时调用了什么构造函数或运算符?

谢谢。

4

1 回答 1

13

在某些情况下,允许编译器实现省略/删除复制构造函数调用,您指定的示例是此类场景的一个很好的示例用例。不是创建一个临时对象,然后将其复制到目标对象,而是直接在目标对象中创建对象,并删除复制构造函数调用。

这种优化称为通过返回值优化的复制省略

此外,在 C++11中,通过右值引用的移动语义可能会取代 Copy 语义。即使有了移动语义,编译器仍然可以自由地应用 RVO。

于 2013-07-01T16:59:20.553 回答