14

各属性でオブジェクトを比較して、それらが同一であるかどうかを確認する関数があります。しかし、私はちょうど疑問に思っていました、それらがまったく同じオブジェクトであるかどうかをチェックするのではなく、それらのアドレスでオブジェクトを比較する方が良いでしょうか?

4

4 に答える 4

28

編集:注意:関数を正しく機能させたい場合は、関数に値(オブジェクト)を渡すことはできません。(おそらくconst)参照またはポインターのいずれかを渡す必要があります。

参照またはポインターの両方が同じオブジェクト(同一のオブジェクトではないが同じ)を指しているかどうかを知りたいだけの場合は、アドレスを比較するのが正しいことです。

bool AreEqual(const Class& a, const Class& b)
{
  return &a == &b;
}

上記のクラス&では、演算子がオーバーロードされる可能性があることに注意してください。ClassC ++ 11以降std::addressof、この事実に対処するための関数テンプレートを使用できます。

#include <memory> //std::addressof
bool AreEqual(const Class& a, const Class& b)
{
  return std::addressof(a) == std::addressof(b);
}
于 2012-09-13T09:55:06.150 に答える
16

クラスが同等性または同一性をサポートすることを目的としているかどうかを判断する必要があります。同等性は、数値などの値に典型的なプロパティです。アイデンティティは、人などのエンティティに典型的なプロパティです。

同等性は通常、クラスのデータメンバーを比較することによって決定されます。アドレスを比較することは、IDをチェックするための合理的な方法です。

于 2012-09-13T10:01:21.340 に答える
3

私はあなたが同じと等しいことを適切に区別していると思います。

同じアドレスを指す2つのポインターは、それらが同じオブジェクトを指していることを意味します。つまり、同じアドレスは同じオブジェクトを意味し、したがって等しいことを意味します(ただし、等しいということは、複数のオブジェクトについて話している場合にのみ意味があります)。

同じ属性が必ずしも同じオブジェクトを意味するわけではありません。たとえば、「JohnDoe」という同じ名前の2人のユーザーを持つことができます。それらを表すオブジェクトはまだ異なるオブジェクトであるため、互換的に使用することはできません。ただし、Pointクラスがある場合、の2つの異なるインスタンスは{1, 2}実際には同じものを表し、交換可能に使用できます。

値オブジェクト参照オブジェクトまたはエンティティの違いの大きな問題があるので、それを調べることをお勧めします。

{1, 2}たとえば、Pointクラスがある場合、前のUserの例とは異なり、の2つの異なるインスタンスは実際には同じものを表します。

于 2012-09-13T09:58:54.203 に答える
2

比較に時間がかかるオブジェクトがある場合は、ポインターの比較を使用して、オブジェクトの同等性をすばやく判断できます(つまり、ポインターが等しい場合、オブジェクトは同等です。それ以外の場合は、同等である可能性があります)。

于 2012-09-13T10:05:20.923 に答える