比较指针和参考
Posted
技术标签:
【中文标题】比较指针和参考【英文标题】:Compare pointer with reference 【发布时间】:2019-11-29 03:46:54 【问题描述】:我正在重构遗留代码。我必须比较指针与引用是否相等(检查两个对象是否相等)。 SO中的This question通过比较地址来实现。如果我对下面的指针和引用做同样的事情,会不会有任何问题(任何例外情况?)。到目前为止,在我的测试中,它工作正常。请指教
#include <stdio.h>
#include <iostream>
class MemberData
//Huge class with many data members
;
int main()
MemberData x ;
const MemberData& y = x;
MemberData *ptr= &x;
if(std::addressof(*ptr)==std::addressof(y))
std::cout << "Both are equal" << "\n";
return 0;
【问题讨论】:
当你说检查两个对象是否相等你的意思是检查它们是否相等,或者检查它们是否是完全相同的对象 @Tas 检查完全相同的对象。请检查我的 cmets 是否有 erorika 【参考方案1】:std::addressof(*ptr)
似乎是多余的。如果您有一个指向对象的指针,并且您需要一个指向该对象的指针,那么为什么要通过指针间接获取指向对象的指针呢? ptr == std::addressof(y)
应该也能正常工作。只要你想比较地址的相等性...
(检查两个对象是否相等)
比较地址的相等性是比较身份,即它们是否是同一个对象。要比较对象的相等性,您通常会比较它们的值。例如,以下变量不是同一个对象,因此没有相同的地址,但它们的值相等(假设健全的复制构造函数):
MemberData x;
MemberData y = x;
【讨论】:
我最好解释一下大局。一个向量容器具有成员列表,我比较的成员是来自向量容器的函数内的 const &memberdata。由于它一直是 const& 参考,因此无需比较它们的价值,而且它很昂贵,因为它很大。所以身份比较就足够了。【参考方案2】:您提供的代码将始终打印“Both is equal”,因为您所做的是检查 x 的地址和 x 的别名的地址,这当然是相同的。真正的问题是您是否只想检查地址的相等性而不是它们的内部成员,即两个具有不同地址但具有相同值的相同类的对象。
【讨论】:
以上是关于比较指针和参考的主要内容,如果未能解决你的问题,请参考以下文章