📖 学习信息
本篇完整梳理 C++ 引用全量知识点,从引用基础概念、语法规则、使用示例入手,结合底层本质深入剖析:引用语法层面为变量别名,底层实际由常量指针实现。同时详解引用在函数传参、函数返回值中的核心用法,补充常引用特性、引用与指针区别及各类使用禁忌与易错点,系统性掌握 C++ 引用的作用、原理与规范写法,夯实 C++ 基础核心语法。
学习课程:黑马 C++ 零基础入门教程
本日学习:C++ 引用 完整全模块包含:基础概念、语法规则、底层本质、引用做函数参数、引用做函数返回值、常引用、所有使用禁忌与坑点
注:作者这是第一次来这个平台发布文章,由于之前没有养成看视频做笔记的习惯,导致前面的大部分的残缺,我会尽快补齐前面的内容博客,希望大家谅解。
一、引用基础概念
1. 什么是引用
引用本质:给已存在的变量起一个别名
- 引用不会开辟新的内存空间
- 引用和原变量共用同一块内存地址
- 操作引用 = 直接操作原变量
通俗理解:
变量本名 = 本人引用 = 外号叫外号、改外号,都是在改本人
2. 引用基础语法
数据类型 &引用别名 = 原变量名;
示例:
int a = 10;
// b 是 a 的引用(别名)
int &b = a;
二、基础代码演示
#include <iostream>
using namespace std;
int main()
{
int a = 100;
int &b = a;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "a地址:" << &a << endl;
cout << "b地址:" << &b << endl;
// 修改引用,原变量同步变化
b = 200;
cout << "修改后 a = " << a << endl;
return 0;
}
核心结论:
- 两者地址完全一致,共用一块内存
- 修改任意一方,双方都会改变
三、引用三大强制规则
- 引用必须初始化不允许只声明不绑定变量
int &b; // 非法,直接报错
- 引用一旦绑定,不可修改指向看似赋值,本质只是修改值,不是更换引用目标
int a = 10;
int c = 20;
int &b = a;
b = c;
// 只是把c的值赋值给a,b依旧引用a,没有换指向
- 不能引用临时值、常量(普通引用)
int &a = 10; // 错误
四、重中之重:引用底层本质
1. 表层假象
看起来只是别名,无内存、无指针
2. 编译器底层真实实现
C++ 引用的本质:被const修饰的指针
// 开发者写的引用代码
int &b = a;
// 编译器底层自动转化
int* const b = &a;
3. 对应特性
int* const:指针指向不可修改,指向的数据可以修改- 为什么引用不能换指向?👉 因为是 const 指针
- 为什么不用手动取地址、解引用?👉 编译器**自动隐藏了取地址 & 和解引用 *** 操作,语法更简洁
4. 总结一句话
引用 = 语法层面的别名引用 = 底层层面的常量指针
五、引用做函数参数(高频用法)
1. 传统值传递缺点
- 形参是实参的拷贝,占用内存
- 函数内修改形参,不会影响外部实参
2. 引用传递优势
- 不需要拷贝数据,效率极高
- 函数内修改形参,直接修改外部实参
- 语法比指针简单、安全
代码示例
#include <iostream>
using namespace std;
// 引用传递
void swap(int &x, int &y)
{
int temp = x;
x = y;
y = temp;
}
int main()
{
int a = 10;
int b = 20;
swap(a, b);
cout << a << " " << b << endl;
return 0;
}
原理:int &x = a,形参就是实参的别名,完全共享数据。
六、引用做函数返回值
1. 核心规则
不要返回局部变量的引用局部变量在函数执行完毕后会销毁,返回其引用会产生野引用,程序崩溃。
正确用法:返回静态变量 / 全局变量引用
int& test()
{
static int num = 10;
return num;
}
int main()
{
int &res = test();
res = 666;
return 0;
}
2. 链式调用
引用返回可以实现连续调用:
// 举例
func1().func2();
七、常引用 const &
1. 作用
防止通过引用修改原始数据,用于只读场景,修饰函数形参最常用。
2. 语法
const int &a = 100;
3. 典型场景
函数参数防止误修改:
void show(const int &x)
{
// x = 100; 报错,只读不可改
cout << x << endl;
}
4. 特性
常引用可以接收常量、临时数据,普通引用不行。
八、引用 vs 指针 完整对比
表格
| 对比项 | 引用(&) | 指针(*) |
|---|---|---|
| 初始化 | 必须初始化 | 可以先定义后赋值 |
| 指向修改 | 不可修改绑定目标 | 可以随意修改指向 |
| 内存占用 | 底层占内存,语法隐藏 | 占用 4/8 字节内存 |
| 操作方式 | 无需解引用,直接使用 | 需要 * 解引用 |
| 安全性 | 无野引用,更安全 | 容易出现野指针 |
| 适用场景 | 函数传参、简单别名 | 复杂地址操作、动态内存 |
九、引用所有禁止操作(避坑大全)
- 普通引用不能引用常量、字面量
- 不能返回局部变量引用
- 引用不能数组、不能二级引用(基础阶段)
- 引用一旦绑定,无法更换目标
- 不能定义空引用
十、全篇最终总结
-
表层:引用是变量别名,共享内存,简化代码;
-
底层:本质是
int* const常量指针,由编译器自动处理地址; -
核心用途:
- 函数引用传参:提升效率、修改实参
- 常引用:只读保护数据
- 引用返回值:实现链式调用
-
设计初衷:保留指针的能力,弱化指针的危险与繁琐,C++ 核心特性之一。