目录
通过引用,可以给变量取别名,并通过这个别名访问原变量的内存。
一、引用的语法与使用
引用的定义语法:数据类型 &别名 = 原名;
int a = 10;
int &b = a; //创建a的引用b
cout << "a = " << a << endl;
cout << "b = " << b << endl;
b = 1000; //修改b的值时,a的值也会被修改
cout << "a = " << a << endl;
cout << "b = " << b << endl;
a = 10
b = 10
a = 1000
b = 1000
请按任意键继续. . .
注:
- 定义引用时必须进行初始化;
- 引用初始化后,不可进行修改,即只能作为一个变量的引用。
二、引用与函数
1. 引用做函数参数
函数传参时可以利用引用的技术实现形参对实参的修饰,即通过改变形参来改变实参。
#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 = 5;
cout << "调用值传递交换函数前:" << endl;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
swap01(a, b);
cout << "调用值传递交换函数后:" << endl;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
//恢复初值
a = 10;
b = 5;
cout << "调用地址传递交换函数前:" << endl;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
swap02(&a, &b);
cout << "调用地址传递交换函数后:" << endl;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
//恢复初值
a = 10;
b = 5;
cout << "调用引用传递交换函数前:" << endl;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
swap03(a, b);
cout << "调用引用传递交换函数后:" << endl;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
system("pause");
return 0;
}
调用值传递交换函数前:
a = 10
b = 5
调用值传递交换函数后:
a = 10
b = 5
调用地址传递交换函数前:
a = 10
b = 5
调用地址传递交换函数后:
a = 5
b = 10
调用引用传递交换函数前:
a = 10
b = 5
调用引用传递交换函数后:
a = 5
b = 10
请按任意键继续. . .
2. 引用做函数返回值
- 函数返回值类型为引用时,不能返回局部变量的引用
- 函数返回值类型为引用时,函数调用可以作为左值
#include <iostream>
using namespace std;
int & sum(int a, int b) {
static int temp; //当函数返回值类型为引用时,不能返回局部变量的引用,因此定义静态变量
temp = a + b;
return temp;
}
int main() {
int a = 10;
int b = 5;
int &sums = sum(a, b);
cout << "sums = " << sums << endl;
sum(a, b) = 100; //当函数返回值类型为引用时,函数调用可以作为左值
cout << "sums = " << sums << endl;
system("pause");
return 0;
}
sums = 15
sums = 100
请按任意键继续. . .
三、引用的本质
引用在C++内部是通过指针常量实现的,因此引用具有指针常量的特性,即初始化后不可改变指向,但可以修改所指向内存的内容。即:
数据类型 &别名 = 原名;等价于 数据类型 * const 别名 = &原名;
int a = 10;
// 以下两行等级
int &b = a;
int * b = &a;
四、常量引用
常量引用主要用来修饰形参,防止误操作。即在函数的参数列表中,使用const修饰形参,防止形参对实参的修改。
#include <iostream>
using namespace std;
void showValue(const int &a) {
// a = 10; //报错,显示左值不可修改
cout << a << endl;
}
int main() {
//const修饰形参的情况
int a = 10;
showValue(a);
//定义引用时const直接修饰一个已知常值
//int & temp = 10; //报错
const int & temp = 10; //编译器首先生成一个临时变量赋值为10,再将这个临时变量赋值给引用:int a = 10; const int & temp = a;(a为临时变量,我们无法获取)
system("pause");
return 0;
}