为什么name
在以下C++代码中行为不端?
string name = "ab"+'c';
等效代码在Java/C#中的行为如何?
尝试
std::string name = "ab" "c";
要么
std::string name = std::string("ab") + c;
在C++中,"ab"不是a std::string
,而是指向字符串的指针.向指针添加整数值时,会得到一个新指针,指向字符串的下方:
char *foo = "012345678910121416182022242628303234"; std::string name = foo + ' ';
name
被设置为"3234",因为''的整数值是32,并且在foo开头之后的32个字符是字符串结尾之前的四个字符.如果字符串较短,您将尝试访问未定义内存区域中的内容.
解决方法是从字符数组中生成一个std:string.std:strings允许您按预期将字符追加到它们:
std::string foo = "012345678910121416182022242628303234"; std::string name = foo + ' ';
name
设置为"012345678910121416182022242628303234"
问题是"ab"不是C++ std::string
,而是a const char[3]
.所以它正在寻找的+运营商是operator+ (const char[3], char)
.这不存在,因此编译器会尝试让数组衰减到指针,因此它会查找operator+ (const char*, char)
.这是存在的,所以编译器会选择它,但它做错了.将一个整数值(char)添加到指针(const char*)是一个很常见的操作,显然,这就是这个operator +的作用.理解这一点的关键是要意识到第一个参数是1)一个数组,2)每当数组没有意义时的指针.它在C中也被用作字符串,是的,但它不是字符串.它是一个指针(或偶尔,一个数组).
有一个operator+ (const std::string&, char)
连接,但编译器甚至不会查找它,因为第一个参数不是std :: string.
所以解决方案是手动创建字符串:
string name = std::string("ab")+'c';
现在编译器可以找出正确的operator +来调用.
在C++中,编译器正在寻找具有此原型的函数:
T operator+ (const char*, char);
由于没有一个,它无法弄清楚T是什么并且无法解析operator<<
调用,因此它回退到唯一的解决方案:指针添加.在Josh的答案中连接到字符串没有问题,因为它存在一个函数.