2012-09-06 54 views
1

我有一个MyPoly类,我实现了我自己的等号运算符(=)。 当我尝试这段代码时,一切正常,我正在执行=正在调用。C++运算符=问题

MyPoly mp = MyPoly(arr , 4); 

MyPoly copy; 
copy = mp; 

但是,当我写这篇文章:

MyPoly mp = MyPoly(arr , 4); 

MyPoly copy = mp; 

它不使用我的执行=,然后当调用析构函数,我得到一个运行时错误。

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

+1

我想在第二种情况下,使用复制构造函数而不是赋值运算符。 – vstm

+1

我要离开了,所以我没有时间给出完整的答案,但这是由于不幸的事实,即C++为*赋值*(第一种情况)和*初始化*(第二种情况)使用符号“=” )。 –

回答

8

此行

MyPoly copy = mp; 

拷贝初始化,所以它不会调用赋值运算符(你是指什么是“等于经营者”),而是拷贝构造函数,它有签名

MyPoly(const MyPoly&); 

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

+0

伟大的答案,谢谢。 – oopsi

-1
MyPoly copy = mp; 

是一样的:

MPoly copy(mp); 

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

+0

不!他们不一样。 –

+0

http:// stackoverflow。com/questions/11222076/why-is-copy-constructor-called-instead-of-conversion-constructor –

+0

http://stackoverflow.com/questions/1051379/is-there-a-difference-in-c-between- copy-initialization-and-direct-initializati – jrok

3
MyPoly mp = MyPoly(arr , 4); 

MyPoly copy = mp; 

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

4

MyPoly copy = mp; 

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

MyPoly copy(mp); 

直接初始化

MyPoly copy; 
copy = mp; 

分配