在 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 很大则开销高) |