gpt4 book ai didi

c++ - 如何控制返回对象的拷贝到新对象中?

转载 作者:行者123 更新时间:2023-11-30 02:43:08 26 4
gpt4 key购买 nike

在此代码中,operator = 被重载以控制类 A 对象的运算符行为,并且还声明了复制构造函数以查看它是否用于复制过程。

我的问题是,如果没有使用复制构造函数和赋值运算符,编译器使用什么将 a_object + b_object 的返回对象复制到 c_object 中,如输出?以及如何控制这种情况下的复制行为?

#include <iostream>


#define PUTLINE(X) std::cout<<X<<"----------------------------\n" ;

class A{
int value ;
public:
A(int v = 0) : value(v) {}

A(const A & a)
{
std::cout << "copy constructor...\n" ;
value = a.value ;
}
const A & operator = (const A & a) {
std::cout << " = operator... \n" ;
this->value = a.value ;
return *this ;
}

const A operator + (const A & a) {
return A(value + a.value) ;
}

void print(std::ostream & os) {
os << value << std::endl ;
}
};


int main () {
A a_object(10);
A b_object(20);
PUTLINE(1);
A c_object = a_object + b_object ; // what does the compiler use to make this copy?
PUTLINE(2);
A d_object = c_object;
PUTLINE(3);
c_object.print(std::cout);
PUTLINE(4);
d_object.print(std::cout);
PUTLINE(5);
a_object = c_object ;
PUTLINE(6);
a_object.print(std::cout);
}

输出看起来像这样:

1----------------------------
2----------------------------
copy constructor...
3----------------------------
30
4----------------------------
30
5----------------------------
= operator...
6----------------------------
30

最佳答案

您遇到了 copy elisionreturn value optimisation (RVO) .在某些情况下,允许编译器直接在目标空间中构造返回的对象,而无需创建临时对象并从中进行复制。

这正是您的情况:operator+ 的返回值直接在 c_object 的空间中使用 (int) 构造函数,因此您看不到对复制构造函数的调用。

使用 GCC,您可以传递命令行标志 -fno-elide-constructors,以防止复制省略。然后你会看到所有的复制构造函数调用。 Live example .

关于c++ - 如何控制返回对象的拷贝到新对象中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26438799/

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