正在尝试将字符串对象添加到整数中



这可能是我在谷歌上搜索了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是一个指针,当您使用+运算时,您正在进行指针运算。

注意:编译器可能会创建不同的内部结构,但思考以上两行是很有指导意义的。

相关内容

  • 没有找到相关文章

最新更新