您的位置:首页 > Web前端 > JavaScript

【总结】C++、C#、Java、Javascript、Python中引用的区别

2016-04-23 20:02 961 查看
首先分两大阵营:C++中引用是一块阵营,

C#、Java、Javascript、Python中引用是另一块阵营。

之所以这样分是因为同一阵营中引用使用方法基本一样。

C++引用本质是个常量指针,而其他语言引用本质是个普通指针。也就意味着C++的引用一旦初始化(指向确定了),以后就不可再修改(不可再指向其他对象),而其他语言的引用可以随时修改指向。

具体区别:(先声明下面所说的赋值是指“=”)

一个变量使用无非就两种情况,读取变量的内容和给变量赋值。两大阵营中只有在读取引用时行为都一样,在给引用赋值时行为不一样。

读取引用时:都是对引用进行“解引用”,结果是读取了引用指向的实际变量的值。

给引用赋值时:C++依然进行“解引用”,所以C++中碰到给引用赋值的语句时,本质是给引用指向的变量赋值;而在其他语言中不进行“解引用”,本质是给引用这个指针赋值。

正因为C++引用在读取和赋值时表现都一样(都是解引用),所以很多书上说引用就是变量的别名,因为任何时候使用引用(不管是赋值还是取值)都是使用引向的变量,故而引用表现的就好像变量的别名一样(但要认清本质,千万不要认为引用不占内存空间,实际上他是个指针也占内存空间的)。

但是在其他语言中引用就是指针,不是变量的别名,因为给引用赋值时没有自动解引用,就是给指针赋值(操作的是指针,不再是变量了,所以不能称之为别名);取引用的值时会自动解引用,就是取得引向的变量的值。(你可以称之为“半个别名”)

那么问题来了,在其他语言中,怎么给引用引向的变量赋值呢(第二次以上的赋值,第一次是变量自己的构造函数自动赋值)?

答:只能通过copy函数,不同语言都有对copy函数的不同实现。注意copy和构造函数不一样,构造函数是给还不存在的变量赋值,也就是建立变量并给变量第一次赋值;而copy函数是给已经存在的变量赋第二次以上的值。

最后补充一下,C++、C#、Java中的引用是有类型的,也就是说指针是有类型的,不可随意更改这个引用(指针)的类型;而在Javascript、Python等脚步语言中,引用是没有类型的,也就是说指针是没有类型的,可以随意更改引用(指针)的类型,也即引用是“无类型的”,可以随意指向任何数据类型。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: