append() 是原地修改,+ 运算符创建新字符串;append() 适合循环累积、复用容量、避免临时对象,+ 适合简洁表达式;性能上 + 最坏 O(N²),append() 可达 O(N)。

append() 和 + 运算符都能拼接,但行为本质不同
append() 是原地修改字符串对象,不产生临时对象;+ 运算符会构造并返回一个新 std::string,原字符串不变。这意味着频繁用 + 拼接(比如循环中)可能触发多次内存分配和拷贝,而 append() 更可控。
什么时候该用 append()?
适合已知要逐步累积内容的场景,比如构建日志、拼接 SQL、读取多段输入后合并:
-
append()支持多种参数形式:s.append("hello")、s.append(other_str, 2, 4)(从索引 2 开始取 4 字符)、s.append(5, 'x')(追加 5 个'x') - 可复用已有容量:如果
s.capacity()足够大,append()可能避免重新分配 - 想避免隐式构造临时
std::string(比如传入 C 风格字符串时)
什么时候 + 运算符更自然?
适合表达式简洁优先、拼接项少且生命周期明确的场合:
- 一行内组合几个字面量或变量:
auto path = dir + "/" + name + ".txt" - 函数返回值直接拼接:
return prefix + get_name() + suffix - 编译器对短字符串常有优化(如 SSO 下的小字符串拼接可能不触发堆分配)
注意:"a" + "b" 是非法的——C 风格字符串字面量之间不能直接用 +,必须至少有一个是 std::string 或 std::string_view(C++17 起支持 operator+ 重载)。
立即学习“C++免费学习笔记(深入)”;
性能差异实际有多大?
在循环中拼接 N 次字符串时,+ 的最坏情况是 O(N²) 时间复杂度(每次新建 string 并拷贝前面所有内容),而 append() 是 O(N),前提是提前调用 reserve() 避免多次扩容:
std::string s;
s.reserve(1000); // 预分配足够空间
for (int i = 0; i < 100; ++i) {
s.append(std::to_string(i));
s.append(",");
}
没 reserve() 的 append() 也可能多次 realloc,但比反复构造新 std::string 好得多。真正容易被忽略的是:+= 实际调用的就是 append(),语义等价且写法更简洁。










