C++ 在哪一行调用复制构造函数?

C++ 在哪一行调用复制构造函数?,c++,copy-constructor,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" <

我有几行代码,但不知道调用复制构造函数的原因和位置。你能给我解释一下吗

输出为:

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
}
#包括
使用名称空间std;
我的班级
{
int m;
公众:
my(int i):m(i)
{
在这个函数中cout

my f(my* x)
{
    return *x;
}
在声明中要求

m1 = f(&m2); // creates a new object
调用复制构造函数来复制返回临时对象中的对象*x

事实上看起来

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

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

  • 作用域-函数无法看到自身及其关联命名空间的外部。如果要将变量传递给函数,需要将其保存在全局环境中,请重新刷新作用域副本,然后对其进行操作
  • 当您使用引用传递时,您对全局副本进行操作,但由于在这种情况下,您返回的是指向的值而不是指针,因此必须将该返回值单独推送到堆栈上,因为它存储在不同的临时寄存器地址,在您将其分配给永久loca后,该临时寄存器地址从堆栈弹出主要是破坏,这就是析构函数的作用
  • 您创建了一个临时返回值来传递函数中的值,因此必须删除它,因为一级缓存、二级缓存和三级缓存都是主要的不动产

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

    当从函数中按值返回
    my
    时。啊……当然……我没有注意到它被复制了……x有点让我困惑。谢谢!谢谢s!我没有注意到它是通过值返回的。我以为它是通过引用返回的,但没有注意到它被取消引用。:/感谢您的解释。