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

发布日期: 2024-01-07

概览

包含(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 是模板类, 可能在某些情况下有区别吧)

简单的示例:

设置流的宽度:

cout.width(12);  // 流宽度设置为 12
setw(12);   // 流宽度设置为 12
            // setw() 方法会使用流的 width() 方法, 它们是相同的

右对齐:

double a = 3.14159;
setw(12)    // 或者 cout.width(12)
cout.setf(ios::right);
// output
//      3.14159

setf() 多标记组合:

cout.setf(ios::right | ios::showpos);
// 因为 setf(flags) 即使处理单标记, 也是 fl = fl | flags, 所以可以用管道符号分隔标记

设置浮点数精度

double a = 3.14159;
cout.precision(3); // 有效位数, 而非小数位数
// output
// 3.14
posted @ 2024-01-07 18:04  Asnelin  阅读(172)  评论(0编辑  收藏  举报