【问题标题】:Trying to add a string object to an integer尝试将字符串对象添加到整数
【发布时间】:2014-04-08 23:01:23
【问题描述】:

这可能是我过去 20 分钟在谷歌上搜索的一个非常基本的问题。我不确定我的措辞是否正确,但我没有得到我理解的解释。

基本上,我有一个字符串对象,当我添加一个整数值 x 时,它会将字符串缩短 x 个字符。

代码如下:

#include <iostream>
#include <string>

void Print::print(std::string str)
{
   std::cout << str << std::endl;    
}


print("formatString:" + 5);

输出为:tString:

现在我意识到上述内容是不正确的,在搜索过程中我找到了纠正行为的方法,但我还没有找到内部实际发生的事情来获得上述结果。

谢谢

【问题讨论】:

  • 字符串文字是const char[N],而不是std::string

标签: c++ string integer addition


【解决方案1】:

答案很简单:指针运算。

您的字符串文字(const char 的数组,包括隐式 0 终止符)在使用时衰减为 const char*,您将其递增并传递给您的 print()-function,从而调用 std::string-constructor for字符串字面量。

所以,是的,你从一个字符串对象(const char 的 0 终止数组)开始,而不是 std::string 对象。

【讨论】:

    【解决方案2】:

    基本上,我有一个字符串对象

    不,您没有字符串对象。 "formatString:" 不是 std::string,而是“字符串”文字。实际上是const char*。一个const char* 定义了一个operator +,它接受一个整数并将指针的值提前多个位置。在你的情况下,它是 5。

    要获得编译器错误,您必须将文字包装在 std::string 中。

    print(std::string("formatString:") + 5);
    

    【讨论】:

    • "要获得编译器错误,您必须将文字包装在 std::string 中。" - 大声笑
    • 字符串文字实际上是 const char[] (C++11, §2.14.5/8)。数组只是在这里衰减到一个指针。
    【解决方案3】:

    "formatString:" 是一个类型为const char[14] 的字符串文字,即它是一个大小等于14 的const char 数组(该数组包括终止零)。 在这样的表达中

    "formatString:" + 5
    

    数组被隐式转换为指向其第一个元素的指针。因此,如果例如 const char *p 表示此指针,则表达式看起来像

    p + 5
    

    表达式的结果是一个指针,它指向索引为 5 的数组元素。即使用了指针算法。

    P + 5 指向字符串“tString”的第一个符号 并且这个表达式被类 std::string 的构造函数使用。

    【讨论】:

      【解决方案4】:

      检查以下内容,

      #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

      注意:编译器可能会创建不同的内部结构,但考虑以上两行是一种有益的方式。

      【讨论】:

        猜你喜欢
        • 2013-10-18
        • 2023-03-30
        • 1970-01-01
        • 2012-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-21
        相关资源
        最近更新 更多