C++ 复制构造函数说明

C++ 复制构造函数说明,c++,C++,我知道,当我要将现有对象初始化为新创建的对象时,这个对象称为复制构造函数 我有一个小问题 #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); }

我知道,当我要将现有对象初始化为新创建的对象时,这个对象称为复制构造函数

我有一个小问题

#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;
}
#包括
使用名称空间std;
阶级基础
{
int*m;
公众:
基本(INTP)
{
m=新的整数(p);
}
基础(常数基础和obj)
{
m=新整数(*obj.m);
}
基本运算符=(常量基本和对象J1)
{
m=新整数(*obj1.m);
}
~Base()
{
删除m;
}
};
int main()
{
碱基b(10);
基数a=b;
b=a;
返回0;
}
这里我为什么要做
Base a=b或此场景何时发生?或者我应该打电话到哪里

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;
}

您需要一个
返回*this用于赋值运算符。通常最好返回一个引用而不是副本:
Base&operator=(…){foo;return*this;}
您能澄清一下您的问题吗?详细说明Juan的观点:“为什么要做
Base a=b
”是什么意思?你的意思是用a(b)
代替a(b)
?或者你指的是别的什么?一个
操作符=()
如何区分复制初始化和赋值呢
正在创建一个
,紧接着它正在初始化。它是复制初始化,它将调用复制构造函数而不是赋值。