gpt4 book ai didi

c++ - 按值返回是调用复制构造函数还是复制赋值运算符?

转载 作者:行者123 更新时间:2023-11-28 02:16:50 24 4
gpt4 key购买 nike

假设在编译器中没有返回值优化。
在c++中,当函数中的对象按值返回时,真正的步骤如下,我说的对吗?完全,第三次调用构造函数。

local(normal constuctor) --> temp(copy constructor) ---> outside(copy constructor or copy assignemt operator)

  1. 创建了一个本地对象,这里调用普通构造函数;
  2. 使用本地对象创建临时对象,这里调用拷贝构造函数;
  3. 将临时对象赋值给外面的真实对象(a),这里调用拷贝构造函数(case1)或拷贝赋值运算符(case2)
class Name{...};

Name func(){
// ...
Name local;
return local;
}

案例1:

Name outside  = func(); // call copy constructor?

案例2:

Name outside;
outside = func(); // call copy assignment operator?

如果我在第一部分是对的,如果启用返回值优化会怎样?

最佳答案

这个问题让我思考,所以从这个意义上说这是一个很好的问题。我在“调试”模式下在 Visual Studio C++ Express 2010 上运行了下面的测试代码。

#include <iostream>

using namespace std;

class Foo
{
public:
Foo(int arg) { val = arg; cout<<"Constructor (normal): "<<val<<endl; }
Foo(const Foo& ref) { val = ref.val; cout<<"Copy constructor: "<<val<<endl; }
const Foo& operator=(const Foo& rval)
{
cout<<"Assignment operator from object "<<rval.val<<" to object "<<val<<endl;
val = rval.val;
return *this;
}


int val;
};

Foo process() {Foo t(2); return t; }

int main()
{
Foo a(1);
a = process();

system("pause");
return 0;
}

结果:

    Constructor (normal): 1    Constructor (normal): 2    Copy constructor: 2    Assignment operator from object 2 to object 1    Press any key to continue . . .

所以情况 2 似乎是正确的。在构造外部“Foo”之后,在函数内部构造“Foo”对象。然后用复制构造函数创建另一个对象,最后调用赋值运算符将结果复制到对象a。

返回值优化将取决于编译器和设置。例如,当我在 Release模式下构建和运行时,没有调用复制构造函数,表明临时对象仅用于 Debug模式。 (我不是这方面的专家。)

关于c++ - 按值返回是调用复制构造函数还是复制赋值运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33795529/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com