我正在阅读C ++中的复制构造函数
有人提到,一个对象通过值传递,并且按值返回构造一个用户从未见过的临时对象。我的理解是,当我们用val调用时,例如
myclass b;
void myfunc(myclass c) {} //c(b) copy constructor is called.
创建临时对象的位置?
谢谢!
答案 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个。
有关详细说明,请阅读以下内容: