复制构造函数在哪一行被调用
At which line is the copy constructor called?
我有几行代码,我不明白为什么以及在哪里调用复制构造函数。你能给我解释一下吗?
输出为:
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;
在考虑何时调用复制构造函数时,您应该记住以下几点:
- 作用域——函数不能看到自身和关联的命名空间之外的东西。如果要将变量传递给函数,则需要将其保存在全局环境中,然后推入作用域的副本,然后对其进行操作。
- 当你使用引用传递时,你对全局拷贝进行操作,但由于在这种情况下,你返回的是指向的值,而不是指针,你必须将返回值单独推到堆栈上,因为它存储在一个不同的临时寄存器地址,该地址在你将其分配给main中的永久位置后从堆栈中弹出。这就是析构函数的作用。
- 您创建了一个临时返回值来传递函数的值,因此必须删除它,因为L1, L2和L3缓存都是主要的房地产。
我强烈建议阅读一些汇编代码的操作,甚至尝试将简单的程序编译成汇编,看看底层语言是如何工作的。干杯!
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 用c++从输入文件中读取另一行
- 读取文件的最后一行并输入到链接列表时出错
- 如何使用运算符在同一行中多次调用函数
- uncrustify:如何将多行 C 函数调用的参数组合到一行上?
- 为什么在同一行上有 2 个函数调用时跳过函数调用
- 如何在函数调用的一行代码中实例化类
- 如何使c++函数每次被调用时都写在输出文件的最后一行
- 在一行中调用3个递归
- 我怎么知道哪个函数或文件,哪一行调用了一个函数
- 为什么在最后一行也没有调用复制构造函数
- 有没有办法用一行在同一对象上调用多个函数
- 复制构造函数在哪一行被调用
- 如何使clang-format不将多行调用加入到一行中
- 一行中函数调用的执行顺序-未定义
- c++中,在调用函数的同一行不更新的引用变量传递