从函数返回对象时,是否调用C ++中的复制构造函数?

时间:2009-03-20 11:41:35

标签: c++ constructor copy-constructor

我理解在三个实例上调用复制构造函数

  1. 实例化一个对象并使用另一个对象的值初始化它时。
  2. 按值传递对象时。
  3. 第3。按值从函数返回对象时。

    我对3号有疑问 如果在返回对象值时调用了复制构造函数,那么如果在函数中本地声明了对象,则不应该产生问题。

    我的意思是复制构造函数是一个深拷贝,并将对象的引用作为参数

5 个答案:

答案 0 :(得分:17)

它被称为完全避免问题。作为结果的新对象从本地定义的对象初始化,然后本地定义的对象被销毁。

如果是深度复制用户定义的构造函数,它们都是一样的。为将作为结果的对象分配第一个存储,然后调用复制构造函数。它使用传递的引用来访问本地定义的对象,并复制新对象所需的内容。

答案 1 :(得分:12)

复制在被调用函数退出之前完成,并将当时存在的局部变量复制到返回值中。

被调用的函数可以访问返回值占用的内存,即使该内存在复制时不在“范围内”,它仍然可用。

答案 2 :(得分:5)

根据an answer我的问题,复制构造函数可能被称为甚至两次:一次将本地对象复制到返回'对象',一次复制返回对象在它被分配给的变量上。

然而,它不需要!编译器可以优化两种复制结构。

答案 3 :(得分:0)

不,它在本地人被摧毁之前调用它。您可以使用记录销毁和复制构造的对象,或通过查看生成的汇编代码来测试它。

答案 4 :(得分:-1)

有三种常见情况需要调用复制构造函数:

  1. 实例化一个对象并使用另一个对象(相同类型)的值初始化它时。
  2. 按值传递对象时。
  3. 按值从函数返回对象时。