在C++中理解istringstream有困难

Trouble understanding istringstream in C++

本文关键字:istringstream C++      更新时间:2023-10-16

我是C++的新手,我想知道如何理解函数和类的作用。例如,我被告知在家庭作业中使用"istringstream"。我在网上查了一下,发现cplusplus.com网站上有很多参考资料。我的问题是理解参考页。

在"istringstream"参考页面上,我得到了以下代码:

// istringstream constructors.
#include <iostream>     // std::cout
#include <sstream>      // std::istringstream
#include <string>       // std::string
int main () {
  std::string stringvalues = "125 320 512 750 333";
  std::istringstream iss (stringvalues);
  for (int n=0; n<5; n++)
  {
    int val;
    iss >> val;
    std::cout << val*2 << 'n';
  }
  return 0;
}

在上面的代码中,它正是我任务所需要的,但我不明白它为什么有效。因此,他们创建了一个名为iss的istringstream对象,后来使用了"iss>>val"。这就是我感到困惑的部分。它到底做什么?

我试着阅读上面的文本,它解释了类中每个函数的作用,但我一点也不理解。例如,参考页上的第一行写着

default (1)   explicit istringstream (ios_base::openmode which = ios_base::in);

我该如何解读这句话?从我所看到的,它是一个接受一个参数的函数,但它是"ios_base::openmode which=ios_base::in"。

std::istringstream视为std::string的流接口适配器。

就像在控制台或文件中写入std::string并用std::cinstd::ifstream读取一样,它提供了读取底层存储(在本例中为std::string)的接口(get()peek()等)。其余的operator>>重载可能使用基本的读取功能来读取自定义类型(intdouble等)

行:default (1) explicit istringstream (ios_base::openmode which = ios_base::in);声明了一个构造函数,该构造函数接收默认值为ios_base::in的默认参数名称which(这表示您可以从流中读取)

我相信这就是您要查找的页面。这定义了神秘的>>运算符。它以多种不同的方式重载,这意味着它像scanf函数一样用于多种不同的数据类型。

您的编译器查看iss >> val并说:"嗯……issistringstreamvalint。啊哈!看起来istringstream有一个operator>>,它需要int&,我会使用它!"

编辑:istream有一个operator>>作为int&istringstream继承了这些。

后来使用了"iss>>val"。这就是我感到困惑的部分。它到底做什么

表达式iss >> val是函数调用的"语法糖"iss.operator>>(val),其中形式参数被定义为对int值的引用。函数本身获取val的地址,并在此位置写入一个新值。这应该由原始表达式iss >> val中的>>符号"象征"。