c++与c语言相比,除了直接变量声明,指针声明,又提供了引用声明的方法,来丰富编程的应用。
引用:
n相当于m的一个别称,另一个名字,在后面可以对于n进行操作实现m值改变。
引用用的最多的是作为形参和返回引用。
- int fun1(int a);
- int fun2(int* a);
- int fun3(int& a);
在fun1中,对形参a的改变不会影响实参的值。
在fun2和fun3中,对形参a的改变会影响到实参的值。fun2中,除了可以对a指针指向的值进行修改以外,还可以对于*(a+k),a指针的“邻居”进行修改。而fun3,只能修改传入实参的值,增加了程序的安全性。
而在返回引用的时候,要十分的小心。程序返回值的一个原理:将返回值首先赋值给一个中间变量,然后再返回这个中间变量。程序返回值虽然写return a,但是返回值并不是a,而是一个中间变量。比如:
- int fun4 (int& a)
- {
- return a;
- }
- int& fun5(int& a)
- {
- return a;
- }
如果设中间变量为middle的话,fun4可看做int middle = a;然后再将middle赋给其他值。
fun5中,可看做int& middle = a;middle成为了a的一个别称。用引用的方法,可是实现真真正正返回a。
返回值是引用的函数可以作为左值使用。既fun5(a)=3;这样进行赋值。这样,实参a值可以改变。而fun4(a)=3,其实赋给的值是middle=3,a的值并没有任何变化。
返回引用的函数要十分重视。如果返回的值在该函数调用之前并没被创建,这样的返回值将十分危险。如:
- int& fun6(int& a)
- {
- int b = a;
- return b;
- }
返回值就是b,如果这样使用该函数int k = fun7(a);的话暂时还没事,如果是int* k,或者int& k的话,k=fun7(a);中间变量的值在执行完函数之后肯定在某一时刻被销毁。这样指针指向的值和别称都不知所指向的内存空间到底是什么,之后再使用k值时十分危险。如果返回值是a的话,a值在调用函数之前是存在的,这样就没有任何问题。还有一个使用返回引用的例子。
- ostream &operator<<(ostream &output, const AAA &aaa)
- {
- output << aaa.x << ' ' << aaa.y << ' ' << aaa.z << endl;
- return output;
- }
阅读(795) | 评论(0) | 转发(0) |