C++ 在哪一行调用复制构造函数?
我有几行代码,但不知道调用复制构造函数的原因和位置。你能给我解释一下吗 输出为: CS10 CS99 CC100 Obj10=Obj100 D100 Obj10=Obj99 D99 D10 这是我的源代码: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" <
#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!我没有注意到它是通过值返回的。我以为它是通过引用返回的,但没有注意到它被取消引用。:/感谢您的解释。