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

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

发布日期: 2024-01-07

概览

包含(include):

对象:

cin & wcin

cout & wcout

cerr & wcerr

clog & wclog

标准库 ios

类:

ios_base

basic_ios

std::ios & std::wios

其中, std::ios 的定义为 std::basic_ios, std::wios 的定义为 std::basic_ios, 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, 其余的也类似

继承关系如下:

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 中, 也有这几个函数

总结

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

|---

. |---

. |---ios_base

. |---basic_ios

|---

. |---ostream

. |---iostream

|---

. |---ostream

|---ifstream

|---ofstream

类的继承关系:

图片来源: cppreference.com

关于格式化输出

cout 定义于 标准库 文件中, 该文件包含 文件:

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::right 或 std::dec 等常量的原型在 文件中定义:

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

std::ios 是 std::basic_ios 的别名, 类 basic_ios 是继承于 ios_base 的, 实际上也是访问的 ios_base 中的常量, 从这一层面上来说, std::ios::right 与 std::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

相关推荐