复制构造函数中的临时对象创建

时间:2011-09-26 12:39:31

标签: c++

我正在阅读C ++中的复制构造函数

有人提到,一个对象通过值传递,并且按值返回构造一个用户从未见过的临时对象。我的理解是,当我们用val调用时,例如

myclass b;

void myfunc(myclass c) {}  //c(b) copy constructor is called.

创建临时对象的位置?

谢谢!

2 个答案:

答案 0 :(得分:1)

副本是在myfunc()的功能范围内创建的。也就是说,c在整个函数的范围内,包括(并且略大于)函数体。函数返回时,即在myfunc(b);的分号处销毁副本。

答案 1 :(得分:1)

在pass-by-value的情况下, copy 被赋予参数(而不是临时),因此在您的示例中的特定代码中,将有两个对象:< / p>

myclass b;
myfunc( b ); // b is copied to argument "c" by means of the copy constructor

在按值返回的情况下,事情在代码中有点复杂:

type f() {
   type tmp;
   return tmp;     // copies into temporary (again, copy constructor)
}
int main() {
   type x = f();   // copies from temporary into x (copy constructor)
   x = f();        // copies from temporary into x (assignment operator)
}

理论上有3个type类型的对象。编译器将在调用约定定义的位置(这将是创建临时值的位置)中调用type之前为f对象创建空间,然后调用该函数并{{1在tmp内创建,它被复制到return语句中的临时。最后,临时文件将复制到f中的x变量。

但是,在许多情况下,编译器可以通过仔细选择变量的位置来优化临时值。大多数编译器将能够在前面的示例中优化3个对象中的2个。

有关详细说明,请阅读以下内容: