您可以按地址比较对象是否相等?

时间:2012-09-13 09:52:42

标签: c++

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

4 个答案:

答案 0 :(得分:17)

编辑:注意:如果要使值(对象)正常工作,则无法将值(对象)传递给函数。你需要传递(可能是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);
}

答案 1 :(得分:14)

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

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

答案 2 :(得分:3)

我认为你在相同和平等之间做出了恰当的区分。

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

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

value objectsreference objects or entities之间存在较大差异,所以我建议您查阅。

E.g。如果你有一个Point类,那么{1, 2}的两个不同实例实际上代表相同的东西,不像以前的User例子。

答案 3 :(得分:2)

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