还真是没太注意过这个,学的时候感觉这么设计挺合理的就记住了。效果是知道但为什么会这样呢?
后来学的多了,知道流的状态很多是靠标记实现的。刚才为了弄清楚你的这个问题,还特意查了一下标准,其中格式标记的类型是:
ios_base::fmtflags
它定义的记录信息有以下这些:
*
- boolalpha
*
- dec
*
- fixed
*
- hex
*
- internal
*
- left
*
- oct
*
- right
*
- scientific
*
- showbase
*
- showpoint
*
- showpos
*
- skipws
*
- unitbuf
*
- uppercase
*
- adjustfield
*
- basefield
*
- floatfield
正好没有你问的那两个。
仔细再看,你问的那两个分别记录在了另一个类型为 streamsize 的东东里了。而且这个类型还不定义在是 ios_bose 这个空间里的。
并且这两个虽然类型一样,但不是记录在同一个成员里的(而上面说到的 fmtflags 是在一个变量里记录所有的信息)。流类自己也只能通过 precision() 和 width() 这两个函数来操作。(<iomanip>里定义的 setprecision, setw 是这两个函数的包装。)
标准在 IO 这章里(至少是27章的第4节里,好像)根本没提这两个函数怎么影响流的输出。只是说“无参数调用它们返回的是现在的值。带参数调用,是将流的相关数据设置成新值,返回的是原来的值。“
可以肯定的是这两个函数的值是在插入的时候才影响的。感觉从实现的角度看,都是一直影响到底好像有比较好的一致性。但看来是宽度一值影响到底太不实用了,才特殊化了。
呵呵,搞了半天也没彻底弄明白你问的问题,又一次使我感觉到了 C++ 的博大精深。不过倒是在找资料的时候学了一大堆别的东西,比如说更深地领悟了一些操作符重载的技巧。和一些类型定义的使用方法和技巧~~