引用的作用:给变量起别名
语法:数据类型 &别名 = 原名; 例:int a=10; int &b=a;
如果 int a=10;
int &b=a;
b=20;
cout<<a<<endl;//输出结果为20
引用的注意事项:
1.引用必须初始化 例:int &b;//是错误的
2.引用初始化就不能再做出改变
//如果b已经是a的别名,则不能再作为c的别名
如果写 int &b=a; int &b=c;//是错误的
注意:int a=10; int &b=a; int c=20;b=c;这是正确的,是赋值操作而不是更改引用。输出结果为a=20,b=20,c=20
引用做函数参数
值传递,形参不会修饰实参
地址传递,形参会修饰实参
void swap01(int *a,int *b){
Int temp=*a;
*a=*b;
*b=temp;
}
Void main(){
Int a=10;
Int b=20;
swap01(&a,&b);
}
引用传递,形参会修饰实参
void swap02(int &a,int &b)//这里的a和b是实参的别名,只不过别名与原名相同
{
Int temp=a;
a=b;
b=temp;
}
Int main(){
Int a=10;
Int b=20;
swap02(a,b);
}
引用做函数的返回值
1.不要返回局部变量的引用
Int &test01(){
Int a=10;
Return a;
}//以引用的形式返回a
2.函数的调用可以作为左值
Int &test02(){
Static int a=10;//静态变量,存放在全局区,数据在程序结束后由系统释放
Return a;
}
Int main(){
Int &ref=test01();//可以理解为返回一个新的别名但是未声明,然后用ref作为新的别名来接收
Cout<<"ref="<<endl;//结果正确,输出10,编译器做了保留
Cout<<"ref="<<endl;//a的内存已经释放,输出乱码
Int &ref2=test02();
Cout<<"ref2="<<endl;
Cout<<"ref2="<<endl;//两次输出都是10
test02()=1000;//令a的引用等于1000,相当于对a进行操作,使a=1000
Cout<<"ref2="<<endl;
Cout<<"ref2="<<endl;//ref2是a的别名,所以也可以访问到这块内存
}
引用的本质:在c++内部实现是一个指针常量
常量引用(用来修饰形参,防止误操作)
Int a=10;
Int &ref=10;//错误,10位于常量区,引用只能引一块合法的空间,比如栈或者堆区的数据
但是如果用Const int &ref=10;
//是正确的,编译器将代码修改成int temp=10;const int &ref=temp;
引用的是一块临时的空间,但是这个空间无法找到原名去操控,只能用别名ref操纵
ref=20;//错误,加入const以后变为只读,不可修改
如果参数中的int &ref 改为const int &ref,则ref的值不能修改