关于指针比较(涉及的是对象同一性的问题)
发布日期:2021-11-07 23:21:00
浏览次数:4
分类:技术文章
本文共 1287 字,大约阅读时间需要 4 分钟。
这个问题我是在《C++必知必会》条款28里面看到的。C++指针比较的不是地址,而是对象同一性问题。即指针地址可以不同,而比较的结果却相同,因为它们指向的是同一个对象。
我们可以先看看在类的继承关系中,这种情况表现的形式。先上代码:
#include在上面的派生关系中c同时派生于a,b。并且由于是公有派生,所以在c的对象内部都存在a,b对象的实体,从而也就存在c到任何一个基类的预定义转化。using namespace std;class a{ private: int m_a;};class b{ private: int m_b;};class c : public a, public b{ private: int m_c;};int main(){ c* cc = new c; a* aa = cc; b* bb = cc; cout << "bb:" << bb << ",aa:" << aa << endl; if (cc == aa) { cout << "cc:" << cc << ",aa:" << aa << endl; } if (cc == bb) { cout << "cc:" << cc << ",bb:" << bb << endl; } return 0;}
那么当我们写下b* bb = cc;时,bb所指向的是否跟是cc所指向的地址一样呢?其实不然。如果了解了对象内存模型之后,你就知道:实际上在写下这条语句时,bb实际指向的是cc所指向的对象在内存中基类b的副本的地址。同样aa也是如此。
那么如果是这样的话。“cc == aa”的结果是true还是false呢?
现在就进入本文所讲的重点:指针地址可以不同,而比较的结果却相同,因为它们指向的是同一个对象。
运行一下代码你就会发现,答案是肯定的。为什么呢?
由于cc和aa其实指向的是同一个对象,编译器必须保证他们相比较的结果是true。打个比方:我和你去坐地铁,我在10号车厢,你在20号车厢,你能说我们不在同一辆地铁上么?其实在做指针比较的时候,由于编译器知道指针的类型信息,所以它会自动调整一定的偏移量来完成比较操作。如:表达式cc == bb,编译完成后,可能翻译为:cc?(cc+delta == bb) : (bb == 0),delta就是基类子对象在派生类中中的偏移量。
最后说明一下:在处理类对象指针的时候一定要小心,避免转化成空指针,这样就会丢失类型信息。。
转载地址:https://blog.csdn.net/zhangwu416826/article/details/7790166 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2024年03月30日 09时07分21秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
你不得不了解的深度学习知识(一)
2019-04-26
你不得不了解的深度学习知识(二)
2019-04-26
AI算法之Encoder-Decoder 和 Seq2Seq
2019-04-26
AI算法之Attention机制
2019-04-26
人体口罩佩戴检测实战
2019-04-26
[YoLoV3目标检测实战] keras+yolov3训练自身口罩检测数据集
2019-04-26
[实战]200类鸟类细粒度图像分类
2019-04-26
【实战】英文垃圾短信分类
2019-04-26
FFmpeg初遇见_基本命令
2019-04-26
Urbansound8k声音分类深度学习实战
2019-04-26
pytorch版本下的yolov3训练实现火焰检测
2019-04-26
yolov4训练自己的数据集实现安全帽佩戴检测
2019-04-26
EfficientDet训练自己的数据集实现抽烟检测
2019-04-26
【工具篇】10分钟快速上手git与github
2019-04-26
【开发篇】10分钟快速上手spring boot
2019-04-26
【开发篇】10分钟快速spring boot+react前后端分离
2019-04-26
【开发篇】10分钟快速上手spring boot+mybatis增删改查
2019-04-26
【Leetcode刷题篇】leetcode203 移除链表元素
2019-04-26
【Leetcode刷题篇】leetcode108 将有序数组转换为二叉搜索树
2019-04-26
【Leetcode刷题篇】leetcoe109 有序链表转换二叉搜索树
2019-04-26