引用参数必须用T&声明,调用时直接传变量名;const T&可安全高效传递大对象并绑定临时对象;非const引用不能绑定字面量或临时对象,且不适用于需空值、所有权转移或左右值重载的场景。

引用参数怎么传:必须用 & 声明,调用时不加 &
函数声明里写 T& 表示接受引用,调用时直接传变量名就行,不是传 &var。常见错误是以为“引用就得取地址”,结果传了 &x 导致类型不匹配(变成 T** 或临时指针)。
典型写法:
void modify(int& x) { x = 42; }
int a = 10;
modify(a); // ✅ 正确:传变量本身
// modify(&a); // ❌ 错误:&a 是 int*,不匹配 int&
- 引用参数本质是别名,不分配新内存,也不触发拷贝构造
- 只能绑定到左值(有名字、能取地址的对象),不能绑定字面量或临时对象(除非是 const 引用)
- 函数内对引用的修改会直接影响原变量,这点和指针不同——你不用解引用,也不存在空引用风险
const 引用传大对象:安全又高效
当函数只读不改,且参数是大对象(如 std::vector、std::string、自定义类),优先用 const T&。它既能避免深拷贝,又防止意外修改,还能绑定临时对象(编译器会延长其生命周期)。
- 没 const?无法绑定临时对象:
process(get_data())会编译失败,除非参数是const T&或T&& - 比指针更安全:无需检查是否为空,语法更接近值语义
- 比移动语义更通用:移动只适用于右值,而 const 引用左右值都接得住
什么时候不该用引用参数?小心这三类场景
引用不是万能的,乱用反而引入 bug 或限制接口灵活性。
立即学习“C++免费学习笔记(深入)”;
- 想让函数拥有对象所有权?别用引用——该用值传递(触发移动)或智能指针(
std::unique_ptr) - 参数可能为 null?引用不能为 null,此时必须用指针(
T*)并明确文档约定 - 要重载区分左值/右值?单靠
T&不够,得配合T&&和完美转发(std::forward),否则右值会被静默转成 const 引用,失去移动机会
性能差异真有多大?看拷贝构造开销
是否省拷贝,取决于类有没有自定义拷贝构造函数,以及它干了什么。内置类型(int、double)传值和传引用几乎没差别;但一个含 1MB 数据的 std::vector,传值意味着分配新内存 + memcpy,而引用只是传个地址(8 字节)。
- 用
clang++ -Xclang -ast-dump或编译器 explorer 查看是否调用了拷贝构造函数 - 注意隐式拷贝:返回局部对象、传入非 const 引用参数时绑定临时对象(非法),都会触发拷贝或编译报错
- 现代编译器可能 RVO/NRVO 优化掉部分拷贝,但引用参数是确定性规避手段,不依赖优化级别
真正容易被忽略的是 const 引用和右值引用的分工:一个保安全,一个保效率;混用或漏掉 const,会让本可移动的右值被迫走 const 引用路径,白白丢掉性能。










