c ++:实现相等的方法 - 如何确保给定的对象与此不同?

时间:2012-01-11 15:31:45

标签: c++

请考虑以下代码段:

bool SomeObject::equal(const SomeObject& rhs) const
{
  if (this == &rhs)
  {
    return true;
  }

  // check the state
}

此代码的问题是SomeObject可能会覆盖operator&(或者有人可能会在将来添加它),这反过来可能会破坏此实现。

是否可以测试rhs*this是否是同一个对象而不受operator&实施的支配?

4 个答案:

答案 0 :(得分:18)

如果您想获取对象的实际地址并忽略重载的&运算符,请使用std::addressof

bool SomeObject::equal(const SomeObject& rhs) const
{
  if (this == std::addressof(rhs))
  {
    return true;
  }

  // check the state
}

参考:http://en.cppreference.com/w/cpp/memory/addressof

答案 1 :(得分:3)

C ++ 11中有一个std::addressof函数可以做你想要的。

如果您想自己实现它,可以使用转换为其他类型:

(SomeClass*)&reinterpret_cast<char&>(rhs)

然而,我不会打扰; const equals函数应该适用于相同的参数。

答案 2 :(得分:0)

如果您完全删除了这个条件怎么办?有人会多久将一个物体与自身进行比较?如果您通常需要检查所有数据成员,那么这个简单的比较只会浪费一般情况下的时间。只要两个物体在物理上是相同的(并且你的功能是const,所以你应该没问题),那么在极少数情况下做一些额外的工作有什么害处?

答案 3 :(得分:-2)

只需将指针传递给SomeObject而不是引用,因此您不需要&amp;运营商了。

它希望如此:

bool SomeObject::equal(const SomeObject* rhs) const
{
    if ( this == rhs )
    {
         return true;
    }
    //...
}