我有一个MyPoly类,我实现了我自己的等号运算符(=)。 当我尝试这段代码时,一切正常,我正在执行=正在调用。C++运算符=问题
MyPoly mp = MyPoly(arr , 4);
MyPoly copy;
copy = mp;
但是,当我写这篇文章:
MyPoly mp = MyPoly(arr , 4);
MyPoly copy = mp;
它不使用我的执行=,然后当调用析构函数,我得到一个运行时错误。
有人可以解释为什么这些代码是不同的?
我有一个MyPoly类,我实现了我自己的等号运算符(=)。 当我尝试这段代码时,一切正常,我正在执行=正在调用。C++运算符=问题
MyPoly mp = MyPoly(arr , 4);
MyPoly copy;
copy = mp;
但是,当我写这篇文章:
MyPoly mp = MyPoly(arr , 4);
MyPoly copy = mp;
它不使用我的执行=,然后当调用析构函数,我得到一个运行时错误。
有人可以解释为什么这些代码是不同的?
此行
MyPoly copy = mp;
是拷贝初始化,所以它不会调用赋值运算符(你是指什么是“等于经营者”),而是拷贝构造函数,它有签名
MyPoly(const MyPoly&);
并由编译器生成,除非您提供自己的。至于运行时错误,你需要提供更多的代码。但我可以推测,由于您已经编写了自己的赋值运算符,因此您可能正在处理一些动态分配的资源,在这种情况下,您应该遵循rule of three并实现自己的拷贝构造函数和析构函数。如果你有C++ 11的支持,你应该扩展到rule of 5,并提供你自己的移动拷贝构造函数和移动赋值操作符。
伟大的答案,谢谢。 – oopsi
MyPoly copy = mp;
是一样的:
MPoly copy(mp);
如,它调用拷贝构造函数,而不是赋值运算符。在赋值运算符旁边创建一个拷贝构造函数总是一个好主意。
不!他们不一样。 –
http:// stackoverflow。com/questions/11222076/why-is-copy-constructor-called-instead-of-conversion-constructor –
http://stackoverflow.com/questions/1051379/is-there-a-difference-in-c-between- copy-initialization-and-direct-initializati – jrok
MyPoly mp = MyPoly(arr , 4);
MyPoly copy = mp;
致电copy c-tor
而不是operator =
。这两种情况都是copy initialization
。
这
MyPoly copy = mp;
不分配,但拷贝初始化。它使用复制构造函数,而不是赋值运算符。
MyPoly copy(mp);
是直接初始化。
MyPoly copy;
copy = mp;
是分配。
我想在第二种情况下,使用复制构造函数而不是赋值运算符。 – vstm
我要离开了,所以我没有时间给出完整的答案,但这是由于不幸的事实,即C++为*赋值*(第一种情况)和*初始化*(第二种情况)使用符号“=” )。 –