二.引用
1.基本使用
- 作用:给变量起别名
- 语法:数据类型 &别名 = 原名
include<iostream> using namepase std; int main() { int a=10; int &b=a;//创建引用:数据类型 &别名 = 原名 cout<<"a="<<a<<endl; cout<<"b="<<b<<endl; b=100; cout<<"a="<<a<<endl; cout<<"b="<<b<<endl; system("pause"); return 0; }
2 .引用的注意事项
- 引用必须初始化
int &b;//是错误的
int &b=a;//这才是正确的
- 引用在初始化之后,不可以改变
int a=10;
int &b=a;
int c=20;
b=a;//这里不再是引用了,而是赋值
3.引用做函数参数
- 作用:函数传参时,可以利用引用的技术让形参修饰实参
- 优点:可以简化指针修饰实参
-
include<iostream> using namepase std; void change01(int a,int b)//值传递,形参不会修饰实参,就是ab交换后不会传递到主函数去 { int t; t=a; a=b; b=t; } void change02(int * a,int * b)//地址传递,形参会修饰实参,就是最后ab可以传递到主函数去 { int t; *t=*a; *a=*b; *b=t; } void change03(int &a,int &b)//引用传递,形参也是可以修饰实际参数的 { int t; t=a; a=b; b=t; } int main() { int a=10,b=20; change01(a,b); cout<<"change01_a"<<a<<endl; cout<<"change01_b"<<b<<endl; change02(&a,&b); cout<<"change02_a"<<a<<endl; cout<<"change02_b"<<b<<endl; change02(a,b); cout<<"change03_a"<<a<<endl; cout<<"change03_b"<<b<<endl; system("pause"); return 0; }
4.引用函数的返回值
- 作用:引用是可以作为函数返回值存在的
- 注意:函数不要返回局部变量引用
- 用法:函数调用作为左值
-
include<iostream> using namepase std; int& test01() { int a=10;//局部变量,存储在栈区,函数执行完,编译器释放数据 return a; } int& test02() { static int a=10;//静态变量,储存在堆区,整个程序执行完才会释放 return a; } int main() { int r=test01(); cout<<"test01_r"<<r<<endl;//第一次正常输出,编译器有保留 cout<<"test01_r"<<r<<endl;//第二次不能正常输出,因为数据已经被释放了 int r=test02(); cout<<"test02_r"<<r<<endl;// cout<<"test02_r"<<r<<endl;//一直可以正确输出,因为没有被释放 test02()=1000;//函数可以作为左值 cout<<"test02_r"<<r<<endl;//输出结果是1000 cout<<"test02_r"<<r<<endl;//相当于说test02是a,改变的就是a就是r system("pause"); return 0; }
5.引用的本质
引用的本质就是一个指针常量
但它发现是引用后回自动给它变为 const * a这样的
而指针常量是不可以更改的,所以我们只能去改变它的值,而不可以去让它引用别的地址
6.常量引用
- 作用:常量引用主要是用来修饰形参,防止误操作
- 在函数形参列表中,可以加const修饰形参,防止形参改变实参
-
include<iostream> using namepase std; int main() { //int &r=10;//这是错误的,引用必须引一块合法的内存空间,而10是常量 const int &r=10; //加上const后,编译器将代码修改为 int t=10;const int &r=t; r=20;//会报错,因为加了const后,变为只读,不可以修改 system("pause"); return 0; }