C++运算符重载==
什么是通过以下方式重载运营商之间的差异==?
// stroustrup way
friend bool operator== (MyClass &lhs, MyClass &rhs);
和
// as taught in other places, including caltech
bool MyClass::operator== (MyClass &rhs);
哪种方式更好?
此:
friend bool operator== (MyClass &lhs, MyClass &rhs);
是一个函数,其比较两个对象。
此:
bool MyClass::operator== (MyClass &rhs);
是一个成员函数。
你应该使用你的编码标准提出的那个,或者使用你喜欢的。没有更好的了。有些人(包括我自己)喜欢将比较运算符作为函数,其他人则更喜欢将其作为成员函数。
顺便说一下,参数应该是const MyClass &
类型。
首先是外部的好友功能(无功能)
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)
(因为你的类不能知道,可能需要比较运营商所有关于班)
-1 :对不起,但是我的答案中解释了一般首选变体。 – 2012-04-09 07:28:21
// 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&)
,但是该点仍然存在 - 非成员函数可以帮助确保该操作员在任一侧使用用户定义类型)。
另外,隐式的构造函数有点危险 - 你想要考虑使用它们的便利性与危险性。
您可以在[运算符重载常见问题解答](http://*.com/questions/4421706/operator-overloading)中找到此问题的答案:) – 2012-04-09 07:05:36
FAQ说:“二进制中缀比较运算符根据经验法则,应该将其作为非成员函数来实现“,但它不能证明为什么存在此规则 - http://*.com/questions/4421706/operator-overloading/4421719#4421719 – danio 2014-02-05 11:10:30