C++ 运算符== 重载

标签 c++ operator-overloading

<分区>

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 ...>”内容和参数....

关于C++ 运算符== 重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10070020/

相关文章:

c++ - 为什么STL中List的迭代器使用的是(*node).data而不是node->data?

c++ - 当名称出现在函数的 declarator-id 之前时,查找规则是什么?

c++ - 显式调用基本复制构造函数 => RTTI 信息丢失。漏洞?

c++ - 如何指示某个类不支持某些运算符?

c++ - `void operator=(T&&)` 和 `T& operator=(T&&)` 有什么区别?

c++ - "operator !="应该始终通过 C++ 中的 "operator =="实现吗?

java - Java 中是否存在运算符重载?

c++ - 如何向具有一个中央小部件的 QMainWindow 添加滚动条?

c++ - 这些错误是什么意思?

c++ - 内部模板类型 std::vector<std::vector<T>> 的函数模板重载或专门化