You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中string与string&的区别是什么

C++ 中 string 与 string& 的核心区别和适用场景

本质差异

string 是 std::string 类的实体值类型,每个实例都拥有独立的内存空间存储字符串内容;string& 是 std::string 的左值引用,本质是原对象的别名,不占用独立的内存空间。
二者核心差异点如下:

  • 拷贝行为:string 作为参数传递、赋值给其他变量时会触发深拷贝,新对象和原对象完全独立,修改新对象不会影响原对象;string& 传递时没有任何拷贝开销,修改引用指向的内容等价于直接修改原对象
  • 合法性要求:string 可以默认初始化为空字符串,必然是合法实例;string& 必须绑定到已经存在的合法 string 对象,无法绑定空值,一旦绑定到已经销毁的对象就会变成悬垂引用,触发未定义行为

可以参考下方代码示例理解行为差异:

#include <string>
#include <iostream>

void modify_by_value(std::string s) {
    s += " 后缀";
    std::cout << "值参数内的结果:" << s << std::endl;
}

void modify_by_ref(std::string& s) {
    s += " 后缀";
    std::cout << "引用参数内的结果:" << s << std::endl;
}

int main() {
    std::string str = "测试字符串";
    modify_by_value(str);
    std::cout << "调用值参数函数后原字符串:" << str << std::endl; // 输出还是原内容,没有变化
    modify_by_ref(str);
    std::cout << "调用引用参数函数后原字符串:" << str << std::endl; // 原内容已经被修改
    return 0;
}

适用场景

选择 string 的场景

  • 需要独立的字符串副本,修改操作不能影响原对象
  • 作为函数返回值返回新生成的字符串,现代C++的返回值优化(RVO)会自动规避不必要的拷贝开销,不需要手动返回引用
  • 作为类的成员变量、全局变量存储生命周期独立的字符串数据

选择 string& 的场景

  • 函数需要直接修改传入的字符串参数,用string&比裸指针更安全,也更符合C++的编码习惯
  • 传递长度很大的字符串时,用string&可以避免深拷贝的性能损耗;如果不需要修改参数内容,优先用const string& 保证常量安全性
  • 遍历存储string的容器时,用string&接收元素可以直接修改容器内的原数据,同时避免拷贝开销

注意:禁止返回函数内部局部string变量的引用,局部变量会在函数执行结束后销毁,返回的引用会变成悬垂引用,访问时会触发不可预知的程序错误。

内容的提问来源于stack exchange,提问作者Bob Jiang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 20:54:05