[关闭]
@rg070836rg 2015-08-16T15:04:43.000000Z 字数 948 阅读 1353

编写链表结构遇到的问题

data_structure

返回目录


描述1

LinkList(T a[], int n);//构造函数
定义了链表构造函数,值和数目。

在test.cpp中,如下引用该函数:
LinkList<CStudent> pStu(LoadFile("data.csv"),length);
length是定义在main函数之外的全局变量,值修改在LoadFile函数中

经调试观察,在执行这句话的时候,在运行完LoadFile函数之后观察length值为有效数据值, 如图:
有效length值

但是继续单步执行,到函数内部观察时
此处输入图片的描述

很奇怪,这个值变为了0.
我认为这很无道理,就算是值传递,也不应该会出这样的问题,这时候,我加上了&引用:
LinkList(T a[], int &n);
果然,符合需要:
此处输入图片的描述
值被很正常的传入。

那么,我尝试着解释为,传入函数的时候,值传递的完成,在LoadFile的同时,已经被先行传入了,当length值通过函数被修改时,已经和拷贝过去的值没有任何关系。而使用引用,只是传别名,在使用的时候,才会访问地址取值,所以能正常访问。

后来,又继续查资料,发现以下内容:

c/c++参数压栈顺序是从右到左

于是,很快明白原因,仅在此作为记录。

描述2:

第二个问题,就是修改值失败
原因是没有返回值的引用,这样,仅仅是值传递,不能对内存进行修改
修改块代码:

  1. string tmp;
  2. pStu.Get(key).SetStu_Num(tmp);
  1. T& LinkList<T>::Get(int pos)
  2. {
  3. Node<T> *p = pHead->next;
  4. int i = 1;
  5. while (p!=NULL && i!=pos)
  6. {
  7. p = p->next;
  8. i++;
  9. }
  10. if (p == NULL)
  11. {
  12. cerr << "超出链表长度,数据非法,异常退出。";
  13. system("pause");
  14. exit(1);
  15. }
  16. else
  17. return p->data;
  18. }
  1. void CStudent::SetStu_Num(string Index)
  2. {
  3. this->Stu_Num = Index;
  4. }

按照老师的讲法,Get返回值为p->data的引用,并对其进行操作即可。

总结:

1、常用引用,减少值传递,对于不想被修改的引用可以使用常引用。
2、在流运算符以及赋值运算符中,会使用到引用。
3、注意不要对局部变量返回引用!

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注