C++中两种字符串拼接的区别
大约 2 分钟
本文探讨C++中 s = s + 'A' 和 s += 'A' 的区别
原理
这里假设变量 s 的类型是 std::string。在C++中,当你执行s = s + 'A'时,实际上是创建了一个新的字符串。这是因为C++中字符串的+运算符被重载以连接字符串,其结果是一个新的字符串。
另一方面,当你执行s += 'A'时,这是一种原地操作,它通过将字符'A'附加到现有字符串s上来修改现有字符串。字符串的+=运算符被设计为修改现有字符串对象,而不是创建新的对象。这里的“原地”指修改同一个字符串对象;容量不足时,内部字符存储仍可能重新分配。
从效率的角度来看,s += 'A'可能比s = s + 'A'更高效,因为它有可能避免创建新的字符串对象,直接修改现有对象。
简而言之:
s = s + 'A':通过将现有字符串s和字符'A'连接起来创建一个新的字符串对象,然后将这个新字符串赋给s。s += 'A':通过将字符'A'附加到现有字符串s上来修改现有字符串。
一般来说,只是向现有字符串追加字符时,使用+=可能更高效。不过,s = s + 'A'同样会修改原始字符串,不能用来保留它的原值。若要保留原始内容,应把拼接结果赋给另一个变量。
案例
字符串字面量的拼接需要另作区分:"A" "B" 会在翻译阶段合成一个字符串字面量;"A" + "B" 不能编译,因为这里没有适用的加法运算。写成 std::string("A") + "B" 后,才会使用字符串的重载运算符完成拼接。
参考链接:
C++17 公开草案 N4659:[string.op+]、[string.op+=]、[lex.string]。