1

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

MyPoly mp = MyPoly(arr , 4); 

MyPoly copy;
copy = mp;

但是当我写这个时:

MyPoly mp = MyPoly(arr , 4); 

MyPoly copy = mp;

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

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

4

4 回答 4

8

这条线

MyPoly copy = mp;

是一个复制初始化,所以它不调用赋值运算符(你称之为“相等运算符”),而是调用具有签名的复制构造函数

MyPoly(const MyPoly&); 

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

于 2012-09-06T11:52:57.427 回答
4

MyPoly copy = mp;

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

MyPoly copy(mp);

直接初始化

MyPoly copy;
copy = mp;

赋值

于 2012-09-06T11:52:10.827 回答
3
MyPoly mp = MyPoly(arr , 4); 

MyPoly copy = mp;

来电copy c-tor,不行operator =。在这copy initialization两种情况下都是如此。

于 2012-09-06T11:52:06.787 回答
-1
MyPoly copy = mp;

是相同的:

MPoly copy(mp);

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

于 2012-09-06T11:51:54.693 回答