标准库 iostream 的包含与继承关系

发布时间 2024-01-07 18:09:53作者: Asnelin
标准库 iostream

概览

包含(include):

  • <ios>
  • <streambuf>
  • <istream>
  • <ostream>

对象:

  • cin & wcin
  • cout & wcout
  • cerr & wcerr
  • clog & wclog

标准库 ios

:

  • ios_base
  • basic_ios
  • std::ios & std::wios

其中, std::ios 的定义为 std::basic_ios<char>, std::wios 的定义为 std::basic_ios<wchar_t>, basic_ios 继承自 ios_base

函数:

  • uppercase & nouppercase: 控制输出大写字母
  • internal & left & right: 设置填充字符的位置
  • dec & hex & oct: 修改输入输出的基数

标准库 istream

类模板和 typedef:

  • basic_istream & basic_iostream
  • std::istream & std::wistream
  • std::iostream & std::wiostream

其中, std::istream 定义为 std::basic_istream<char>, 其余的也类似

继承关系如下:

ios_base <--- basic_ios <--- basic_istream <---\
                        \--- basic_ostream <--- basic_iostream

类 istream

全局对象:

  • cin & wcin

成员函数:

  • get
  • getline
  • read

标准库 ostream

:

  • basic_ostream
  • std::ostream & std::wostream

其中, std::ostream 定义为 std::basic_ostream, 其余类似

继承关系如下:

ios_base <--- basic_ios <--- basic_ostream

操作符:

  • endl
  • ends
  • flush

函数:

  • print(C++23)
  • println(C++23)

类 ostream

全局对象:

  • cout & wcout
  • cerr & wcerr
  • clog & wclog

成员函数:

  • put
  • teelp

标准库 fstream

:

  • basic_ifstream
  • basic_ofstream
  • ifstream & ofstream

其中, std::ifstream 定义为 std::basic_ifstream, 其余类似

继承关系如下:

ios_base <--- basic_ios <--- basic_istream <--- basic_ifstream

类 ifstream

成员函数:

  • is_open
  • open
  • close

类 ofstream 中, 也有这几个函数

总结

文件包含关系, 有尖括号 <> 的代表文件, 其余代表类:

<iostream>
    |---<ios>
    .       |---<iosfwd>
    .       |---ios_base
    .       |---basic_ios
    |---<istream>
    .       |---ostream
    .       |---iostream
    |---<ostream>
    .       |---ostream

<fstream>
    |---ifstream
    |---ofstream

类的继承关系:

img

图片来源: cppreference.com

关于格式化输出

cout 定义于 标准库 <iostream> 文件中, 该文件包含 <ostream> 文件:

extern std::ostream cout
extern std::wostream wcout

cout 是 ostream 类的对象, 而 ostream 类继承于 ios_base, 大部分的格式化方法都在 ios_base 类中, 例如 setf() 方法, 所以可以有 std::cout.setf() 的用法

std::right 与 std::ios::right

std::rightstd::dec 等常量的原型在 <ios> 文件中定义:

std::ios_base& left(std::ios_base& str);

std::iosstd::basic_ios<char> 的别名, 类 basic_ios 是继承于 ios_base 的, 实际上也是访问的 ios_base 中的常量, 从这一层面上来说, std::ios::rightstd::ios_base::right 也相同 (但 basic_ios 是模板类, 可能在某些情况下有区别吧)