看书时看不懂
21.4.6.1带参数的操控符
cout<< setprecision(4)<<angle,要不用4位angle为完成此事setprecison必须
返回一个用4初始化过的对象。在它被子调用时就能去调用cout。precision(4)。
这样的操控符是一个函数对象,它们被子<<(而不是通过()调用),
这个函数对象有可能象下历这样定义。
struct smanip{
ios_base& (*f)(ios_base&,int),int);//要调用的函数
int i,
smanip (ios_bse& (*ff)(ios_base&,int),(int)):f(ff),i(ii){}
};
template<class Ch, class Tr>
ostream<Ch,Tr> & operator<<(ostream<Ch,Tr>&os,const smanip& m)
{
return m.f(os,m.i);
}
smanip 的构造函数将存在于f和i中,operator<<调用f(i),现在我们就可以用
以下方式定义setprecision()了,
ios_base& set_precision(ios_base& s,int n)//协会助函数
{return s.precision(n);//调用成员函数}
inline smanip setprecison(int n)
{return smanip(set_precison,n)//创建函数对象
我们现在就可以写cout<<setprecison(4)<<angle了。
我不太明白当setprecison(4)被调用时,4传给了smanip中的构造函数,
可是,不知道是怎么传给了(*ff)(ios_base&,int)里的int??
另外,是不是调用smanip时,这会从非const转为const?
问题点数:50、回复次数:7Top
1 楼fibbery(飞)(睡足了才能提高效率)回复于 2005-05-16 14:09:40 得分 0
是C++Top
2 楼jingyueid(干宁)回复于 2005-05-17 19:00:38 得分 50
cout<<setprecison(4)<<angle
在执行的时候。<<被解析为:
ostream<Ch,Tr> & operator<<(ostream<Ch,Tr>&os,const smanip& m)
{
return m.f(os,m.i);
}
执行return m.f(os, m.i)操作;
smanip首先给构造为:
smanip (ios_bse& (*ff)(ios_base&,int),(int)):f(ff),i(ii){}
注意,那个整数传给了i,函数指针给了f。
smanip被传参进来后,执行代码:
m.f(os, m.i),就是在执行:set_precison(os, m.i)Top
3 楼zjlang(阿亮)回复于 2005-05-18 17:17:23 得分 0
UPTop
4 楼Cform(Jieyi)回复于 2005-06-05 18:56:13 得分 0
那么
ostream <Ch,Tr > & operator < <(ostream <Ch,Tr >&os,const smanip& m)
{
return m.f(os,m.i);
}
是不是在参数smanip &m时会构造该类Top
5 楼zhousqy(标准C匪徒)(甩拉,甩拉)回复于 2005-06-05 19:30:15 得分 0
markTop
6 楼kyokyxxj(朝阳)回复于 2005-06-05 20:50:08 得分 0
看不懂。。帮你顶下Top
7 楼songjuan10()回复于 2005-07-08 20:20:52 得分 0
努力吧!Top




