提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:以下是本篇文章正文内容,下面案例可供参考
一、什么是引用?
在C++中,引用(Reference)是一种别名,它是某个已存在变量的第二个名字。引用的概念类似于指针,但它没有间接访问(即不需要使用解引用操作符*
)和指针算术等指针的特性。引用在定义时必须初始化,并且一旦引用与某个变量关联后,就不能改变引用指向的对象。
引用的主要特点包括:
-
别名:引用是它所引用变量的别名,对引用的操作就是对原变量的操作。
-
必须初始化:引用在定义时必须被初始化,即必须给它分配一个已经存在的变量。
-
不可更改:一旦引用被初始化,它就不能再引用另一个变量。引用的“生命”期间只能绑定到初始化时指定的那个变量。
-
与原变量共享内存:引用并不拥有自己的内存空间,它与原变量共享相同的内存。
-
使用方便:由于不需要解引用,引用的使用比指针更直观、更方便。
-
不能指向空值:引用必须始终指向一个有效的对象。
-
语法糖:在某些情况下,引用可以看作是语法糖,例如函数参数中的引用可以避免值传递时的拷贝开销。
它和它引⽤的变量共⽤同⼀块内存空间。⽐如:⽔壶传中李逵,宋江叫"铁⽜",江湖上⼈称"⿊旋
⻛";林冲,外号豹⼦头;
类型& 引⽤别名 = 引⽤对象;
二、引用概念
1.引用的使用
引用的声明和使用
cpp
int a = 10;
int &ref = a; // ref 是 a 的引用
ref = 20; // 通过引用修改 a 的值
cout << a << endl; // 输出 20,因为 a 和 ref 指向同一内存位置
在这个例子中,ref 是变量 a 的引用。通过 ref 对变量的修改直接影响了 a 的值。
引用在函数中的应用
引用经常用作函数参数,以避免复制大型对象的开销,并且允许函数直接修改传入的变量。
cpp
void increment(int &value) {
value++;
}
int main() {
int x = 5;
increment(x);
cout << x << endl; // 输出 6
return 0;
}
在这个例子中,increment 函数接收一个 int 类型的引用作为参数,这样函数内部对 value 的修改会直接影响到 main 函数中的 x 变量。
• 引⽤在实践中主要是于引⽤传参和引⽤做返回值中减少拷⻉提⾼效率和改变引⽤对象时同时改变被
引⽤对象。
• 引⽤传参跟指针传参功能是类似的,引⽤传参相对更⽅便⼀些。
• 引⽤返回值的场景相对⽐较复杂,我们在这⾥简单讲了⼀下场景,还有⼀些内容后续类和对象章节
中会继续深⼊讲解。
• 引⽤和指针在实践中相辅相成,功能有重叠性,但是各有特点,互相不可替代。C++的引⽤跟其他
语⾔的引⽤(如Java)是有很⼤的区别的,除了⽤法,最⼤的点,C++引⽤定义后不能改变指向,
Java的引⽤可以改变指向。
• ⼀些主要⽤C代码实现版本数据结构教材中,使⽤C++引⽤替代指针传参,⽬的是简化程序,避开
复杂的指针,但是很多同学没学过引⽤,导致⼀头雾⽔。
2.引用的特性
• 引⽤在定义时必须初始化
• ⼀个变量可以有多个引⽤
• 引⽤⼀旦引⽤⼀个实体,再不能引⽤其他实体
#include<iostream>
using namespace std;
int main()
{
int a = 10;
// 编译报错:“ra”: 必须初始化引⽤
//int& ra;
int& b = a;
int c = 20;
// 这⾥并⾮让b引⽤c,因为C++引⽤不能改变指向,
// 这⾥是⼀个赋值
b = c;
cout << &a << endl;
cout << &b << endl;
cout << &c << endl;
return 0;
}
1
总结
①/②引用传参,减少拷贝 (直接操作传入的变量,而不是它们的副本) 引用简化了指针
形参加&
③引用返回 (临时对象具有常性,不能修改,可以取栈顶) 别名拷贝在前 销毁在后:所以可以加
→
top做返回值加引用&也不行 局部变量在函数返回后就被销毁了
主要关注的是这个空间值还在不在跟* &无关
没有给数组取别名的概念
【在引用上加了权限操作,其实也是引用】