安全使用编译器生成的赋值运算符?
我使用MFC中的CPoint类。 没有明确定义的赋值运算符或复制构造函数(AFAIK)。 然而,这是有效的:
CPoint p1(1, 2), p2; p2 = p1; // p2 now is equal to p1
我假设这是自动工作的,因为编译器生成的赋值运算符。 正确?
如果是这样,我能确信这不会出乎意料吗? 在这种情况下,CPoint非常简单,我认为一切都很好,但总的来说,这让我很担心。 做更好的形式是:
p2.SetPoint(p1.x, p2.x);
-cr
这是安全的 - 如果一个赋值操作符不能被提供,那么MFC设计者可以确保它不可用(例如,通过私有)。
IIRC编译器将执行逐个成员的副本,因此对于包含像这样的POD的类,您将不会遇到问题。 如果您有一个分配内存的类并忽略覆盖operator =并执行深度复制,它会变得杂乱无章。
FWIW我问了一个关于编译器可以什么又不能回头的问题:
为什么C ++编译器不定义运算符==和运算符!=?
其中一些答案有助于阅读。
查找默认拷贝构造函数:
http://www.fredosaurus.com/notes-cpp/oop-condestructors/copyconstructors.html
这不是关于CPoint的特殊事情。
如果一个类是“简单的”,那么编译器生成的赋值运算符将工作(成员复制)。 如果有一些成员需要更高级的逻辑(假设对象维护一个指向它所期望的私有缓冲区的内部指针),那么编译器生成的赋值运算符将会出现问题。 CPoint
只存储一个点的x和y坐标,所以你不应该遇到问题。
上一篇: Safe to use the compiler generated assignment operator?
下一篇: Is this a safe way to implement a generic operator== and operator<?