总结C++C#JavaJavascriptPython中引用的区别
Posted HNFXS985
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了总结C++C#JavaJavascriptPython中引用的区别相关的知识,希望对你有一定的参考价值。
首先分两大阵营:C++中引用是一块阵营,
C#、Java、javascript、Python中引用是另一块阵营。
之所以这样分是因为同一阵营中引用使用方法基本一样。
C++引用本质是个常量指针,而其他语言引用本质是个普通指针。也就意味着C++的引用一旦初始化(指向确定了),以后就不可再修改(不可再指向其他对象),而其他语言的引用可以随时修改指向。
具体区别:(先声明下面所说的赋值是指“=”)
一个变量使用无非就两种情况,读取变量的内容和给变量赋值。两大阵营中只有在读取引用时行为都一样,在给引用赋值时行为不一样。
读取引用时:都是对引用进行“解引用”,结果是读取了引用指向的实际变量的值。
给引用赋值时:C++依然进行“解引用”,所以C++中碰到给引用赋值的语句时,本质是给引用指向的变量赋值;而在其他语言中不进行“解引用”,本质是给引用这个指针赋值。
正因为C++引用在读取和赋值时表现都一样(都是解引用),所以很多书上说引用就是变量的别名,因为任何时候使用引用(不管是赋值还是取值)都是使用引向的变量,故而引用表现的就好像变量的别名一样(但要认清本质,千万不要认为引用不占内存空间,实际上他是个指针也占内存空间的)。
但是在其他语言中引用就是指针,不是变量的别名,因为给引用赋值时没有自动解引用,就是给指针赋值(操作的是指针,不再是变量了,所以不能称之为别名);取引用的值时会自动解引用,就是取得引向的变量的值。(你可以称之为“半个别名”)
那么问题来了,在其他语言中,怎么给引用引向的变量赋值呢(第二次以上的赋值,第一次是变量自己的构造函数自动赋值)?
答:只能通过copy函数,不同语言都有对copy函数的不同实现。注意copy和构造函数不一样,构造函数是给还不存在的变量赋值,也就是建立变量并给变量第一次赋值;而copy函数是给已经存在的变量赋第二次以上的值。
最后补充一下,C++、C#、Java中的引用是有类型的,也就是说指针是有类型的,不可随意更改这个引用(指针)的类型;而在Javascript、Python等脚步语言中,引用是没有类型的,也就是说指针是没有类型的,可以随意更改引用(指针)的类型,也即引用是“无类型的”,可以随意指向任何数据类型。
以上是关于总结C++C#JavaJavascriptPython中引用的区别的主要内容,如果未能解决你的问题,请参考以下文章