@rg070836rg
2015-08-16T15:04:43.000000Z
字数 948
阅读 1366
data_structure
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++参数压栈顺序是从右到左
于是,很快明白原因,仅在此作为记录。
第二个问题,就是修改值失败
原因是没有返回值的引用,这样,仅仅是值传递,不能对内存进行修改
修改块代码:
string tmp;
pStu.Get(key).SetStu_Num(tmp);
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;
}
void CStudent::SetStu_Num(string Index)
{
this->Stu_Num = Index;
}
按照老师的讲法,Get返回值为p->data的引用,并对其进行操作即可。
1、常用引用,减少值传递,对于不想被修改的引用可以使用常引用。
2、在流运算符以及赋值运算符中,会使用到引用。
3、注意不要对局部变量返回引用!