在C++中,「引用」是在C的基础上新增的一种复合类型,是已定义变量的别名,比如将b作为变量a的引用,则可以交替使用a和b来表示该变量。引用最主要的用途是作为函数的形参,所以C++ Primer Plus(第6版)直到第8章介绍函数时才讨论引用(第5版是在2.3节「复合类型」中介绍的)。通过将引用变量用作参数,函数将使用原始数据,而不是其副本,这样除指针外,引用也为函数处理大型结构提供了一种非常方便的途径,同时对于设计类来说,引用也是必不可少的。C++新增的这项特性是对C语言的超越,C语言只能按值传递,如果想避开按值传递的限制,只能使用按指针传递。
在Java中,基本数据类型包括数值型(整数、浮点数)、字符型、布尔型,除基本类型之外的变量类型都称之为引用类型(如类、接口、数组)。Java中的对象是通过引用对其操作的。
以上我们提到「变量」时,是在说某个变量是某某类型的变量,「引用」也是一种变量类型。而在Python中,你可以认为没有「变量」的概念,都是「对象引用」。由于在Python中几乎察觉不到变量和对象引用之间的差别,因此这两个术语往往是交替使用的。
C++例子:
有几点需要注意的:1.C++中引用必须在声明时初始化,而不能像指针那样,先声明再赋值。2.引用更接近const指针,即一旦与某个变量关联起来,就将一直效忠于它。3.给引用赋值(非初始化赋值)就是给引用指向的变量赋值。(这也是为什么C++说引用是变量的别名)
C++代码的执行结果:
00EFFEC0
00EFFEC0
def
00EFFEC0
00EFFEC0
可见,给变量y赋值就是给x赋值,并且变量修改后,x和y的地址都保持不变。
在Python和Java中,引用不需要在声明时就赋予一个初始值,也不是一旦绑定就不能更改。不同在于:Java中引用声明后是有类型的,而Python中引用是无类型的,可以随意指向任何数据类型。
Java例子:
以上Java代码的执行结果如下:
HelloWorld
HelloWorld
test
3556498
HelloWorld
可见Java中x并不是s的别名,修改x时,s并没有同时被修改,并且x引用的值被修改后,x的地址相应发生变化。(hashcode某种程度上标识了对象的内存地址)
还有一点,Java和Python中字符串类型变量是不可以修改的,但仍支持「连接」操作。
Python例子:
执行完后,对象‘abc’不再有引用指向它,它会被Python的内存处理机制当成垃圾回收,释放内存,而x则指向了新的对象。
领取专属 10元无门槛券
私享最新 技术干货