C++;文字字符串串联 我有一个关于C++中字符串连接的问题。 string str = "ab" + 'c'; cout << str << endl; char ch = 'c'; string str1 = "ab"; string str2 = str1 + ch; cout << str2 << endl;

C++;文字字符串串联 我有一个关于C++中字符串连接的问题。 string str = "ab" + 'c'; cout << str << endl; char ch = 'c'; string str1 = "ab"; string str2 = str1 + ch; cout << str2 << endl;,c++,string,concatenation,C++,String,Concatenation,有人能解释一下这行的处理方法吗:string str=“ab”+“c” string str = "ab" + 'c'; 字符串文字不能像那样连接“ab”是一个字符数组,它将衰减为指针(在本上下文中),您将添加'c',它是指针的一个整数。因此指针前进了ascii值'c' 也就是说,上述代码相当于: char char * s= "ab"; string str = &s['c']; //the ascii value of 'c' acts like an index to the a

有人能解释一下这行的处理方法吗:
string str=“ab”+“c”

string str = "ab" + 'c';
字符串文字不能像那样连接
“ab”
是一个字符数组,它将衰减为指针(在本上下文中),您将添加
'c'
,它是指针的一个整数。因此指针前进了ascii值
'c'

也就是说,上述代码相当于:

char char * s= "ab";
string str = &s['c']; //the ascii value of 'c' acts like an index to the array. 
我相信那不是你的本意。实际上,它调用了未定义的行为,因为
&s['c']
引用的内存区域可能不在进程的地址空间中


您实际想要做的事情(即连接)的简短形式是:

string str = string("ab") + "c";

你关于第一行的想法是正确的,这正是发生的事情

对于像
“ab”
这样的文本字符串,没有任何默认的
+
运算符,因此编译器会将其作为C样式字符串,并使用指向文本的
常量char*
指针。然后,它接受您的文字字符
'c'
,并将其提升为具有某些值的
int
。然后将该int添加到文本的地址并用作C字符串。因为您已经超出了为文本字符串分配的空间,所以结果是未定义的,它只是从结果地址打印出字符,直到找到空值为止

如果您想一次创建字符串,您可以帮助编译器首先通过一个cast来确定您想要转换为
string
std::string str=std::string(“ab”)+“c”。或者(如单独的注释中所示)使用连接来实现,这可能会更好,也可能不会更好。在您的案例中使用更清晰的选项:
std::string str=“ab”;str+='c'


在第二种情况下,您已经创建了一个
string
,并且
string
有一个重载的
操作符+
,可以进行直观的连接。

您的猜测是正确的,除了string文本不在堆栈上之外,它在内存中特定于工具链的位置,通常在只读部分。

是一个
常量字符*
'c'
是一个
字符
。我的猜测是,
'c'
被转换成一个整数,所述整数被添加到
“ab”
的地址中,结果指针被传递到
std::string
的构造函数。你很幸运,它没有严重崩溃


有关如何正确进行连接,请参阅其他答案。

运算符重载仅适用于至少一个重载运算符的参数是用户定义类型(即类实例)的情况,因此不能重载+运算符来添加字符串和字符。做些明智的事情。充其量,您将得到正在执行的指针算法——几乎肯定不是您想要的。通常的解决方法是显式转换:

string s = string( "foo" ) + "bar";    // s will contain "foobar"

我认为
string str=“ab”+“c”的工作原理如下:

string tmp = stirng("ab"); // implicit conversion
tmp = tmp + 'c'; // uses overloaded + operator
str = tmp;
是一个C字符串

'c'
是一个人物

尝试:

如果您想让它更简单,通常有:

string str = "ab";
str += 'c';
或者,您可以使用
std::stringstream

stringstream ss;
ss << "ab" << 'c';
stringstreamss;

这是内置到C++中的:

#include <iostream>
#include <string>

int main()
{
    std::string s("Stand back! I've got jimmies!" "DDD");
    std::cout << "Stand back! I've got jimmies!" "DDD";
}

或者:
string str2=str1;str2+=ch-1
“ab”+“c”
不等同于
“ab”['c']
。前者是指针,后者是字符。@Rob:谢谢。更正。马克的答案是正确的。但是,请注意,您可以编写“ab”“c”,而不需要任何中间的+,预处理器将为您连接它们。
string str = "ab";
str += 'c';
stringstream ss;
ss << "ab" << 'c';
#include <iostream>
#include <string>

int main()
{
    std::string s("Stand back! I've got jimmies!" "DDD");
    std::cout << "Stand back! I've got jimmies!" "DDD";
}
Stand back! I've got jimmies!DDD