【发布时间】:2017-12-19 09:34:16
【问题描述】:
我的课看起来像
class A{
double a, b, c, d, e;
float af, bf, cf, df, ef;
std::vector<double> av, bv, cv, dv, ev;
std::vector<std::vector<double>> avv, bvv, cvv, dvv, evv;
A(){}
A(/*init values*/){/*Initialize all the values above using the input values*/}
~A(){}
}
现在我想实现一个赋值运算符,这样我可以(在第二类中):
class B{
private:
A ac, bc, dc;
public:
B(/*init values*/)
{
ac = A(/*init values*/);
bc = A(/*init values*/);
dc = A(/*init values*/);
}
~B(){}
}
我知道我可以关注What is the copy-and-swap idiom?和What are the basic rules and idioms for operator overloading?并实施
A& A::operator=(A rhs)
{
swap(rhs);
return *this;
}
以及各自的swap-function:
friend void swap(A& first, A& second)
{
using std::swap;
swap(/*for each element*/);
}
对所有元素都这样做很容易忘记一个元素,从而导致代码错误。未来的扩展也是如此,即在类头中添加变量,但不在交换函数中。有没有更简单的方法来做到这一点?
【问题讨论】:
-
你知道赋值运算符不用自己写,但是编译器生成的就可以了?
-
所有元素都是具有正确值语义的类型。你儿子不需要自己实现任何这些功能。编译器非常有能力。
-
你也可以移除析构函数。最好说
A() = default;而不是A() {}。 -
如果你添加一个需要它的成员,你也需要实现所有这些成员函数。 Read about the rule of 5.
-
@arc_lupus 是的,它会使你的代码明显变慢,因为它使你的类不可移动。