这可能是我在谷歌搜索最近20分钟的一个非常基本的问题。我不确定我是否正确地说它,但我没有得到我理解的解释。
基本上,我有一个字符串对象,当我添加一个整数值x时,它会将字符串缩短x个字符。
以下是代码:
#include <iostream>
#include <string>
void Print::print(std::string str)
{
std::cout << str << std::endl;
}
print("formatString:" + 5);
输出为:tString:
现在我意识到以上是不正确的,在我的搜索过程中,我找到了纠正行为的方法,但我还没有找到内部实际发生的事情来获得上述结果。
由于
答案 0 :(得分:2)
答案很简单:指针算术。
你的字符串文字(包含隐式0终结符的const char
数组)在使用时衰减为const char*
,你递增并传递给你的print()
函数,从而调用std::string
- 字符串文字的构造函数。
所以,是的,你从一个字符串对象(以0 {终止的const char
数组)开始,而不是std::string
对象。
答案 1 :(得分:1)
基本上,我有一个字符串对象
不,你没有字符串对象。 "formatString:"
不是std::string
,而是&#34;字符串&#34;文字。它实际上是const char*
。 const char*
定义了operator +
,它接受一个整数并使用多个位置前进指针的值。在你的情况下,它是5。
要获得编译器错误,您必须将文字包装在std::string
中。
print(std::string("formatString:") + 5);
答案 2 :(得分:0)
&#34; formatString的:&#34;是一个字符串文字,类型为const char[14]
。这是一个const char数组,大小等于14(数组包含终止零)。
在像这样的表达
"formatString:" + 5
数组被隐式转换为指向其第一个元素的指针。因此,如果例如const char *p
表示此指针,则表达式看起来为
p + 5
表达式的结果是指向具有索引5的数组元素的指针。即使用指针算法。
P + 5
指向字符串的第一个符号&#34; tString&#34;
此表达式由类std :: string。
答案 3 :(得分:0)
检查以下内容,
#include <iostream>
void print(std::string str)
{
std::cout << str << std::endl;
}
int main(int argc, char* argv[])
{
//following two lines created implicitly by the compiler
const char* pstr = "formatString";
std::string tmp(pstr + 5); //string c-tor: string (const char* s);
// now tmp: --> "tString"
print(tmp);
return 0;
}
pstr
是一个指针,当您使用+
操作时,您正在执行pointer arithmetic。
注意:编译器可能会创建不同的内部结构,但这是考虑上述两行的一种有益的方法。