Possible Duplicate:
Operator overloading
以下重载 operator== 的方式有什么区别?
// stroustrup way
friend bool operator== (MyClass &lhs, MyClass &rhs);
和
// as taught in other places, including caltech
bool MyClass::operator== (MyClass &rhs);
哪种方式更好?
// 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&)
,但重点仍然存在 - 非成员函数可以帮助确保运算符(operator)在任一侧使用用户定义的类型。
另外,隐式构造函数有点危险 - 您需要认真考虑使用它们的便利性和危险性。
同样,如果你有 ObjectOfAnotherClassType == ObjectOfMyClassType
, 和 AnotherClass
拥有类型转换运算符(operator),例如 operator MyClass() const
, 然后是非成员(member)/ friend operator==
将允许 Actor 开始并能够进行比较;成员(member)operator==
表格不会。
最后一点:你只需要让非成员(member)operator==
一个friend
如果没有其他方法可以访问您需要比较的数据。否则,您可以在类外声明/定义它,可选 inline
如果您希望在可能包含在最终链接到同一可执行文件中的多个翻译单元中的 header 中实现。虽然没有太大的伤害,并使其成为 friend
是将定义放在类模板中的唯一方法,您不必在其中重复“template <typename ...>
”内容和参数....