用+运算符拼接std::string最直接,要求至少一个操作数为std::string类型,否则如"hello"+"world"会因指针运算编译失败;正确写法是std::string在左或显式构造,+返回新字符串且不修改原对象。

用 + 运算符拼接 std::string 最直接
只要两个操作数都是 std::string 或可隐式转为 std::string(比如字符串字面量 "hello"),+ 就能安全拼接。它返回新字符串,原对象不变。
-
std::string a = "hello"; std::string b = "world"; auto c = a + " " + b;—— 没问题," "是 C 字符串字面量,会自动构造临时std::string - 但
"hello" + "world"编译失败:C 字符串字面量是const char*,两个指针不能直接+ - 如果一边是
std::string,另一边是char数组或const char*,也 OK,因为有对应重载
拼接时混用 char* 和 std::string 容易出错
常见错误是把 char* 放在左边、std::string 放右边,比如 "prefix" + s(s 是 std::string)。这会触发指针算术运算,不是拼接,而是把 s 的长度当偏移去访问内存 —— 行为未定义,大概率崩溃或乱码。
- 正确写法永远是让
std::string在左:s + "suffix"或std::string("prefix") + s - 如果只有 C 风格字符串,又想避免临时构造,可用
std::string::append()或+=原地追加 -
char buf[100]; sprintf(buf, "%s%s", str1.c_str(), str2.c_str());虽然可行,但不推荐:要手动管缓冲区大小、无类型安全、不支持 Unicode
std::string::append() 和 += 适合多次追加
当需要循环拼接、或拼接内容来自不同来源(比如从容器里逐个取)时,append() 或 += 比反复用 + 更高效,避免频繁分配临时对象。
-
s.append("a").append("b").append("c");—— 链式调用,只修改s本身 -
s += "x"; s += "y";等价于append(),语义更简洁 - 注意:如果初始
s很小,而最终拼接结果很大,提前调用s.reserve(总长度预估)能减少内存重分配次数
拼接含非 ASCII 字符(如中文)需确保编码一致
std::string 本身不关心编码,它只是字节容器。如果你用 UTF-8 编码的字面量(如 "你好"),和另一个 UTF-8 字符串拼接,结果仍是合法 UTF-8;但如果混入 GBK 或其他编码的字节,拼出来就是乱码,且后续 .length() 返回的是字节数而非字符数。
- 确认源文件保存为 UTF-8(无 BOM),编译器支持 UTF-8 字面量(C++11 起标准支持)
- Windows 控制台默认是 GBK,即使拼接正确,
std::cout 也可能显示乱码 —— 这不是拼接问题,是输出环境问题 - 真正需要 Unicode 意识的操作(如按字符截断、大小写转换)应使用
std::wstring或第三方库(如 ICU、utf8cpp)
const char* 和 std::string 的顺序,以及多字节字符的实际字节表现,最容易被忽略。C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











