观察上例对于s1Constent这样的表达式编译器又.ppt
上传人:天马****23 上传时间:2024-09-11 格式:PPT 页数:26 大小:160KB 金币:10 举报 版权申诉
预览加载中,请您耐心等待几秒...

观察上例对于s1Constent这样的表达式编译器又.ppt

观察上例对于s1Constent这样的表达式编译器又.ppt

预览

免费试读已结束,剩余 16 页请下载文档后查看

10 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

12.1.3友元运算符//将String类中的加法运算符重载改为友元friendStringoperator+(String&,String&);//改写加法运算符重载函数Stringoperator+(String&rs1,String&rs2){Stringtemp;temp.nLen=rs1.nLen+rs2.nLen;temp.pStr=newchar[temp.nLen+1];strcpy(temp.pStr,rs1.pStr);strcat(temp.pStr,rs2.pStr);returntemp;}有了上述的定义,编译器在遇到s1+s2这样的表达式时,就将它解释为:operator+(s1,s2);即调用前面定义的友元运算符。对类似于"Constant"+s这样的表达式,编译器就将其解释为:operator+("Constant",s);而成员运算符将对此表达式无能为力。这是因此字符串常量不是一个对象,它不存在加法运算符重载。对比成员运算符和友元运算符可以发现:若重载的运算符是一个一元运算符,则成员运算符不能有参数,而友元运算符必须有一个类对象或引用的参数;若重载的运算符是一个二元运算符,则成员运算符必须有一个参数,而友元运算符必须有两个类对象或引用的参数。另外,二元运算符重载为友元使用起来比较方便。12.1.4转换函数12.2几个特殊运算符的重载XaX(10);cout<<aX.Get()<<endl;//输出10++aX;cout<<aX.Get()<<endl;//输出11i=aX++;cout<<i<<endl;//输出11cout<<aX.Get()<<endl;//输出1212.2.2下标运算符函数调用运算符(())、成员选择运算符(->)、new运算符和delete运算符等,重载时也有一些特殊的要求和限制。但由于它们在实用中极少被重载,且重载和使用时的难度较大,这里就不再介绍了。有兴趣的同学可以参考相应资料。第13章C++语言的I/O流类13.1.1流13.1.2文件13.1.3缓冲13.2C++的基本流类体系13.2.2预定义的流及流运算符13.2.3流的格式化I/O13.2.3.1格式控制符类ios中说明了一个用于指定I/O格式的无名公有枚举型成员:enum{skipws=0x0001,left=0x0002,right=0x0004,internal=0x0008,dec=0x0010,oct=0x0020,hex=0x0040,showbase=0x0080,showpoint=0x0100,uppercase=0x0200,showpos=0x0400,scientific=0x0800,fixed=0x1000,unitbuf=0x2000};注意,有的具体实现还定义有一个枚举成员:stdio=0x0400该成员的作用是指示当插入操作完成后立即刷新标准输出流和标准错误流。由于格式控制符属于无名枚举的成员,所以它们就相当于类ios的直接成员。另外,由于这些成员被说明为公有的,所以在程序中可以很方便地访问它们。ios中还说明了一个保护的长整型数据成员:protected:longx_flags;该成员用来记录当前的格式。由于格式控制符是按位定义的,所以x_flags的每一位对应一个格式控制符:若某一位的值为1,则说明对应的格式控制符被选取。例如,设当前x_flags的值为0x0242,则表明当前选取的格式控制为:左对齐、十六进制、数值中的字母大写。13.2.3.2格式控制函数类ios中说明了多个用于访问x_flags的成员函数。下面予以分别介绍。longios::flags();//读取x_flags的值longios::flags(long);//设置并读取x_flags的值例:longflg=cout.flags();cout<<flg<<endl;//输出(可能)为8193flg=cout.flags(ios::showbase|ios::hex|ios::uppercase);cout<<flg<<endl;//输出为0X2001flg=cout.flags(flg);//恢复原格式控制cout<<flg<<endl;//输出为704(相当0x2c0)longios::setf(long);//设置格式控制longios::setf(long_setbit,lon