打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
UC头条:对象引用和对象指针
userphoto

2023.06.08 山西

关注

最近在看代码时候,又因为这个问题卡了一下,所以再详细分析下

我遇到了类似这样的函数

boolMyClass(sTunnl&sData,sTunnl*sBase){//代码}

现在解释下

第一个参数,传进来的这个东西,是个对象引用,起别名叫做sData,所以&sData

第二个参数,传进来的这个东西,是个sTunnl对象的指针,*是解引用,相当于是把传进来的东西放在*sBase里面

使用的话,那就sData.get;

例子

#includeclassMyClass{public:intx;MyClass(intval):x(val){}voidprint{std::cout<<'Value:'<<>print;//通过对象指针访问对象return0;}

在这个示例中,我们首先创建了一个MyClass对象obj。然后,我们创建了一个指向该对象的对象引用ref和一个指向该对象的对象指针ptr

接下来,我们分别使用三种方式访问该对象:直接访问、通过对象引用访问和通过对象指针访问。你可以看到,无论使用哪种方式,都可以成功访问该对象。

那*ptr->print对吗,*ptr和ptr的意思是一样的吗

*ptr->print是不正确的。ptr->print是正确的写法,它等价于(*ptr).print

ptr是一个指向对象的指针,而*ptr表示指针所指向的对象。因此,ptr和*ptr的意思是不同的。

当你想通过指针访问对象的成员时,可以使用->运算符。例如,如果你想通过指针ptr访问对象的print方法,可以这样写:

ptr->print;

这等价于先解引用指针,然后再访问对象的成员:

(*ptr).print;

那*ref.print可以吗

不,*ref.print是不正确的写法。如果想通过对象引用访问对象的成员,应该直接使用.运算符。例如,如果你想通过对象引用ref访问对象的print方法,可以这样写:

ref.print;

由于对象引用本身就是对象的别名,因此无需对其进行解引用。可以直接像访问对象本身一样访问对象引用。

为什么对象指针需要解引用,而对象引用就不需要

对象指针和对象引用的工作方式不同。对象指针存储的是对象的地址,而不是对象本身。因此,当你想通过指针访问对象时,需要先解引用指针,才能获取指针所指向的对象。

例如,假设你有一个指向MyClass对象的指针ptr。如果你想通过指针访问该对象的x成员,需要先解引用指针,然后再访问成员:

inta=(*ptr).x;

或者使用->运算符简化代码:

inta=ptr->x;

而对象引用则不同。它本身就是对象的别名,因此无需进行解引用。你可以直接像访问对象本身一样访问对象引用。

例如,假设你有一个MyClass对象的引用ref。如果你想通过引用访问该对象的x成员,可以直接这样写:

inta=ref.x;

为什么->运算符可以简化代码

->运算符是一种特殊的运算符,用于通过指针访问对象的成员。它可以简化代码,因为它允许你直接通过指针访问对象的成员,而无需先解引用指针。

例如,假设你有一个指向MyClass对象的指针ptr。如果你想通过指针访问该对象的x成员,可以这样写:

inta=(*ptr).x;

但是这种写法比较繁琐,不够简洁。为了简化代码,你可以使用->运算符:

inta=ptr->x;

这样,你就可以直接通过指针访问对象的成员,而无需先解引用指针。这样的代码更加简洁易读。

这是我画的表格来理解

没有->运算符的话

ptrMyClassget

0x83484*ptr(*ptr).get

有->运算符的话

ptrMyClassget

0x83484ptr->get

所以有了运算符相当于写法上省了中间这一步

那运算符到底放在什么位置呢

有的人这样写int*a,有的人写成int*a

之所以出现差异C++是因为C之上添加了更强大的类型系统

C样式

C程序员通常从“价值”的角度思考,所以

int*pValue;

读作“pValue的解引用是一个整数”。

C++风格

而C++程序员在“类型”中思考

int*pValue;

读取“pValue的类型指向int的指针”。

当然,编译器完全没有看到任何区别。

不过注意一个事情,就是定义多个变量时小心混乱

int*foo,bar;//foowillbeint*,barwillbeint

解决方案是,永远不要在同一行上声明多个变量

其实我个人是喜欢int*p这种的,因为这样我知道*p是表示一个地址

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【转】智能指针学习
智能指针
从C语言到C++你必须学会的---动态内存和智能指针
[转载]C++指针new和malloc区别
C语言中的.与->区别
Android的智能指针-一天一点一滴-搜狐博客
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服