基本语法
作用 : 给变量起别名
语法:数据类型 &别名=原名
int a=10;
int &b=a;
b=20;
cout<<a<<endl;
改b,也相当于a,a,b一起绑定了
看到这个代码的时候的深层理解
把它看成内存
可不可以让b也代表这块内存,就起个别名。
在C语言中可以用malloc
注意事项
int a=10;
int &b=a;
1.引用必须要初始化,要赋值
int &b;//错误的
2.引用一旦初始化后不可以更改
假如说又有一个变量
int c=20;
一旦b成为了a的别名,就不能再用c的别名了
引用做函数参数
作用:函数传参时,可以利用引用的技术让形参修饰实参
有点:可以简化指针修改实参
#include<iostream>
using namespace std;
//交换函数
//值传递
void swap1(int a,int b){
int t=a;
a=b;
b=t;
}
//地址传递
void swap2(int *a,int *b){
int t=*a;
*a=*b;
*b=t;
}
//引用传递
void swap3(int &a,int &b){//括号里的是起的别名,因为形参,和原来变量一样的别名也可以
int t=a;//这个t就是个int型局部变量。
a=b;
b=t;
}
//引用与地址传递比较起来更简便一点
int main(){
int a=10;
int b=20;
swap3(a,b);
cout<<a<<endl;
cout<<b<<endl;
return 0;
}
引用做函数返回值
作用
注意:
1.不要返回局部变量的引用 因为局部变量会被编译器释放
#include<iostream>
using namespace std;
int & test(){
int a=10;//局部变量存放再四区中的栈区
return a;
}
int main(){
int &r=test();
cout<<r<<endl;
cout<<r<<endl;
return 0;
}
这点性质还是栈区的局部变量的性质
2.函数的调用可以作为左值
#include<iostream>
using namespace std;
int & test(){
static int a=10;//静态变量存放在全局区 ,整个程序执行完才会被释放
return a;
}
int main(){
int &r=test();
cout<<r<<endl;
cout<<r<<endl;
test()=1000;// 因为这个函数返回的是a
cout<<r<<endl;
cout<<r<<endl;
return 0;
}
引用的本质
本质:引用的本质在C++内部实现是一个指针常量
#include<iostream>
using namespace std;
//发现是引用,转换为int*const ref=&a;
//所以指针的本质就是一个指针常量
//引用一旦初始化后,就不可以发生改变
//但可以改变变量的值
int fun(int &ref ){
ref =100;
return ref; // ref是引用,转换为*ref=100
}
int main(){
int a=10;
//自动转换位int*const ref =&a;
//指针常量是指针指向不可改,也就说明了为什么引用不能更改
int &ref=a;
ref=20;//内部发现ref是引用,自动帮我们转换为*ref=20 ;
cout<<a<<endl;
cout<<ref<<endl;
return 0;
}
所有指针的操作编译器都帮我们做了
常量引用
作用: 常量引用主要用来修饰形参,防止误操作
在函数形参列表中,可以加const修饰形参,防止形参改变实参。
不用const的例子:
#include<iostream>
using namespace std;
void fun(int &ref ){
ref=100;
cout<<ref <<endl;
}
int main(){
int a=10;
//int &ref=a;
//int &ref=10;这个不对,引用必须引用一块合法的内存空间
//加上const之后 编译器将代码修改 int temp=10; const int &ref =t;
const int &ref=10;
//ref=20;错误,加入const之后只读,不可修改
fun(a);
cout<<a<<endl;
return 0;
}
可见误操作,改变了a的值
为了防止误操作
void fun(const int &ref ){
// ref=100;这行会报错。
cout<<ref <<endl;
}