我有一个按每个属性比较对象以查看它们是否相同的函数。但我只是想知道,通过地址比较对象而不是检查它们是否完全相同的对象会更好吗?
4 回答
编辑:当心:如果你希望它正常工作,你不能将值(对象)传递给你的函数。您需要传递(可能是 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);
}
您应该决定您的类是否旨在支持equivalence或identity。等价是值的典型属性,例如数字。身份是实体的典型属性,例如人。
等价性通常通过比较一个类的数据成员来确定;比较地址是检查身份的合理方法。
我想你在相同和平等之间做出了适当的区分。
两个指向同一个地址的指针意味着它们指向同一个对象。所以是的:相同的地址意味着相同的对象,因此相等(尽管只有当我们谈论超过 1 个对象时,相等才有意义)。
相同的属性不一定意味着相同的对象。例如,您可以有两个具有相同名称“John Doe”的用户。代表它们的对象仍然是不同的对象,因此它们不能互换使用。但是,如果您有一个 Point 类,那么两个不同的实例{1, 2}
实际上代表了同一件事,并且可以互换使用。
值对象和引用对象或实体之间存在较大差异的问题,因此我建议查找它。
例如,如果您有一个 Point 类,那么与之前的 User 示例不同,两个不同的实例{1, 2}
实际上代表同一事物。
如果您有比较耗时的对象,比较指针可以用作确定对象等价的快速方法(即,如果指针相等,则对象是等价的,否则它们可能仍然是等价的)