这可能是我在谷歌上搜索了20分钟的一个非常基本的问题。我不确定我的措辞是否正确,但我没有得到我能理解的解释。
基本上,我有一个字符串对象,当我添加一个整数值x时,它会将字符串缩短x个字符。
这是代码:
#include <iostream>
#include <string>
void Print::print(std::string str)
{
std::cout << str << std::endl;
}
print("formatString:" + 5);
输出为:t字符串:
现在我意识到以上是不正确的,在我的搜索过程中,我已经找到了纠正行为的方法,但我还没有找到内部实际发生的事情来获得上述结果。
感谢
答案很简单:指针算术。
字符串文字(包含隐式0终止符的const char
数组)在使用时衰减为const char*
,然后递增并传递给print()
-函数,从而调用字符串文字的std::string
-构造函数。
因此,是的,您从一个字符串对象(以0结尾的const char
数组)开始,而不是从一个std::string
对象开始。
基本上,我有一个字符串对象
不,您没有字符串对象。"formatString:"
不是std::string
,而是一个"字符串"文字。它实际上是一个const char*
。const char*
具有定义的operator +
,其取整数并使指针的值前进若干位置。在你的情况下是5。
若要得到编译器错误,您必须将文字包装在std::string
中。
print(std::string("formatString:") + 5);
"formatString:"是一个类型为const char[14]
的字符串文字。也就是说,它是一个大小等于14的const char数组(该数组包括终止零)。在像这样的表达式中
"formatString:" + 5
数组被隐式地转换为指向其第一个元素的指针。因此,如果例如const char *p
表示该指针,则表达式看起来像
p + 5
表达式的结果是指向索引为5的数组元素的指针。那就是使用了指针运算。
P + 5
指向字符串"tString"的第一个符号这个表达式由类std::string的构造函数使用。
检查以下内容,
#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
是一个指针,当您使用+
运算时,您正在进行指针运算。
注意:编译器可能会创建不同的内部结构,但思考以上两行是很有指导意义的。