C ++ operator =问题

时间:2012-09-06 11:49:49

标签: c++ operators

我有一个MyPoly类,我实现了自己的等号运算符(=)。 当我尝试这个代码时,一切正常,我的实现=被调用。

MyPoly mp = MyPoly(arr , 4); 

MyPoly copy;
copy = mp;

但是当我写这篇文章时:

MyPoly mp = MyPoly(arr , 4); 

MyPoly copy = mp;

它不使用我的implements =,然后在调用析构函数时出现运行时错误。

有人可以解释为什么这些代码不同吗?

4 个答案:

答案 0 :(得分:8)

这一行

MyPoly copy = mp;

复制初始化,因此它不会调用赋值运算符(您称之为“等运算符”),而是复制构造函数,它具有签名

MyPoly(const MyPoly&); 

并由编译器生成,除非您提供自己的。至于运行时错误,您需要提供更多代码。但我可以推测,既然你已经编写了自己的赋值运算符,那么你可能正在处理一些动态分配的资源,在这种情况下你应该遵循rule of three并实现你自己的拷贝构造函数和析构函数。如果你有C ++ 11支持,你应该将它扩展到rule of 5并提供你自己的移动复制构造函数和移动赋值运算符。

答案 1 :(得分:4)

MyPoly copy = mp;

不是作业,而是复制初始化。它使用复制构造函数,而不是赋值运算符。

MyPoly copy(mp);

直接初始化

MyPoly copy;
copy = mp;

作业

答案 2 :(得分:3)

MyPoly mp = MyPoly(arr , 4); 

MyPoly copy = mp;

致电copy c-tor,而不是operator =。在这两种情况下都是copy initialization

答案 3 :(得分:-1)

MyPoly copy = mp;

与:

相同
MPoly copy(mp);

在中,它调用复制构造函数而不是赋值运算符。在赋值运算符旁边创建一个复制构造函数总是一个好主意。