我有一个MyPoly类,我实现了自己的等号运算符(=)。 当我尝试这个代码时,一切正常,我的实现=被调用。
MyPoly mp = MyPoly(arr , 4);
MyPoly copy;
copy = mp;
但是当我写这篇文章时:
MyPoly mp = MyPoly(arr , 4);
MyPoly copy = mp;
它不使用我的implements =,然后在调用析构函数时出现运行时错误。
有人可以解释为什么这些代码不同吗?
答案 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);
在中,它调用复制构造函数而不是赋值运算符。在赋值运算符旁边创建一个复制构造函数总是一个好主意。