函数的形参的一种方式
引用:变量的一种别名。是某个已经存在变量的另一个名字
相对于指针,指针可以修改指向,但是引用不行
对于变量A创建一个别名B,创建后不可以更改,若更改则指向到其他内存区域,引用必须初始化,不可以为空。
int & num2 = nullptr;//错误!,不可以赋值为空
int a = 10 ;
int & b = a ;
对a 或者b进行赋值更改,另一方也会变
但是不可以后期从一个变量的引用变成另一个变量的引用
在使用的时候&才是取值符,在定义的时候代表引用
引用其实类似指针,指向某块区域的值,只是指针可以转移,引用不可以,他们值的地址其实是同一个内存地址。
值传递对函数外部的实参没有影响
但是地址传递有影响
引用传递省去了地址传递的复杂操作:
同时对外部的实际参数产生影响
由于引用不是指针,不对内存操作,不涉及内存安全
引用作为返回值:
int & test (int a ){
static int a = 10; //在全局区
return a ; //返回引用变量
}
int main(){
int &ref = test(); //同样使用引用符接收
cout <<ref <<endl; //使用时直接写变量 ,输出10
test()=1000; //函数可以直接作为左值,此时a就是1000,ref又引用了a,则ref也是1000
cout <<ref <<endl; //引用所绑定的变量同样影响 , 输出1000;
}
引用的本质:
引用的本质是一个const指针,指向的地址不可以变(引用初始化后不可更改),内容可以变(被引用的变量和引用变量本身一起变)
void func(int & ref ){ //等同于 int * const ref =&a ;
ref=100; //等同于 *ref = 100
}
int main(){
int a =10;
int & ref = a ; //写成指针:等同于 int * const ref = &a ;
ref =20; //写成指针:等同于*ref = 20;
cout <<ref <<endl;// 20
func(a);
return 0;
}
const也可以修饰引用,称为常量引用,主要来修饰形参,防止形参改变实参(等同于指向const的const指针:值和地址均不可改变)
void showvaluie (const int & v ){
v = 10000;//报错!此处给v赋值会给外部的实参值造成影响改变,加了const防止类似误操作
cout <<v <<endl;
}