浅谈C++引用类型

29 篇文章 1 订阅

转自:微点阅读  https://www.weidianyuedu.com/content/1417208263557.html

C/C++语言以它的目标程序质量接近汇编代码而受到专业程序员的喜爱。真编译、本地代码、高质量、高效率,代码运行速度极快。语法简洁,使用灵活,的确是一种优秀的编程语言。

一、为什么引入引用类型

C/C++的另一特点是完备的指针类型,指针(Pointer)的本质其实就是单元的地址,若当初翻译成接地气的“地址类型”更合适。指针可以灵活操纵各种类型,但一些人滥用指针而钻起了牛角尖。C语言的函数只有传值调用,没有传址参数,用指针可以间接实现,但不直观、方便或带来错误,所以,C++引入“引用”类型(Reference),以解决C语言只有传值调用的缺陷。“引用“类型只是指针类型的补充,两者内部有相似的地方, 有时引用可以简化指针的使用。

二、什么是引用类型

"引用“类型的本质就是用指向的地址表示这个指向单元,单元中存放的是另一变量的地址,访问引用变量就是访问它的指向单元。相当于汇编的间接寻址:[地址],或指针类型的“*指针”操作。应用类型与指针类型的区别是,“指针”只表示地址,而“应用”表示地址所对应的单元,相当于指针前面加上了“*”操作符。但C++的引用类型在静态使用时,没有指针方便,令许多人感到“不太满意”。

引用定义时,必须初始化且只能一次,不能改变指向,你没法访问到它自已的地址。int x=5;  int &p=x;   变量p指向x无法改变。p相当于x的别名,正常无法改变这种关系。 所有对p的操作都将作用于x, 如访问&p将访问的是&x, 所以,有人错误地以为p没有分配单元。 其实这应用单元p是存在的,你用c++正常无法访问它而已,你可以用黑办法访问到,可以任意改变p的指向。

三、黑办法可以改变引用的指向

引用象指针类型一样也被分配到单元,可以用两种间接办法访问到,一是用邻居的地址相对地推算它的地址,稍有点不靠谱,但可以试试,试得很成功。这与编译器有关,我用C++Builder6.0,局部变量在栈中分配,可以据相邻的y地址推算或x地址推算出p的地址:  本例中是 (int *)(&y)[1] 或 (int *)(&x)[-1]  。

int x=5; int &p=x; int y=6;   // p指向x, p为值5

(int *)(&y)[1]=&y;                //    黑办法将p指向了y,显示p就可看到值已变成6

这验证了我们上面的判断, 这种办法的实现与编译器有关。C++Builder6.0还可以嵌入汇编指令,这样我们就可以合法访问到p。关键就看你其它版本的c++编译器能不能让你嵌入汇编了。下面两行汇编将引用p的真正地址放到pp单元,我们同样可以任意改变p的指向:

int  x=7;  int  y=123;

int &p=x;    int ** pp;     // pp用于存放p的真正地址

asm   {      lea  eax,  p

mov  pp, eax

}      // &p原址送入pp

*pp=&y;         //  将p的地址改指向了y,可以显示p值证实

当然还可以不用pp,在汇编中直接将y的地址送入p中,一样的效果:

asm   {      lea  eax, y

mov  p, eax

}     //   &y 送入p 中,p则改指向了y

这个例子说明在嵌入汇编中引用p的符号仍是真正地址,而不是所指向的地址。

结论是C++对引用类型同样分配单元,只是编译器屏蔽了你对它的直接访问。若需要,编译器也可留点后门允许你访问引用原址。

我们这样探讨纯粹是为了钻牛角尖,其实静态引用没有太大的需要,你完全可以用指针取代静态引用。当然,“引用”类型在左值、强制类型赋值等方面可以简化指针的使用。

四、为何静态引用出现“限制”

如果要问为什么C++不能访问应用单元自已? 这要涉及它增加“应用类型"的目的:是为了函数的传址调用, 而不是为了让你对引用静态使用、发挥。传址调用时,实参的地址送入栈中的形参单元,子程序内是通过对形参的访问透明地转而去访问实参,而不许访问栈中的形参(实参的地址)。编译器故意屏蔽保护了引用单元本身。阻止了对应用单元(形参)本身的访问,不是疏忽,而是精心设计,防止子程序内代码无意中损坏形参中的地址,这样才能不出现副作用,这就是引用类型受到访问限制的原因。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值