2012-04-09 144 views
6

可能重复:
Operator overloadingC++运算符重载==

什么是通过以下方式重载运营商之间的差异==?

// stroustrup way 
friend bool operator== (MyClass &lhs, MyClass &rhs); 

// as taught in other places, including caltech 
bool MyClass::operator== (MyClass &rhs); 

哪种方式更好?

+3

您可以在[运算符重载常见问题解答](http://stackoverflow.com/questions/4421706/operator-overloading)中找到此问题的答案:) – 2012-04-09 07:05:36

+0

FAQ说:“二进制中缀比较运算符根据经验法则,应该将其作为非成员函数来实现“,但它不能证明为什么存在此规则 - http://stackoverflow.com/questions/4421706/operator-overloading/4421719#4421719 – danio 2014-02-05 11:10:30

回答

1

此:

friend bool operator== (MyClass &lhs, MyClass &rhs); 

是一个函数,其比较两个对象。

此:

bool MyClass::operator== (MyClass &rhs); 

是一个成员函数。

你应该使用你的编码标准提出的那个,或者使用你喜欢的。没有更好的了。有些人(包括我自己)喜欢将比较运算符作为函数,其他人则更喜欢将其作为成员函数。

顺便说一下,参数应该是const MyClass &类型。

2

首先是外部的好友功能(无功能)

friend bool operator== (MyClass &lhs, MyClass &rhs); 

二是成员函数

bool MyClass::operator== (MyClass &rhs); 

您应该使用第二个变体总是那么你可以

你应该先用变体案例: 1)第一个参数是外部(库)类

friend ostream& operator<< (ostream &out, MyClass &m) 

2)运营商的逻辑不相关的类,必须单独实施

friend bool operator(const MyClass& my, const std::string& string_form) 

(因为你的类不能知道,可能需要比较运营商所有关于班)

+0

-1 :对不起,但是我的答案中解释了一般首选变体。 – 2012-04-09 07:28:21

3
// stroustrup way 
friend bool operator== (MyClass &lhs, MyClass &rhs); 

参数应为const - friend bool operator==(const MyClass& lhs, const MyClass& rhs);。这是首选,因为它可以隐式构建第一个参数。例如,如果std::string只有成员函数operator==,那么"abc" == my_std_string将不会调用它!但是,非成员函数可以通过隐式地从“abc”构造一个字符串来调用(更好的是,在这种特殊情况下,可以出于性能原因提供单独的bool operator==(const char*, const std::string&),但是该点仍然存在 - 非成员函数可以帮助确保该操作员在任一侧使用用户定义类型)。

另外,隐式的构造函数有点危险 - 你想要考虑使用它们的便利性与危险性。