C++ 为什么在我实际复制到C+;中已创建的对象时仍调用复制构造函数+;?

C++ 为什么在我实际复制到C+;中已创建的对象时仍调用复制构造函数+;?,c++,copy-constructor,C++,Copy Constructor,我写了下面的代码,我不明白为什么要调用复制构造函数 #include <iostream> using namespace std; class abc { public: abc() { cout << "in Construcutor" << (this) << endl; }; ~abc() { cou

我写了下面的代码,我不明白为什么要调用复制构造函数

#include <iostream>

using namespace std;

class abc
{
    public:
        abc()
        {
            cout << "in Construcutor" << (this) << endl;
        };

        ~abc()
        {
            cout << "in Destrucutor" << (this) << endl;
        };

        abc(const abc &obj)
        {
            cout << "in copy constructor" << (this) << endl;
            cout << "in copy constructor src " << &obj << endl;
        }

        abc& operator=(const abc &obj)
        {
            cout << "in operator =" << (this) << endl;
            cout << "in operator = src " << &obj << endl;
        }
};

abc myfunc()
{
    static abc tmp;

    return tmp;
}

int main()
{
    abc obj1;

    obj1 = myfunc();

    cout << "OK. I got here" << endl;
}
我不明白为什么在我实际分配对象时调用复制构造函数


如果我在
myfunc()
中声明
abc tmp
,而不是
static abc tmp
,则不会调用复制构造函数。任何人都可以帮我理解这里发生了什么。

因为您通过值从
myfunc
返回一个对象,这意味着它正在被复制


如果未在
myfunc
中使对象
静态
,则不会调用复制构造函数的原因是和(又称RVO)。请注意,即使您的复制构造函数可能没有被调用,它仍然必须存在。

因为复制构造函数正是这样做的。我一直认为优化是为了优化幕后的东西。RVO似乎通过可能省略构造函数而彻底改变了程序。为什么标准允许这种实现定义的行为,而不强制执行RVO或根本不强制执行RVO?@cad在返回非静态对象的情况下,该对象无论如何都会被销毁,为什么要在可以省略复制的情况下复制它呢?如果复制构造函数除了实际复制数据(如打印输出)之外还有一些副作用,那么它确实会产生影响,但在其他方面则不会。必须“正确地”复制
静态
局部变量,因为调用后它仍然存在。至于为什么标准不强制或禁止RVO,在最初的标准制定时,我认为一些实施者可能难以实现它(这意味着强制执行会很困难),但它可以提供巨大的性能增强(这意味着禁止它是令人讨厌的)。允许(但不要求)复制构造函数+析构函数省略是一个很好的折衷方案。(我相信有人建议在即将发布的标准版本中强制执行RVO。)该标准说(不是用这么多的话)允许编译器假设复制构造函数和复制赋值执行(并且只执行)这些操作并相应地优化。这样做的好处是,你永远不应该依靠这些操作来做任何其他事情,除非你同意不做(优化了)。
in Construcutor0xbff0e6fe
in Construcutor0x804a100
in copy constructor0xbff0e6ff
in copy constructor src 0x804a100
in operator =0xbff0e6fe
in operator = src 0xbff0e6ff
in Destrucutor0xbff0e6ff
OK. I got here
in Destrucutor0xbff0e6fe
in Destrucutor0x804a100