二.引用
2.1 引用的基本使用
引用的作用:为变量起别名
语法:数据类型 &别名=原名
-
int a=10 表面上是创建了一个变量,但实质上创建了一块内存,占4个字节,内容为10,使用变量a来操作这块内存
引用即为再次创建一个变量名,同时指向与变量a所指的内存,与变量a有同样的等级,是同块内存的不同叫法而已
2.注意事项:(1) 引用必须初始化 如int &b就是不合法的,必须要指定b是谁的别名
(2) 引用在初始化后不可改变
int a=10; int c=20;
int &b=a;//声明b是a的一个别名
int &b=c;//又声明b是c的一个别名,但不可行,会报错
2.2引用做函数参数
调用函数传参数的方式(之前):值传递(形参不可修饰实参)和地址传递(要想形参修饰实参必须要用地址传递,指针)
今天介绍另一种传参的方式:引用用函数参数
作用:函数传参时,可以利用引用的技术让形参修饰实参
优点:可以简化指针修饰实参
#include<iostream> using namespace std; // 交换函数 //1.值传递 void myswap01(int a,intb) { int temp=a; a=b;//结果是swap01->a=20 awap01->b=10 只是形参发生改变实参并没有 b=temp; } //2.地址传递 void myswap01(int *a,int *p) { int temp=*a;//指针来传递地址 *a=*b; *b=temp; } //3.引用传递 void myswap03(int &a,int &b) { int temp=a;//调用函数时 &a=a,故swap0->a是实参a的别名,操作同一块内存 a=b; b=temp; } int main() { int a=10; int b=20; myswap01(a,b);//值传递,形参不可修饰实参 myswap02(&a,&b); myswap03(a,b);//通过引用传参产生的效果同按地址传递的结果一样 }
2.3 引用做函数的返回值
作用:引用时可以作为函数的返回值存在的
注意:不要返回局部变量
用法:函数调用作为左值
#include<iostream> using namespace std; //不要返回局部变量的引用 int &test01() { int a=10;//局部变量存放在栈区 return a; } //函数的调用可以作为左值 int &test02() { static int a=10;//静态变量,存放在全局区,其区上的数据在程序结束后释放 return a; } int main() { int &ref=test01(); cout<<ref<<endl; cout<<ref<<endl;//第一次结果是正确的,是因为编译器做了保存,而第二次就是随机数了,因为局部变量的内存在函数调用完成后已经释放 int &ref2=test02();//等号左边是左值,test02是a的别名,而ref2又是test02的别名,所以ref02也是a的别名 cout<<ref<<endl; cout<<ref<<endl; return 0;//如果函数的返回值是引用,这个函式调用可以作为左值 }
2.4 引用的本质
本质:在c++内部实现是一个指针变量
#include<iostream> using namespace std; void func(int &ref)//编译器发现是引用时,转换成int *const ref=&a; { ref=100;//ref是引用,转换成*ref=100 } int main() { int a=10; int &ref=a;//自动转换成int *const ref=&a 指针常量是指针指向不可改,也说明为什么 引用不可更改 ref=20; cout<<ref<<endl; cout<<a<<endl; func(a); cout<<ref<<endl; cout<<a<<endl; return 0; }
2.5 常量引用
常量引用主要用靠修饰形参,防止误操作,在函数形参列表中可以加const修饰形参防止形参改变实参