自定义的操纵算子
不带参数的操纵算子
定义不带参数的操纵算子比较简单。下面的程序定义了一个名为newline的操纵算子,它和预定义的操纵算子endl具有相同的功能。
例8_9:
操纵算子的目的主要是解决在流的插入或提出表达式中使用函数调用所引起的问题。
一个简单的操纵处算符是一个说明为
type& fun(type&);
的函数地址。这里type可以是istream、ostream、iostream或ios类的类名。
在istream类中说明了两个特殊的插入函数:
istream& istream::operator>>(istream& (*anFun)(istream&));
isteam& istream::operator>>(ios& (*anFun)(ios&));
在ostream类中也说明了两个特殊的插入函数:
ostream& ostream::operator>>(ostream& (*anFun)(ostream&));
osteam& ostream::operator>>(ios& (*anFun)(ios&));
这些成员函数都接收一个函数指针参数。当这些成员函数被启动时,它们又简单地通过这个函数指针调用这个指针所指向的函数。
语句 cout<<”A line”<<newline<<”another line”; 计算过程:
首先计算优先级比运算符<<高的运算符组成的表达式,然后对表达式
cout<<”A line”
使用插入操作符ostream::operator<<(char *),最后,表达式
cout<<newline
使用上面列出的ostream类的第一个插入函数调用newline。
带有一个int或long类型参数的操纵算子
由于函数调用运算符的优先级高于插入符,所以语句 cout<<a<<setprecsion(2)<<b;中先调用函数setprecision。但是,函数setprecision必须在插入符输出了变量a之后才能设置精度,因此在调用函数setprecision时不能立即设置精度,相反,它应返回某个对象,这个对象可被它所在的类中重载的插入符用来为变量b设置所需的精度。
C++,来帮助程序员定义带有一个参数的操纵算子。这个头文件中还特别定义了帮助程序员定义一个带有int类型或long类型参数的操纵算子所需的类。在该文件中,setprecision被定义为:
SMANIP(int) setprecision(int n);
函数setprecision()返回SMANIP(int)类的一个对象,SMANIP(int)类的构造函数在这个对象中保存下来一个函数的地址和它的参数值。所以语句(cout<<a<<setprecsion(2)<<b;)的计算过程是:
1、首先计算表达式a、b和setprecision的值,函数setprecision返回一个SMANIP(int)类的一个对象。
2、使用插入符ostream::operator<< (float)将表达式a的值以原有的精度输出。
3、使用
8.3 自定义的操纵算子 来自淘豆网m.daumloan.com转载请标明出处.