【发布时间】:2013-09-04 01:42:33
【问题描述】:
我的程序使用了一个简单的结构Rect,它被定义为
struct Rect {
int x1, y1, x2, y2;
Rect()
: x1(0), y1(0), x2(0), y2(0) { }
Rect(int x1, int y1, int x2, int y2)
: x1(x1), y1(y1), x2(x2), y2(y2) { }
};
我应该定义一个复制/移动构造函数还是一个赋值运算符,或者我可以依靠编译器来自动生成它们吗?问题在于速度和使用原因(例如,移动构造函数会影响程序执行速度)。
构造函数和操作符都是非常重复的工作,如果能依赖编译器自动生成就好了。
Rect(const Rect& r)
: x1(r.x1), y1(r.y1), x2(r.x2), y2(r.y2) { }
Rect(Rect&& r)
: x1(r.x1), y1(r.y1), x2(r.x2), y2(r.y2) { }
Rect& operator = (const Rect& r) {
x1 = r.x1;
y1 = r.y1;
x2 = r.x2;
y2 = r.y2;
}
【问题讨论】:
-
你应该让编译器生成的构造函数和赋值运算符来完成它们的工作,因为你的类不需要做任何资源管理。但是在您的情况下,移动构造函数或赋值运算符没有任何好处。
-
因为你的类没有任何指针(这可能导致潜在的副作用),看起来默认的应该没问题。
-
你应该完全让编译器来做。它保证是正确的,而您的手动代码不是:例如,
operator =应该是return *this;。
标签: c++ c++11 copy-constructor move-semantics assignment-operator