C++——引用
目录
举个例子:
引用的基本特性
引用的定义语法如下:
1. 引用必须初始化:
2. 引用是别名:
3. 引用不能为空:
4. 引用不能重新绑定:
引用的使用场景
函数参数传递:
函数返回值:
引用 vs 指针
在 C++ 中,引用是一个非常重要的特性,它允许我们为变量创建一个别名。引用本质上是一个已存在变量的另一个名字,通过引用可以直接操作原始变量,而不需要通过指针的间接访问。引用在函数参数传递、返回值优化等场景中非常有用。
举个例子:
引用是一个变量的别名
-
别名 的意思是“另一个名字”。
-
比如,你有一个朋友叫“张三”,他的小名是“小三”。无论是叫“张三”还是“小三”,都是在指同一个人。
-
在 C++ 中,引用就是给变量起了一个“小名”,通过这个小名可以直接访问原始变量。
int a = 10; // 定义一个变量 a(原始变量),值为 10
int &ref = a; // 定义 ref 是 a 的引用(别名,也就是上面提到“小名”)
-
这里,
ref
就是a
的别名。 -
无论是操作
a
还是操作ref
,实际上都是在操作同一个变量。
通过引用可以直接操作原始变量
-
因为引用是变量的别名,所以通过引用可以直接修改原始变量的值。
-
不需要通过指针的间接访问,也不需要拷贝数据。
int a = 10; // 定义一个变量 a,值为 10
int &ref = a; // 定义 ref 是 a 的引用ref = 20; // 通过 ref 修改 a 的值
cout << a; // 输出 20
-
在上面的代码中:
-
ref = 20;
这行代码通过引用ref
修改了变量a
的值。 -
最终,
a
的值变成了20
。
-
引用和原始变量共享同一块内存
-
引用和原始变量实际上是同一个东西,只是名字不同。
-
它们共享同一块内存地址,因此修改引用就是修改原始变量。
int a = 10; // 定义一个变量 a,值为 10
int &ref = a; // 定义 ref 是 a 的引用cout << &a << endl; // 输出 a 的地址
cout << &ref << endl; // 输出 ref 的地址(和 a 相同)
-
在上面的代码中:
-
&a
是变量a
的地址。 -
&ref
是引用ref
的地址。 -
你会发现,
&a
和&ref
的值是相同的,因为它们指向同一块内存。
-
引用的基本特性
引用的定义语法如下:
数据类型 &引用名 = 变量名;
1. 引用必须初始化:
-
引用在定义时必须初始化,且一旦初始化后,不能再绑定到其他变量。
int a = 10; int &ref = a; // ref 是 a 的引用
-
int &ref
:表示ref
是一个int
类型的引用。 -
= a
:表示ref
是a
的别名。
2. 引用是别名:
-
引用和原始变量共享同一块内存地址,修改引用就是修改原始变量。
int a = 10; int &ref = a; ref = 20; // 修改 ref 就是修改 a cout << a; // 输出 20
3. 引用不能为空:
-
引用必须绑定到一个有效的变量,不能像指针一样指向
nullptr
。
4. 引用不能重新绑定:
-
引用一旦初始化后,不能再绑定到其他变量。
int a = 10; int b = 20; int &ref = a; ref = b; // 这是将 b 的值赋给 a,而不是将 ref 重新绑定到 b
引用的使用场景
函数参数传递:
-
引用可以作为函数参数,避免拷贝大对象,同时允许函数修改原始数据。
函数返回值:
-
引用可以作为函数返回值,避免返回值的拷贝。
setMaxData函数:
- 接收两个整数的引用作为参数
- 比较这两个整数
- 返回较大的那个整数的引用(不是值,而是引用本身)
main
函数
-
定义两个整数变量
a
(10) 和b
(20) -
调用
setMaxData(a, b)
,这会返回b
的引用(因为20 > 10) -
将100赋值给这个返回的引用,实际上就是给
b
赋值 -
输出结果:
a
仍然是10,b
现在是100