复制构造函数在哪一行被调用

At which line is the copy constructor called?

本文关键字:一行 调用 构造函数 复制      更新时间:2023-10-16

我有几行代码,我不明白为什么以及在哪里调用复制构造函数。你能给我解释一下吗?

输出为:

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?

在这个函数中

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

语句

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

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

实际上它看起来像

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

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

  1. 作用域——函数不能看到自身和关联的命名空间之外的东西。如果要将变量传递给函数,则需要将其保存在全局环境中,然后推入作用域的副本,然后对其进行操作。
  2. 当你使用引用传递时,你对全局拷贝进行操作,但由于在这种情况下,你返回的是指向的值,而不是指针,你必须将返回值单独推到堆栈上,因为它存储在一个不同的临时寄存器地址,该地址在你将其分配给main中的永久位置后从堆栈中弹出。这就是析构函数的作用。
  3. 您创建了一个临时返回值来传递函数的值,因此必须删除它,因为L1, L2和L3缓存都是主要的房地产。

我强烈建议阅读一些汇编代码的操作,甚至尝试将简单的程序编译成汇编,看看底层语言是如何工作的。干杯!