在 C++ 中,&a(引用)和 a(值传递) 的关键区别在于 参数如何传递给函数,以及由此引发的 性能、语义和安全问题。
最核心的在于你想不想传入的参数被改变,如果想,就用参数传递,不过不想,就用值传递。比如:
如果你希望 x 被修改,必须使用 引用传递:
<CPP>
void increment(int& num) { num++; } // ✅ 引用传递,修改 x
int main() {
int x = 10;
increment(x); // x 变为 11
std::cout << x; // 输出 11
return 0;
}
而若使用 传值拷贝:
<CPP>
void increment(int num) { num++; } // ❌ 仅修改副本
int main() {
int x = 10;
increment(x); // x 仍为 10
std::cout << x; // 输出 10
return 0;
}
关键结论
| 传递方式 | 语法 | 是否影响原变量 | 解释 |
|---|---|---|---|
| 传引用 | void f(int&) | ✅ 影响 | 修改 num 即直接修改传入的变量 x。 |
| 传值 | void f(int) | ❌ 不影响 | 函数内获得 x 的副本,修改不影响原变量。 |
1. 语义和底层行为
| 传递方式 | const Point& a (常量引用) | Point a (值传递) |
|---|---|---|
| 底层操作 | 传递的是 a 的 地址(类似指针但不需解引用) | 传递的是 a 的 完整拷贝(调用拷贝构造函数) |
| 修改权限 | 不可修改 a(因 const 修饰) | 可修改 a(局部拷贝,不影响外部实参) |
| 开销 | 无拷贝,仅传递地址(高效) | 深拷贝所有成员(若 Point 很大则开销高) |











![[electron]预脚本不显示内联script](https://i-blog.csdnimg.cn/direct/db8776b223664dc7836ebf2ac3c85cb9.png)



![浏览器工作原理01 [#]Chrome架构:仅仅打开了1个页面,为什么有4个进程](https://i-blog.csdnimg.cn/img_convert/6a4a97cdbbb3b1ba61cf0f824dfd6c1e.png)


![[学习笔记]使用git rebase做分支差异化同步](https://i-blog.csdnimg.cn/direct/cfc67caffabd42248e2a5b5bc478a796.png)
