安全使用编译器生成的赋值运算符?

我使用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坐标,所以你不应该遇到问题。

链接地址: http://www.djcxy.com/p/73769.html

上一篇: Safe to use the compiler generated assignment operator?

下一篇: Is this a safe way to implement a generic operator== and operator<?