描述1:
LinkList(T a[], int n);//构造函数
定义了链表构造函数,值和数目。
在test.cpp中,如下引用该函数:LinkList<CStudent> pStu(LoadFile("data.csv"),length);
length是定义在main函数之外的全局变量,值修改在LoadFile函数中
经调试观察,在执行这句话的时候,在运行完LoadFile函数之后观察length值为有效数据值, 如图:
但是继续单步执行,到函数内部观察时
很奇怪,这个值变为了0.
我认为这很无道理,就算是值传递,也不应该会出这样的问题,这时候,我加上了&引用:LinkList(T a[], int &n);
果然,符合需要:
值被很正常的传入。
那么,我尝试着解释为,传入函数的时候,值传递的完成,在LoadFile的同时,已经被先行传入了,当length值通过函数被修改时,已经和拷贝过去的值没有任何关系。而使用引用,只是传别名,在使用的时候,才会访问地址取值,所以能正常访问。
后来,又继续查资料,发现以下内容:
c/c++参数压栈顺序是从右到左
于是,很快明白原因,仅在此作为记录。
描述2:
第二个问题,就是修改值失败
原因是没有返回值的引用,这样,仅仅是值传递,不能对内存进行修改
修改块代码:1
2 string tmp;
pStu.Get(key).SetStu_Num(tmp);
1 | T& LinkList<T>::Get(int pos) |
1 | void CStudent::SetStu_Num(string Index) |
按照老师的讲法,Get返回值为p->data的引用,并对其进行操作即可。
总结:
1、常用引用,减少值传递,对于不想被修改的引用可以使用常引用。
2、在流运算符以及赋值运算符中,会使用到引用。
3、注意不要对局部变量返回引用!