C++ 系统学习日记・第 01 天|引用全集(基础语法 + 底层本质 + 函数参数 + 返回值 + 禁忌)

9 阅读5分钟

📖 学习信息

本篇完整梳理 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;
}

核心结论:

  1. 两者地址完全一致,共用一块内存
  2. 修改任意一方,双方都会改变

三、引用三大强制规则

  1. 引用必须初始化不允许只声明不绑定变量
int &b;   // 非法,直接报错
  1. 引用一旦绑定,不可修改指向看似赋值,本质只是修改值,不是更换引用目标
int a = 10;
int c = 20;
int &b = a;

b = c;  
// 只是把c的值赋值给a,b依旧引用a,没有换指向
  1. 不能引用临时值、常量(普通引用)
int &a = 10;   // 错误

四、重中之重:引用底层本质

1. 表层假象

看起来只是别名,无内存、无指针

2. 编译器底层真实实现

C++ 引用的本质:被const修饰的指针

// 开发者写的引用代码
int &b = a;

// 编译器底层自动转化
int* const b = &a;

3. 对应特性

  • int* const指针指向不可修改,指向的数据可以修改
  • 为什么引用不能换指向?👉 因为是 const 指针
  • 为什么不用手动取地址、解引用?👉 编译器**自动隐藏了取地址 & 和解引用 *** 操作,语法更简洁

4. 总结一句话

引用 = 语法层面的别名引用 = 底层层面的常量指针


五、引用做函数参数(高频用法)

1. 传统值传递缺点

  • 形参是实参的拷贝,占用内存
  • 函数内修改形参,不会影响外部实参

2. 引用传递优势

  1. 不需要拷贝数据,效率极高
  2. 函数内修改形参,直接修改外部实参
  3. 语法比指针简单、安全

代码示例

#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 字节内存
操作方式无需解引用,直接使用需要 * 解引用
安全性无野引用,更安全容易出现野指针
适用场景函数传参、简单别名复杂地址操作、动态内存

九、引用所有禁止操作(避坑大全)

  1. 普通引用不能引用常量、字面量
  2. 不能返回局部变量引用
  3. 引用不能数组、不能二级引用(基础阶段)
  4. 引用一旦绑定,无法更换目标
  5. 不能定义空引用

十、全篇最终总结

  1. 表层:引用是变量别名,共享内存,简化代码;

  2. 底层:本质是 int* const 常量指针,由编译器自动处理地址;

  3. 核心用途

    • 函数引用传参:提升效率、修改实参
    • 常引用:只读保护数据
    • 引用返回值:实现链式调用
  4. 设计初衷:保留指针的能力,弱化指针的危险与繁琐,C++ 核心特性之一。