我有一个函数,它按每个属性比较对象,看它们是否相同。但我只是想知道,通过地址比较对象而不是检查它们是否完全相同的对象会更好吗?
答案 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 objects和reference objects or entities之间存在较大差异,所以我建议您查阅。
E.g。如果你有一个Point类,那么{1, 2}
的两个不同实例实际上代表相同的东西,不像以前的User例子。
答案 3 :(得分:2)
如果你有比较耗时的对象,比较指针可以用作确定对象等价的快速方法(即,如果指针相等,对象是等价的,否则它们可能仍然是等价的)