c++中重载二元关系运算符的正确方法
Proper way of overloading binary relational operators in C++
c++中重载二元关系运算符的正确/规范方式是什么?
是使用成员函数,还是 friend
自由函数更好?
例如:
class X {
public:
...
// Use member function overloads
bool operator==(const X& rhs) const {
return m_text == rhs.m_text;
}
private:
std::string m_text;
};
或:
class X {
public:
...
// Use friend free function overloads
friend bool operator==(const X& lhs, const X& rhs) {
return lhs.m_text == rhs.m_text;
}
private:
std::string m_text;
};
没有太大区别,除了
-
X
的实例必须位于相等操作符的左侧才能使成员版本生效。如果你想写X x("hello"); string s("hello"); assert(s == x);
-
如果你实现了所有的二元关系运算符,那么你的类的表面积可能会有很大的增加。
我通常希望这种辅助接口在可能的情况下与主类逻辑分开(当然,除非你的类主要关心的是比较)。
使用非友元自由操作符和最小的公共接口可能更好。
您应该注意的一件事是隐式转换。
如果你的类支持其他类型的隐式转换,那么将operator==设为好友,以支持在其第一个参数上进行隐式转换可能会很有用。
在其他情况下,我认为更多的是风格的问题。
相关文章:
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- 使用类型id运算符的最佳替代方法
- C++运算符 - 方法
- "operator()"在重载运算符方法中是什么意思,在priority_queue(STL)中用作C++中的比较器?
- 一种优雅或至少可行的方法,用于使用和接受具有重载方法和运算符的不同大小的文字数组常量
- 类方法的C++插入运算符
- 将方法委托给成员的重写运算符>
- 矢量擦除方法是否需要类才能具有 = 运算符?
- 使用新运算符C++创建多维数组的简单方法
- std::is_invocable 用于测试任意方法是否存在的语法(不仅是运算符())
- 使输出流式处理运算符适用于 boost::variant<std::vector<int>、int、double 的正确方法是什么>
- 使用运算符和类后方法名称
- 让类与运算符一起工作更简单的方法
- 运算符重载C++、(+、-、*、/ 等)有没有比复制、替换和粘贴更聪明的方法?
- std::map 索引运算符与插入方法的性能
- 使用范围解析运算符时,在构造函数中调用虚拟方法是否安全?
- 使用类中的方法作为运算符将值分配给类的私有成员
- 基方法/运算符在派生 (C++) 上调用时返回基类型
- 具有继承的重载方法/运算符不起作用