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