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
相关产品推荐
相关产品推荐

