14.4.10 控制符
在使用ios_base类中设定的setf函数时,需要对参数有足够的了解。因此,为了提高函数调用的友好性,C++流类库提供了<iomanip>头文件,同时也提供了多个控制符,由控制符完成setf函数的调用,这些控制符如表14.7所示。
对于表14.7中定义的无参控制符不仅在头文件iomanip中有定义,在头文件iostream中也有定义,因此,使用无参控制符可以不使用“#include<iomanip>”指令,但如果要使用表中最后4个有参控制符,必须包含头文件iomanip。
无参控制符实际上是函数,其原型如下所示。
ios_base&控制符(ios_base&);如下例所示。 boolalpha(cout);//等价于cout.setf(ios_bse:boolalpha) cout<<true<<endl;实际上,ostream类重载了<<操作符,如下述用法与上面的示例等价。 cout<<boolalpha<<true<<endl;
说明
也许读者对endl的用法已经很熟悉,实际上控制符是定义在名称空间std中的,是全局性的函数定义,可以直接用函数名调用,而原来诸如函数width和fill等是定义在ios_base类内的成员函数,必须通过cout等进行调用。
由于操作符都返回了ios_base类对象的引用,这就允许将<<拼接起来,实现链式输出,如示例代码14.14所示。
代码14.14 控制符的应用FormatSample
<———————————-文件名:example1414.cpp———————————————-> 01 #include<iostream> 02 #include<iomanip> 03 using namespace std; 04 int main() 05 { 06 07 cout<<showbase<<hex<<uppercase<<255<<endl;//显示基,十六进制,大写形式输出 08 cout<<setw(10)<<setfill('*')<<"hello"<<endl;//设定域宽为10,一次输出有效 09 cout<<5<<endl; 10 return 0; 11 }
输出结果如下所示。
0XFF *hello 0X5
【代码解析】代码演示了控制符的用法,从中可以看出不论是无参控制符还是有参控制符,其实现的功能和前面介绍的ios_base类内成员差不多,但使用控制符表示起来相对要方便很多,也更加友好,编程的效率也更高。如代码第7行设置的十六进制大写形式输出。
注意
控制符setw实际输出同样是一次有效,实际输出意味着排除其他操作符的链式拼接,只关心真实复制到输出流中的内容。