C++中用赋值形式op=取代单独形式op

C++中用赋值形式op=取代单独形式op,第1张

C++中用赋值形式op=取代单独形式op,第2张

大多数程序员认为,如果他们能写出这样的代码:

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;//参见下面的讨论
}
...

使用这些模板,只要为操作员分配表单定义了某种类型,一旦需要,就会自动生成其对应的操作员单独表单。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » C++中用赋值形式op=取代单独形式op

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情