C++中重载赋值构造函数的问题!!

在下面部分代码中,我实现一个集合类,可与另外一个集合进行并、交、差运算,并返回结果的集合。但使用拷贝构造C集合的时候,程序可以正常运行,如果使用赋值构造(如下),C集合则... 在下面部分代码中,我实现一个集合类,可与另外一个集合进行并、交、差运算,并返回结果的集合。但使用拷贝构造C集合的时候,程序可以正常运行,如果使用赋值构造(如下),C集合则是空的。求解!
#include<iostream>
using namespace std;
class mSet //我的集合类
{
struct Node
{
int data;
Node *next;
};
private:
Node *head; //头节点
int size; //链表长度
public:
mSet (); //构造函数
~mSet(); //析构
mSet& operator=(const mSet &another); //赋值构造函数声明

void Show()const; //将该集合内的元素输出到屏幕上

mSet Bing(mSet &B); //并运算
mSet Jiao(mSet &B); //交运算
mSet Cha(mSet &B); //差运算
};
mSet mSet::operator=(const mSet &another) //赋值构造函数定义
{
this->~mSet();
if(another.head->next==NULL)
{
mSet();
return *this;
}
head=new Node;
head->next=NULL;

Node* newnode,*p,*last;
p=another.head->next;
last=head;
while(p!=NULL)
{
newnode=new Node;
newnode->data=p->data;
newnode->next=NULL;
last->next=newnode;
last=newnode;
p=p->next;
}
return *this;
}

int main()
{
mSet A,B,C; //A和B的数据已经输入,略过该部分代码
C=A.Bing(B);
C.Show();
}
展开
 我来答
DoramiHe
2018-04-04 · 知道合伙人互联网行家
DoramiHe
知道合伙人互联网行家
采纳数:25332 获赞数:59543
2011年中山职业技术学院毕业,现担任毅衣公司京东小二

向TA提问 私信TA
展开全部
赋值运算符和复制构造函数都是用已存在的B对象来创建另一个对象A。不同之处在于:赋值运算符处理两个已有对象,即赋值前B应该是存在的;复制构造函数是生成一个全新的对象,即调用复制构造函数之前A不存在。
CTemp a(b); //复制构造函数,C++风格的初始化
CTemp a=b; //仍然是复制构造函数,不过这种风格只是为了与C兼容,与上面的效果一样
在这之前a不存在,或者说还未构造好。
CTemp a;
a=b; //赋值运算符
在这之前a已经通过默认构造函数构造完成。
而之所以要自定义这些,是因为防止有指针时浅拷贝造成错误。具体可百度 rule of three原则
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式