引用的基本使用
作用:给变量其别名
语法:数据类型 &别名 = 原名
#include<iostream>
using namespace std;
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;
}
a=10
b=10
a=100
b=100
引用的注意事项
引用必须初始化
引用在初始化后不可以改变
int a = 10;
int &b = a;
引用做函数参数
作用:函数传参时,可以利用引用的技术让形参修饰实参
优点:可以简化指针修改实参
#include<iostream>
using namespace std;
//1.值传递
void swap01(int a, int b) {
int temp = a;
a = b;
b = temp;
}
//2.地址传递
void swap02(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
//3.引用传递
void swap03(int& a, int& b) {
int temp = a;
a = b;
b = temp;
}
int main() {
int a = 10;
int b = 20;
swap01(a, b); //值传递时,形参不会修饰实参
cout << " swap01 a = " << a << endl;
cout << " swap01 b = " << b << endl;
swap02(&a,&b); //地址传递时,形参会修饰实参
cout << " swap02 a = " << a << endl;
cout << " swap02 b = " << b << endl;
swap03(a,b); //引用传递时,形参会修饰实参
cout << " swap03 a = " << a << endl;
cout << " swap03 b = " << b << endl;
}
引用做函数返回值
1.不要返回局部变量的引用
2.如果函数的返回值是一个引用,那么函数的调用可以作为左值
#include<iostream>
using namespace std;
int& test01() {
int a = 10; //局部变量存放在栈区
return a;
}
// 返回静态变量引用
int& test02() {
//静态变量存放在全局区,全局区上的数据在程序结束后由系统释放
static int a = 10; //使用static增加程序的生命周期
return a;
}
int main() {
//不能返回局部变量的引用
int& ref1 = test01();
cout << "ref1 = " << ref1 << endl; //结果错误,因为a的内存已经被释放
//如果函数做左值,那么必须返回引用
int& ref2 = test02();
cout << "ref2 = " << ref2 << endl;
cout << "ref2 = " << ref2 << endl;
test02() = 1000;
cout << "ref2 = " << ref2 << endl;
cout << "ref2 = " << ref2 << endl;
}
ref1 = -858993460
ref2 = 10
ref2 = 10
ref2 = 1000
ref2 = 1000
引用的本质
本质是在C++内部实现一个指针常量
C++更推荐使用引用,因为语法方便
int a = 10;
int &b = a;
上面定义的引用等价于下面定义的指针常量,指向不可以修改,但是值可以修改
int a = 10;
int * const b = &a;
常量引用
作用:常量引用主要用来修饰形参,防止误操作
在函数形参列表中,可以加const修饰形参,防止形参改变实参
const int &ref = 10;
上面的代码等价于下面的代码
int temp = 10;
const int &ref = temp;
#include<iostream>
using namespace std;
void print(const int& val) { //增加const后,可以防止误修改a的值
// int val = 1; 此时val的值是不可以修改的
cout << " val = " << val << endl;
}
int main() {
int a = 1000;
print(a);
}