哪一行是复制构造函数?

时间:2014-07-03 18:43:05

标签: c++ copy-constructor

我有几行代码而且我没有得到,为什么以及在哪里调用复制构造函数。你能解释一下吗?

输出结果为:

  

CS10

     

CS99

     

CC100

     

Obj10 = Obj100

     

D100

     

Obj10 = Obj99

     

D99

     

D10

这是我的源代码:

#include <iostream>

using namespace std;

class my
{
    int m;
public:
    my(int i): m(i)
    {
        cout << "CS" << m << endl;
    }
    my(const my& c): m(c.m+1)
    {
        cout << "CC" << m << endl;
    }
    ~my()
    {
        cout << "D" << m << endl;
    }
    my& operator=(const my &c)
    {
        cout << "Obj" << m << "=Obj" << c.m << endl;
        return *this;
    }
};

my f(my* x)
{
    return *x;
}

int main()
{
    my m1(10);
    my m2(99);

    m1 = f(&m2); // creates a new object
    m1 = m2;     // does not create a new object
}

为什么以及在哪里复制构造函数调用导致输出CC100和D100?

2 个答案:

答案 0 :(得分:3)

在此功能中

my f(my* x)
{
    return *x;
}

在声明

中调用
m1 = f(&m2); // creates a new object

调用复制构造函数来复制返回临时对象中的object *。

实际上它看起来像

my tmp = *x; // the copy constructor is called
m1 = tmp;

答案 1 :(得分:0)

当试图考虑何时调用复制构造函数时,您应该记住以下几点:

  1. 范围 - 功能无法在自身及其相关命名空间之外查看。如果要将变量传递给函数,需要将其保存在全局环境中,请重新映射作用域副本,然后对其进行操作。
  2. 当您使用按引用传递时,您对全局副本进行操作但是在这种情况下,您将返回指向的值而不是指针,您必须将该返回值分别推送到堆栈,因为它存储在将其分配给main中的永久位置后,从堆栈弹出的不同临时寄存器地址。这就是析构函数的来源。
  3. 您创建了一个临时返回值以将值传递出您的函数,因此它必须被删除,因为L1,L2和L3缓存都是主要的不动产。
  4. 我强烈建议您稍微阅读汇编代码操作,甚至尝试将简单程序编译成汇编程序,并了解低级语言的工作原理。干杯!