先看这个程序,随着Count栈帧的销毁,会创建一个临时变量将n的值带回,可以实现我们的目的。
再看这个情况的时候,对于n来说他存放的位置在静态区,他不会随着函数栈帧的销毁而销毁,返回的时候依旧靠着临时变量带回。 由此我们就引出了一个疑问,我们之前是因为n会被销毁而传值返回,我们 现在n指向的空间并没有销毁我们岂不是可以进行相应的优化。
由于上述的情况,我们进行了优化,利用引用,我们就可以知道返回的是n指向的那个空间,传引用返回省去了,临时变量带回返回值的情况减少拷贝,节省了空间。
我们传值返回和传引用返回的区别就显而易见了,如果我们传回的随着函数栈帧的销毁,如果返回对象还在并没有还给系统,就可以用传引用返回,如果已经还给系统了,则我们必须使用传值返回。
我们遇到的static是比较特殊的情况,我们还会遇到情况是什么?
#define N 10
typedef struct Array
{int a[N];int size;
}AY;// 引用返回
// 1、减少拷贝
// 2、调用者可以修改返回对象
int& PosAt(AY& ay, int i)
{assert(i < N);return ay.a[i];
}int main()
{AY ay;for (int i = 0; i < N; ++i){PosAt(ay, i) = i*10;}for (int i = 0; i < N; ++i){cout << PosAt(ay, i) << " ";}cout << endl;return 0;
}
对于我们静态开辟的数组我们也是可以用引用返回,一方面减少拷贝,另一方面可以修改返回对象,毕竟我们传引用返回,利用的是别名,指向的空间都是同一片空间,因此可以进行修改。
我们再来看一个错误的演示:
我们已经知道传引用返回要求的是出了函数作用域后(函数栈帧销毁后)指向的空间是未被改动的,也就是那片空间还未还给系统,但是我们现在指向的c的空间已经还给系统了,如果我们此时对其进行访问就是非法的,所以此时的传引用返回就是错误的。