(C++)这些重载的运算符函数有什么区别?

cv3*_*000 2 c++ overloading class function operators

下面这两种重载!=运算符的方法有什么区别.哪个更好?

Class Test  
{  
...//
private:  
int iTest

public:  
BOOL operator==(const &Test test) const;
BOOL operator!=(const &Test test) const;  
}

BOOL operator==(const &Test test) const  
{  
    return (iTest == test.iTest);  
}    

//overload function 1  
BOOL Test::operator!=(const &Test test) const  
{  
    return !operator==(test);  
}

//overload function 2  
BOOL Test::operator!=(const &Test test) const  
{  
    return (iTest != test.iTest);  
}  
Run Code Online (Sandbox Code Playgroud)

我刚刚看到函数1的语法用于调用兄弟运算符函数,并想知道是否以这种方式编写它会带来任何好处.

Uri*_*Uri 7

您的第一次重载确保即使您的实现会发生变化,调用!=您的类型也将始终提供相反的调用.====

您的第二个重载功能没有,因为可以==在将来提供任何实现并更改现有实现.

如果你想确保它!=总是与之相反==,那就去第一个(以额外函数调用为代价,无论如何都可以很好地进行内联).

这是一个很好的例子.假设你有一个Point2D带有字段x和类的类y.如果要实现==,则必须在字段x和字段上进行比较y.如果!=通过调用实现operator==,则代码更短,并且如果您移动到极坐标表示,则会更改一个函数.

当类字段发生变化时,平等测试和比较总是容易受到维护错误的影响.最大限度地减少直接访问状态的方法数量可以降低出错的风险.