我知道您不能使用operator+
将整数连接到std::string
而不将其转换为char*
或std::string
。
但为什么添加整数会返回字符串的尾部?
#include <iostream>
#include <string>
int main()
{
std::string x;
x = "hello world" + 3;
std::cout << x << std::endl;
}
打印:lo world
如果您更改:x = "hello world" + 8;
我们打印:rld
这背后的原因是什么?未定义的行为?
答案 0 :(得分:4)
你需要知道你的类型。首先,你不在std::string
上加3。添加发生在std::string
创建之前。相反,您将char[12]
添加3,这是定义的,因为char数组衰减到char*
,并且向它添加3会使指针前进3个元素。这正是你所看到的。
根据结果构建std::string
,最后得到尾。
答案 1 :(得分:2)
它相当于:
#include <iostream>
#include <string>
int main()
{
std::string x;
const char* p = "hello world";
p = p + 3;
x = p;
std::cout << x << std::endl;
}
你可以通过这种方式使它更安全:
#include <iostream>
#include <string>
using namespace std::literals;
int main()
{
std::string x;
x = "hello world"s + 3; // error! won't compile
std::cout << x << std::endl;
}
答案 2 :(得分:0)
如你所知,字符串是一个字符数组,如果你把+ 3
表示你要把字符串从第三个位置带到它的末尾
答案 3 :(得分:0)
int data[5] = { 1, 2, 3, 4, 5 };
int *dp = data;
std::cout << *(dp + 3) << '\n';
现在,这里,dp + 3
指向数据数组中的4;这只是指针算术。所以*(dp + 3)是4,这就是你在输出流中看到的内容。
与char*
相同:向其添加一个整数会为您提供一个新的指针值,与原始值的偏移量为整数:
char data[5] = "abcd";
char *dp = data;
std::cout << *(dp + 3) << '\n';
dp
指向数组的开头,dp + 3
指向字母“&#39; d”。所以*(dp + 3)是d,这就是你在输出中看到的内容。
当您使用指针和偏移来初始化类型为std::string
的对象时,您会得到相同的结果:指针加上偏移点指向char数组内的位置,以及生成的std::string
对象保存从该位置到终止空字符的字符副本。