BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #43693同步于 2010/9/10
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

求指点C++中的引用

salooloo
2010/9/10镜像同步5 回复
template <class T> T& LinkedList<T>::Data(void) { T data; data = CurrPtr->date; return data;还是 return &data; } 如果是return data 那为什么是T& LinkedList<T>::Data(void) 返回T类型的引用? 他和T LinkedList<T>::Data(void)有什么区别? 如果是return &data 返回的不就是data的地址了吗? 或者这个函数应该写成 template <class T> T& LinkedList<T>::Data(void) { return CurrPtr->date; } 偶太笨了 理解不了引用 请高人指点
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
xiecaiji机器人#1 · 2010/9/10
完全不懂模板。。。不过你这个问题和模板没关系。。恩。。就是返回引用啊。。就是一种返回类型。。 举个例子:int a=3; int b =a; int &c=a; printf("%d %d",b,c); 结果的话 3 3 粗看的话,好像是一样的。。。其实不一样,在上面的过程中,给b分配了空间,然后把值赋给b,但是并没有给c分配空间,只是给a起了个别名,就想一个人的外号一样。 上面那个&表示引用,和取地址是一个符号,但是含义不一样。
RaulSpain007机器人#2 · 2010/9/10
个人理解,引用的概念是为了避免指针的出现吧,貌似因为按照自然语言得表达,一般都是用实体本身的属性,而用指针指向与自然语言有点违背..你可以简单的把它当成把实体本身返回,而不是复制返回, 举个例子void pass(T a) 和void pass(T &a)的区别,前者的a是在内存里复制一个a,在pass()函数中修改a只是修改a的副本,而pass(T &a)则是把a的本体传给pass函数,你修改了a,就相当于修改了a的实体,在c语言中如果要修改a的本体,你会这么调用T a; pass(&a); 在pass(T *a)函数中你会这么写a->property,而如果你是引用类型则就可以这么写 T a; pass(a); 在pass(T &a)函数中你会这么写a.property 后者看起来更符合自然语言的表达
Letsgo机器人#3 · 2010/9/10
个人觉得你的程序本身就有问题,从语法来说应该是return data; 但是因为data是在栈中分配的空间,当函数返回时,返回的应用指向的空间事实上已经被回收, 所以可以写成 template <class T> T& LinkedList<T>::Data(void) { T &data = CurrPtr->date; return data; }
bupteinstein机器人#4 · 2010/9/12
引用在使用中与其代表的实际变量语法一致,所以return data能够被正确解析为引用类型。 但是,你这个函数肯定完蛋,返回的变量没有作用域了。
salooloo机器人#5 · 2010/9/14
恩 了解了 函数犯了一个错误:返回了局部变量的引用。 所以应该用 template <class T> T& LinkedList<T>::Data(void) { return CurrPtr->date; } 谢谢各位