什么是引用
引用这个概念听起来吓人,给人一种很难懂难过的一种感觉,但是没什么好害怕的。引用其实就是给我们的变量起了个小名而已,作用就是给变量起别名,并不是创建一块新的内存空间。
结构:数据类型 &别名 = 原名。
引用并不是新开辟了一块空间,只不过是给这个变量起另外一个名字,我们可以通过这个名字来操控这个变量所指向的那块空间。
我们直接来举个例子就好理解了:
#include<iostream> using namespace std; int main() { int a = 10; int& b = a; return 0; }
来看看a和b的地址相不相同,请看:
我们发现a和b的地址完全相同。
引用的注意事项
引用的类型必须是与实体类型保持一致。
引用必须初始化。
引用在初始化就后不可以改变。
还是来举个例子:
#include<iostream> using namespace std; int main() { int a = 10; int b = 20; //int &c;这种写法是错误的,因为引用必须进行初始化 int& c = a;//引用一但初始化,就不可以更改 c = b;//这是赋值操作,并不是更改利用,这句话的意思是把20赋值给c所指向的那块内存, //由于c是a的引用,所以a的内容也会跟着一起改变 cout << "a=" << a << endl; cout << "b=" << b << endl; cout << "c=" << c << endl; return 0; }
引用做函数参数
我们在学习之前C语言的函数参数时,有两种函数参数传递的方式:一种是值传递,另外一种就是址传递。
现在,我们来学习第三种函数参数的传递方式:引用传递。其实,在C++中,所谓引用传递是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
#include<iostream> using namespace std; void swap(int& a, int& b) { int tmp = a; a = b; b = tmp; } int main() { int a = 10; int b = 20; swap(a, b); cout << "a= " << a << endl; cout << "b= " << b << endl; return 0; }
引用做函数返回值
引用做函数参数这里主要由两个点:
1.不要返回局部变量的引用。
2.函数的调用可以作为左值。
我们先来看第一种:不要返回局部变量的引用。
//不要返回局部变量的引用 #include<iostream> using namespace std; int& test1() { int a = 10; return a; } int main() { int& ret = test1(); cout << "ret= " << ret << endl; return 0; }
我们知道,局部变量存储在栈区中,一旦出了作用域就会被销毁。
因为a的内存已经释放了,此时我们如果再去访问a的内存就已经是非法操作了。所以说,局部变量存放在栈区中,不要返回局部变量的引用。
现在我们来看第二点:函数的调用可以作为左值。
在这之前,我们要知道static关键字的用法,static修饰的局部变量会变为静态变量,而静态变量会存放在全局区,会提高生命周期。而放在全局区中的的数据在程序结束后是由系统释放的。
请看:
//返回静态变量引用 #include<iostream> using namespace std; int& test2() { static int a = 10; return a; } int main() { int& ret2 = test2(); cout << "ret2 = " << ret2 << endl; return 0; }
函数的调用可以作为左值
//函数的调用可以作为左值 #include<iostream> using namespace std; int& test2() { static int a = 10; return a; } int main() { int& ret2 = test2(); cout << "ret2 = " << ret2 << endl; test2() = 1000;//如果函数的返回值是引用,这个函数调用可以作为左值 cout << "ret2 = " << ret2 << endl; return 0; }
引用的本质
接下来我们来探索引用的本质。
本质:引用的本质其实就是一个指针常量。
指针常量就是这个指针的指向不可以进行更改,但是指针指向的内容是可以进行更改的。
所以也就有了引用一旦初始化后,就不可以进行改变,这里的不可进行改变指的就是指针的指向不可以进行改变。
请看代码举例:
//引用的本质 #include<iostream> using namespace std; void fun(int& ret) { ret = 200; //由于ret是引用,所以会自动转换为*ret=200 } int main() { int a = 10; int& ret = a; //自动转换为int* const ref = &a; //指针常量就是指针的指向不可以进行更改,这也就是为什么引用一旦进行初始化就不可以进行过更改 ret = 20;//内部发现ret是引用,内部会自动转换为*ret=20 cout << "a = " << a << endl; cout << "ret = " << ret << endl; fun(a); cout << "a = " << a << endl; cout << "ret = " << ret << endl; return 0; }
好了,以上就是引用的一些最基本的理解了。就到这里吧,再见啦各位!!!