int&参数用于修改实参,比指针更安全;const t&避免大对象拷贝;小类型不宜盲目引用;返回引用需确保生命周期;const&可绑定并延长临时对象寿命。

需要修改实参值的函数调用
当函数逻辑必须改变外部变量时,int& 类型参数是首选。比如 swap、parse_config 或任何“输出型参数”场景。它比指针更安全:不会出现 nullptr 解引用,也不用写 *p 或 &x 这类语法噪音。
常见错误现象:void inc(int x) { x++; } 调用后原变量不变——这是值传递的典型陷阱,不是 bug,而是设计如此。换成 void inc(int& x) { x++; } 就能直接生效。
- 必须确保传入的是左值(如变量、数组元素),不能传字面量或临时对象(除非加
const&) - 函数签名清晰表达“此参数可被修改”,比指针语义更明确
- 多个引用参数同时修改时,注意操作顺序依赖(例如
swap(a, a)是未定义行为)
传递大对象避免拷贝开销
对结构体、容器或自定义类(比如含 std::vector<int></int> 成员的类),用 const T& 作只读输入参数,或 T& 作可写输入参数,能跳过深拷贝。编译器不会为引用分配新内存,只是传地址,但语法上完全屏蔽了指针操作。
性能影响明显:一个含百万 int 的 std::array,值传递可能触发数 MB 内存复制;引用传递始终是常数时间(通常 8 字节地址)。
- 不要对小类型(如
int、char、bool)盲目套用引用——现代编译器常把它们放寄存器,引用反而增加间接访问成本 - 若只读,务必加
const:既防止误改,也允许传临时对象(如func(std::string("hello"))) - 传
std::string_view或span比传const std::string&更轻量,但需 C++17+ 支持
配合运算符重载和链式调用
重载 +=、=、[] 等操作符时,返回 T& 是标准做法。这使得 a += b += c 或 v[0] = v[1] = 42 这类链式赋值合法且高效。
关键约束:返回的引用必须指向生命周期长于表达式求值的对象。返回局部变量的引用(如 return T();)会制造悬空引用,运行时崩溃风险极高。
- 返回成员变量引用(
return data_;)安全,前提是对象本身还活着 - 返回静态变量或全局变量引用可行,但要注意线程安全与可重入性
- 返回函数参数引用(如
T& operator=(const T& other)中return *this;)是惯用法,无生命周期问题
容易被忽略的边界:临时对象与 const 引用
非 const 引用(T&)不能绑定到临时对象,这是硬性限制。但 const T& 可以,且会延长该临时对象的生命周期至引用作用域结束——这是唯一能让临时对象“活下来”的合法方式。
例如 const std::string& s = "hello" + std::string(" world"); 合法;而 std::string& s = ... 编译直接报错。这个规则常被用于包装工厂函数返回值,但要注意:一旦函数返回的是局部对象(非 static),即使加 const& 也无法挽救悬空问题。
真正危险的是隐式转换链:比如 void f(const std::string& s) 接收 "abc" 时,会构造临时 std::string 并绑定,没问题;但若中间涉及多层用户定义转换,生命周期延长规则不穿透所有环节,容易误判。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











