我正在使用MFC的CPoint类。没有明确定义的赋值运算符或复制构造函数(AFAIK)。然而,这有效:
CPoint p1(1, 2), p2; p2 = p1; // p2 now is equal to p1
由于编译器生成的赋值运算符,我假设这是自动运行的。正确的吗?
如果是这样,我可以确信这没有做出任何意想不到的事吗?在这种情况下,CPoint是如此简单,我认为一切都很好,但总的来说这是让我担心的事情。这是更好的形式:
p2.SetPoint(p1.x, p2.x);
-cr
答案 0 :(得分:4)
这是安全的 - 如果不打算提供赋值运算符,那么MFC设计者可以确保它不可用(例如将其设为私有)。
FWIW我问了一个关于编译器可以做什么和不能做什么的问题:
Why don't C++ compilers define operator== and operator!=?
有些答案会引起有趣的阅读。
答案 1 :(得分:3)
查找默认的复制构造函数:
http://www.fredosaurus.com/notes-cpp/oop-condestructors/copyconstructors.html
关于CPoint这不是一件特别的事。
答案 2 :(得分:1)
如果一个类是“简单”,那么编译器生成的赋值运算符将起作用(成员复制)。如果有一些成员需要更高级的逻辑(假设对象维护了一个指向它所期望的私有缓冲区的内部指针),那么编译器生成的赋值运算符就会出现问题。 CPoint
只存储一个点的x和y坐标,因此不应该遇到问题。
答案 3 :(得分:0)
我不知道MFC,但我可以猜测(或者):
答案 4 :(得分:0)
内置复制赋值运算符只是使用其复制赋值运算符依次复制每个成员。我认为没有查看其文档对CPoint是安全的(原因:如果不是,他们会提供自己的实现,当然)。那个点类应该只有两个成员(x和y),那些只是浮点数(或int取决于它的用途)。
有人说这是一个“浅层副本”,因为只复制了成员的值。如果有指针成员,则复制指针值,而不是指针指向的对象。
答案 5 :(得分:0)
对于像CPoint这样的简单数据对象(您可以从Visual Studio安装中包含的MFC源中看到它只是一个Win32 POINT结构,其中添加了一些便利功能),使用编译器生成没有任何问题赋值运算符。
但是正如已经提到的,默认赋值运算符是一个浅表副本,如果结构包含指针(或者包含不包含赋值运算符的指针的结构),则会让您遇到麻烦。由于CPoint不符合该描述,因此是安全的。
答案 6 :(得分:0)
是。如果在类上没有定义operator=
方法,则编译器会为您生成一个只能对类中的字段进行按位复制的方法。我记得,CPoint
仅仅是{int x; int y}
,因此按位复制很好。