为什么std :: string在添加整数时返回字符串的尾部

时间:2016-12-15 14:54:57

标签: c++ string

我知道您不能使用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

这背后的原因是什么?未定义的行为?

4 个答案:

答案 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对象保存从该位置到终止空字符的字符副本。