You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

C++中string重载+运算符对字符数组与string的行为差异咨询

为什么char和string能相加,char和字符串字面量却不行?

这问题其实是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 + "{";

这里的achar*"{"const char*类型的字符串字面量——这俩都是指针类型!C里指针之间的+运算符是用来做地址偏移的(比如ptr + 1表示往后跳一个元素的地址),根本不是字符串拼接的意思。而且C不允许两个指针直接相加(这完全没有意义,会导致非法的地址计算),所以编译器会直接报错,因为找不到合法的operator+(char*, const char*)重载,也没有std::string对象来触发字符串拼接的重载逻辑。

解决办法

只需要把其中一个操作数转换成std::string,让编译器触发字符串拼接的重载就行:

// 把a转成string
s = string(a) + "{";
// 或者把字面量转成string
s = a + string("{");

另外也可以用std::stringappend方法,更直观:

s.append(a).append("{");

内容的提问来源于stack exchange,提问作者aromahola

火山引擎 最新活动