c++ 引用参数

在 C++ 中,引用参数 是指将函数的参数声明为「引用类型」(通过 & 标识),使得函数内对该参数的操作直接作用于实参本身(而非实参的副本)。核心作用是:避免拷贝大对象、允许函数修改实参、保持传参语法简洁。

一、先理解「引用」的本质

引用(Reference)是变量的「别名」(Alias)------ 它不占用独立内存,只是对已有变量的另一个称呼。比如:

复制代码
int a = 10;
int& ref = a; // ref 是 a 的引用(别名)
ref = 20;     // 操作 ref 等价于操作 a
cout << a;    // 输出 20

引用的核心特性:

  1. 必须在声明时初始化(不能先定义 int& ref; 再赋值);
  2. 一旦绑定某个变量,无法再绑定其他变量(终身绑定);
  3. 不存在「空引用」(必须绑定有效变量)。

二、引用参数的定义与作用

将引用作为函数参数时,函数接收的是「实参的别名」,而非副本。对比「值传递」(拷贝实参)更易理解:

1. 基础语法(值传递 vs 引用传递)
复制代码
// 1. 值传递:函数接收实参的副本,修改副本不影响实参
void modifyValue(int x) {
    x = 100; 
}

// 2. 引用传递:函数接收实参的别名,修改别名即修改实参
void modifyRef(int& x) {
    x = 100;
}

int main() {
    int a = 10;
    modifyValue(a); 
    cout << a << endl; // 输出 10(副本被改,实参不变)

    modifyRef(a);
    cout << a << endl; // 输出 100(实参被直接修改)
    return 0;
}
2. 核心作用
(1)允许函数修改实参

这是引用参数最常用的场景之一 ------ 替代 C 语言的「指针传参」,语法更简洁(无需解引用 *)。比如交换两个数:

复制代码
// 引用版(简洁)
void swap(int& a, int& b) {
    int temp = a;
    a = b;
    b = temp;
}

// 指针版(C风格,需解引用)
void swap(int* a, int* b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

int main() {
    int x=1, y=2;
    swap(x, y); // 引用版直接传变量,无需 &x
    // swap(&x, &y); // 指针版需传地址
    cout << x << "," << y; // 输出 2,1
}
(2)避免拷贝大对象,提升性能

如果参数是「大结构体 / 类对象」(比如你之前的 CANMessagestd::stringstd::vector 等),值传递会拷贝整个对象(耗时 + 占内存),而引用传递仅传递别名,无拷贝开销。

(3)const 引用:只读不修改,兼容临时值

如果只想「读取」实参,不想修改,需用 const 引用(const T&)------ 既避免拷贝,又保证实参不被修改,还能接收临时值(如字面量、表达式结果)。

复制代码
// const 引用参数:只能读,不能改
void printConstRef(const CANMessage& msg) {
    cout << msg.frameId << endl;
    // msg.frameId = 0x300; // 报错:const 引用禁止修改
}

int main() {
    CANMessage msg{0x209, "data"};
    printConstRef(msg); // 正常传参
    // 可接收临时对象(值传递也可以,但 const 引用更高效)
    printConstRef(CANMessage{0x400, "temp data"});
    return 0;
}
相关推荐
汉克老师27 分钟前
CSP-J 2026 初赛试题解析(第一部分:选择题(8-15))精讲
c++·csp-j·小学生·学c++编程
wabs6661 小时前
关于二叉树【力扣572.另一棵树的子树的思考】
数据结构·c++·算法·leetcode·二叉树
hanlin031 小时前
刷题笔记:力扣第41题-缺失的第一个正数
笔记·算法·leetcode
shehuiyuelaiyuehao2 小时前
算法50,分治归并,数组中的逆序对
java·算法
风合星语2 小时前
2026 ROS 2 Lyrical C++ 入门(五):Action 实战——任务反馈、取消与超时处理
c++·机器人·ros2·异步编程·lyrical
阳明山水2 小时前
校准分位数驱动智能库存决策
人工智能·深度学习·算法·机器学习·架构
91刘仁德3 小时前
C++ 继承和多态 设计模式
c语言·c++·笔记
库玛西3 小时前
哈夫曼树与前缀编码:数据压缩的贪心核心
c语言·c++·笔记·考研
别动我齐刘海3 小时前
ROS2 Jazzy + C++ 实战路线——进阶学习3
c++·人工智能·vscode·python·算法·机器学习·机器人
zhangfeng11333 小时前
《从“人工适配“到“智能生成“:KernelSwift 跨国产芯片算子迁移全栈方案解读》 —— 强调范式跃迁和跨硬件属性,适合偏架构分析的写法
人工智能·算法·华为·ai编程·npu