C++中string重载+运算符对字符数组与string的行为差异咨询
这问题其实是C++里运算符重载和隐式转换的典型小陷阱,我给你拆解明白:
先看能正常运行的情况
你写的这段代码:
string s = ""; char a[5] = { 'f', 'i', 'r', 's', 't' }; char b[6] = { 's', 'e', 'c', 'o', 'n', 'd' }; s = a + string(b);
这里的关键是string(b)——你显式把char*类型的b转换成了std::string对象。此时a(数组退化为char*)和std::string对象相加时,编译器会触发std::string类重载的operator+(要么把a隐式转成std::string,要么直接调用接受const char*和std::string的重载版本),最终完成的是字符串拼接,所以能正常运行。
⚠️ 这里要提个小问题:你的a数组没有以'\0'结尾!C风格字符串必须以'\0'作为结束标志,直接用char a[5] = {'f','i','r','s','t'}初始化的话,转换成std::string或者当作C字符串使用时,会读取到内存里的垃圾数据,属于未定义行为。正确的写法应该是char a[] = "first";(编译器自动补'\0')或者char a[6] = {'f','i','r','s','t','\0'};。
再看报错的情况
这段代码:
string s = ""; char a[5] = { 'f', 'i', 'r', 's', 't' }; char b[6] = { 's', 'e', 'c', 'o', 'n', 'd' }; s = a + "{";
这里的a是char*,"{"是const char*类型的字符串字面量——这俩都是指针类型!C里指针之间的+运算符是用来做地址偏移的(比如ptr + 1表示往后跳一个元素的地址),根本不是字符串拼接的意思。而且C不允许两个指针直接相加(这完全没有意义,会导致非法的地址计算),所以编译器会直接报错,因为找不到合法的operator+(char*, const char*)重载,也没有std::string对象来触发字符串拼接的重载逻辑。
解决办法
只需要把其中一个操作数转换成std::string,让编译器触发字符串拼接的重载就行:
// 把a转成string s = string(a) + "{"; // 或者把字面量转成string s = a + string("{");
另外也可以用std::string的append方法,更直观:
s.append(a).append("{");
内容的提问来源于stack exchange,提问作者aromahola




