14

我有一个按每个属性比较对象以查看它们是否相同的函数。但我只是想知道,通过地址比较对象而不是检查它们是否完全相同的对象会更好吗?

4

4 回答 4

28

编辑:当心:如果你希望它正常工作,你不能将值(对象)传递给你的函数。您需要传递(可能是 const)引用或指针。

如果您只想知道两个引用或指针是否都指向同一个对象(不是相同的对象,而是相同的),那么比较地址是正确的做法,确实:

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

请注意,上面&的类可能会重载运算符Class。从 C++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

您应该决定您的类是否旨在支持equivalenceidentity。等价是的典型属性,例如数字。身份是实体的典型属性,例如人。

等价性通常通过比较一个类的数据成员来确定;比较地址是检查身份的合理方法。

于 2012-09-13T10:01:21.340 回答
3

我想你在相同和平等之间做出了适当的区分。

两个指向同一个地址的指针意味着它们指向同一个对象。所以是的:相同的地址意味着相同的对象,因此相等(尽管只有当我们谈论超过 1 个对象时,相等才有意义)。

相同的属性不一定意味着相同的对象。例如,您可以有两个具有相同名称“John Doe”的用户。代表它们的对象仍然是不同的对象,因此它们不能互换使用。但是,如果您有一个 Point 类,那么两个不同的实例{1, 2}实际上代表了同一件事,并且可以互换使用。

值对象引用对象或实体之间存在较大差异的问题,因此我建议查找它。

例如,如果您有一个 Point 类,那么与之前的 User 示例不同,两个不同的实例{1, 2}实际上代表同一事物。

于 2012-09-13T09:58:54.203 回答
2

如果您有比较耗时的对象,比较指针可以用作确定对象等价的快速方法(即,如果指针相等,则对象是等价的,否则它们可能仍然是等价的)

于 2012-09-13T10:05:20.923 回答