引用的基本使用
- 作用:给变量起别名
- 语法:数据类型 & 别名 = 原名
- 例子如下:
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;
return 0;
}
输出结果
10 10 100 100
引用的注意事项
- 引用必须初始化,并且不能初始化为空。
- 使用对象作为实参来初始化引用:将实参的值传递给引用。例如:void func(int& ref) { ... },可以通过int x = 10; func(x);来将x的值传递给引用ref。
- 使用其他引用初始化引用:一个引用也可以通过另一个引用进行初始化。例如:void func(int& ref1, int& ref2) { int& ref3 = ref1; ... },在这个例子中,ref3通过ref1进行初始化。
- 引用在初始化后,不可以改变。
int main() {
int a = 10, b = 20;
int &c = a;//一旦初始化后,就不可以更改
c = b; //此乃赋值操作,非更改引用也
cout << a << endl;
cout << b << endl;
cout << c << endl;
return 0;
}
输出结果:20 20 20
引用的本质
- 在c++内部实现是一个指针常量
示例:
#include<iostream>
using namespace std;
void func(int& ref)
{
ref = 100; //转换为*ref=100;
}
int main() {
int a = 10;
int& ref = a; //转换为int* ref = &a;
ref = 20; //内部发现ref是引用,自动转换*ref=20;
cout << a << endl;
cout << ref << endl;
func(a);
cout << ref;
return 0;
}
引用做函数参数
- 函数传参时,可以利用引用让形参和实参代表同一块内存
- 优点:简化指针修改实参,和址传递相同,引用的语法更简单。
示例:
#include<iostream>
using namespace std;
void Swap01(int a, int b) { //值传递
int temp = a;
a = b;
b = temp;
}
void Swap02(int* a, int* b) { //址传递
int temp = *a;
*a = *b;
*b = temp;
}
void Swap03(int& a, int& b) { //引用传递
int temp = a;
a = b;
b = temp;
}
int main() {
int a = 10, b = 20;
Swap01(a,b);
cout << a <<" " << b << endl; //输出为10 20。改变形参,实参不变
Swap02(&a, &b);
cout << a << " " << b << endl; //输出为20 10。进行了实参的交换
Swap03(a, b);
cout << a << " " << b << endl; //输出为10 20。前面进行了一次实参的交换,Swap03再次交换实参。
return 0;
}
引用做函数返回值
- 作用:引用可以作为函数的返回值
- 用法:函数调用作为左值
- 注意:不能返回局部变量的引用
有名字的变量叫左值,例如:a=1,a是左值。
右值,例如:2 , 2就是右值。
代码如下:
int main()
{
int&& R = 2;//右值引用只能接收左值
int a = 2;
int& R1 = a;//左值引用只能接收左值
return 0;
}
错误代码如下:
int main()
{
int &&R2 = a;//右值和左值,报错
int& R3 = 2;//左值和右值,报错
return 0;
}
常量引用(万能引用)
- 作用:修饰形参,防止形参改变实参
void func(const int& v)
{
v+=10;//此处报错,加了const防止修改
cout << v;
}
int main()
{
int a = 10;
func(a);
return 0;
}