我理解当我要将现有对象初始化为新创建的对象时,称为复制构造函数。
我有一个小查询,
#include<iostream.h>
using namespace std;
class Base
{
int* m;
public:
Base(int p)
{
m = new int(p);
}
Base(const Base& obj)
{
m = new int(*obj.m);
}
Base operator=(const Base& obj1)
{
m = new int(*obj1.m);
}
~Base()
{
delete m;
}
};
int main()
{
Base b(10);
Base a = b;
b = a;
return 0;
}
为什么我应该Base a = b;
或何时会出现这种情况?或者我应该在哪里打电话?
答案 0 :(得分:0)
Base a = b; // equal to Base a(b);
它与复制构造函数一样,实际上它是复制初始化。这与作为作业的a = b;
不同。在构造函数中,正在创建对象,您只需要分配资源,但在赋值中已经存在一个对象,因此如果要分配新资源,则应释放以前的资源:
Base operator=(const Base& obj1)
{
m = new int(*obj1.m);
}
此代码由于取消释放之前的m
而导致内存泄漏。而且它应该返回一些东西。由于您的代码只能在内存中的一个单元格中运行,因此此代码应如下所示:
Base &operator=(const Base& obj1)
{
*m = *obj1.m;
return *this;
}