易码技术论坛

 找回密码
 加入易码
搜索
查看: 260265|回复: 4

[教程] 区别C++和其他面向对象语言中引用的概念

[复制链接]
发表于 2006-7-26 13:32:00 | 显示全部楼层
语义的发展
C语言:
DataType* Obj_Pointer = (DataType*) malloc( sizeof(DateType) );

C++语言:
DataType* Obj_Pointer = new DataType;

Java:
ClassType Obj_Handle=new ClassType();

Python:
Object=ClassType();

 楼主| 发表于 2006-7-26 16:35:00 | 显示全部楼层
哈哈,这个总结的好
发表于 2006-7-30 16:20:44 | 显示全部楼层
我认为还是比较清晰的那种好
不会头痛
 楼主| 发表于 2006-11-9 11:22:21 | 显示全部楼层
把这个讲引用的帖子顶出来
 楼主| 发表于 2006-7-26 12:22:39 | 显示全部楼层 |阅读模式
c++中有个语言概念叫引用,大部分的面向对象设计语言中也有引用这个概念。但是要注意到,c++中的引用和其他面向对象中的引用是完全不同的概念。

这一点还要从c++中的指针说起。

众所周知,C++中的指针是一个存放地址的变量,归根结底他就是一个整数,整数的值就是他指向的变量的地址。在早期的c语言中甚至允许指针和整数自由转换。对于这个指针的操作,可以有:

1,取值:取指针指向的变量的值,由*运算符完成
2,赋值:将一个变量的地址赋给一个指针,由=运算符和&运算符共同完成
3,赋值:将一个指针pa赋值给另一个指针pb,表示pb指向和pa相同的东西。
4,算术运算(+,-,++,--):首先定义指针指向的类型为T,那么+a的意思就是表示指针的那个整数加上sizeof(T)*a,也就是向下指a个。

指针的概念明确了,引用就好说了。

先说c++中的引用。

c++的引用,其实就是“别名”的概念。对于引用本身来说,只有一种操作,那就是初始化:

int& ra=a;
这样就给a起了一个别名叫ra。那么以后对ra的所有的操作都是对a操作。他们是不可区分的

对于函数参数中的引用,概念是一样的,不过是在函数的作用域中为实参引入了一个局部别名,对这个别名的操作和对实参本身操作是一样的。类中的成员引用也是同样的,不过这个引用只能在构造函数的成员初始化列表中被初始化。

由于c++引用的这种特性,导致引用是不可以被重复榜定的。也就是说,你指定了一个引用为某个变量的别名(这种指定是在引用定义的时候,也是唯一一次指定的机会),就永远无法改变这种榜定。因为对这个引用的赋值操作将会被看作对这个引用榜定的那个变量的赋值,而不是重新榜定某个变量。这也是称引用为别名的意义所在。

所以,c++的引用就是别名,只能在定义的时候被初始化(也就是榜定)到某个变量上,以后对引用的所有操作都和对榜定的变量本身操作引起的作用是一样的。

当然,在实现上,c++的引用内部还是一个指针,不过这并不对他的特殊的别名语义有什么影响。



再说其他面向对象中的引用,就拿c#举例吧:

在c#里,有几种变量类型:

1,值类型,如int,double;还有就是所有自定义的struct类型
2,引用类型。包括所有定义的class类型,还有array,string等,其实他们也是预定义的class,在.net framework中可以找到他们的原始类型。

这里的引用类型其实就是特殊的指针,他拥有的是基本的指针语义,但是又有c++中引用的某些特征。可以看一下他的操作:

1,定义:定义一个引用型变量就像c++中定义一个变量一样,由于这里没有了c++中class类型也可以定义值类型变量的语法,所以省掉了其他的提示符,直接定义就可以。
2,赋值:对于新鲜定义的引用,他是一个空值,什么也没有指向。可以通过new运算符,来给他一个值。这里可以看到,new在c++中是在堆上申请空间并返回一个指针的运算符。这在c#中是一样的,不过省略了c++复杂的语法。这里的new同样是在堆上申请一段空间,并将空间的首地址返回给他赋值的变量。
3,赋值:如果将一个引用类型变量a复制给另外一个变量b,注意,这里的语义是,b和a将引用同一个变量,也就是他们指向同一块内存区域。这个正是指针语义所在。
4,取值:和c++中的指针不同,这里的引用类型省掉了取值特殊操作(-〉和*),一个变量放在那里就代表了他所指向的东西。可以直接用.来访问他的成员

另外,由于大部分面向对象语言都提供了“垃圾回收”机制,因此他们的“堆”都是受到监控的(在c#里叫托管),所以像a=b而a原来指向的空间丢掉这种事情会被很好的处理,不用担心资源泄漏。

所以,除了c++以外的其它大部分oo语言所提供的引用类型,其实是具有指针语义的,简化语法的c++指针;而c++自身的引用类型,则是纯粹为了方便而引进的别名机制。

就因为这个概念没有搞清,Java课的期中考试被扣掉5分……后来人要注意了
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2024-4-24 15:25 , Processed in 0.011973 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表