C++中用赋值形式op=取代单独形式op
大多数程序员认为,如果他们能写出这样的代码:
x = x+y;x = x-y;
然后他们也可以这样写:
x+= y;x-= y;
如果x和y是用户定义的类型,这是不能保证的。就C++而言,operator+,operator=和operator+=,这三个运算符之间是没有关系的,所以如果希望这三个运算符同时存在,并且有所期望的关系,就必须自己实现。同样,运算符-、*、/等也是如此。
为了确保运算符的赋值版本(例如operator+=)和运算符的独立形式(例如operator+)之间存在正常关系,一个好的方法是根据前者实现后者(参见第6条)。这很简单:
class Rational {
public:
...
Rational & operator+=(const Rational & RHS);
Rational & operator-=(const Rational & RHS);
};
// operator+根据operator+=,实现;
//有关返回值为何为const的解释,
//请参见《有效C++》第21页和第109页上关于实现的警告
const Rational运算符+(const Rational& lhs,const Rational & RHS)
{
return Rational(lhs)+= RHS;
}
//运算符-根据运算符-=
const Rational运算符-(const Rational& lhs,const Rational & RHS)
{
return Rational(lhs)-= RHS;
}
在这个例子中,operator+=和-=是从头开始实现的,而operator+和operator-通过调用前面提到的函数来提供自己的函数。使用这种设计方法,只需要维护运算符的赋值形式。而如果假设operator的赋值形式在类的公共接口中,就没有必要把operator的单独形式做成类的友(见有效C++的第19条)。
如果您不介意将所有不同形式的运算符放在全局域中,您可以使用模板而不是以不同形式编写函数:
template
const T运算符+(const T& lhs,const T & RHS)
{
return T(lhs)+= RHS;//参见下面的讨论
}
template
const T运算符-(const T& lhs,const T & RHS)
{
return T(lhs)-= RHS;//参见下面的讨论
}
...
使用这些模板,只要为操作员分配表单定义了某种类型,一旦需要,就会自动生成其对应的操作员单独表单。
位律师回复
0条评论