编写链表结构遇到的问题


返回目录


描述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
2
   string tmp;
pStu.Get(key).SetStu_Num(tmp);

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

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

总结:

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