重载相等运算符==时,应先检查引用相等性
When overloading the equality operator==, should one check for reference equality first?
当重载运算符==(),我目前做
bool operator==(const X& lhs, const X& rhs)
{
return &lhs == &rhs || /* member comparisons ... */;
}
这意味着我首先检查对象的引用相等性,然后检查所有成员的相等性。这是"正确"的方式吗?有什么需要记住的陷阱或事情吗?这种实现是最有效的方法吗?
自我比较通常很少见,除非你是一个不可变的内部 pImpl,通常只在常规包装器发生std::hash
碰撞后通过unordered_
容器中的==
进行比较,或者类似的东西。
针对极少数情况进行优化通常是一个坏主意。 它增加了代码的复杂性,并增加了测试开销。
如果比较昂贵或无限昂贵,则可能存在异常,因此开始时指针比较失败的成本微不足道。 另一个例外是自我比较异常昂贵,而几乎自我比较(几乎同样昂贵)非常罕见,而自我比较有时会发生。
简短的回答是,保持代码简单,担心大阶爆炸,不要不必要的悲观,并在实际注意到性能问题后进行优化(即使它只是"哇,这很慢",或者蒙特卡罗分析)。
相关文章:
- C/C++ 取消引用错误:在空检查之前取消引用
- 使用 python 绑定来检查 C++ 类型是否是规范方式的指针、引用等?
- 特征:返回对具有编译时间尺寸检查的矩阵块的引用
- 如何检查给定类型的变量是否可以取消引用
- 如何检查一个名称是否与另一个名称引用相同的符号
- std::is_pointer检查通用引用
- 我可以根据null或特定类型的值检查引用吗
- 检查指针是否为null,然后在同一if语句中取消引用它,这样安全吗
- C ++安全地通过引用传递,并编译时检查大小
- cppcheck null指针取消引用:m_buffer-否则,针对null进行检查是多余的
- 类型特征:检查引用成员变量是否是静态的
- 检查实例是否存在,并在Singleton getInstance();中返回引用;
- 可以检查空取消引用的调试软件
- 当函数重新调整通过引用传递时检查对象是否存在
- 重载相等运算符==时,应先检查引用相等性
- 智能指针:通过引用设置、重置、设置null、null检查或重置检查
- C++:检查地址是否被引用
- 如何在取消引用之前检查迭代器(C++)
- 通过引用或指针返回并检查是否为空
- 检查引用元组是否为默认可构造时出错