等级考试二级C++考点分析之运算符及C++流 |
|
www.nanhushi.com 佚名 不详 |
8.1 运算符函数与运算符重载 考点1 运算符函数与运算符重载的概念 运算符重载就是赋予已有的运算符多重含义。C++通过重新定义运算符,使它能够作用于特定的对象,从而执行特定的功能。因为任何运算都是通过函数来实现的,所以运算符重载其实就是函数重载。我们把重载的运算符视为特殊的函数,称为运算符函数因此,运算符重载就是函数重载的一种特殊情况。C++的运算符大部分都可以重载,不能重载的只有‘“.”,“::”,“.*”,“->*”,“?:”。除了new和delete之外,任何运算符作为成员函数重载时,不得重载为static函数。 operator是C ++的一个关键字,它经常和C++的一个运算符连用,构成一个运算符函数名,例如:operator +,重载运算符函数为operator +()。一般说来,要在C ++中重载运算符@,只需要定义一个名为operator@的函数就可以了,具体的格式为: TYPE operator@(参数表){ …//函数定义 } 小提示: 这里的TYPE是函数的返回类型,运算符函数的返回类型不能是void类型。 考点2 运算符重载应注意的几个问题 运算符重载应注意的几个问题如下: (1)运算符重载后的优先级。用户重新定义运算符,不改变运算符的优先级和结合性,也不改变运算符的语法结构,即单目运算符只能重载为单目运算符,双目运算符只能重载为双目运算符。 (2)对运算符重载的限制。不可臆造新的运算符;不能改变运算符操作数的个数;不能改变运算符原有的优先级、结合性和语法结构。 (3)运算符重载时必须遵循的原则。运算符重载含义必须清楚;运算符重载不能有二义性。 (4)编译程序运算符函数的选择。编译程序对运算符重载的选择,遵循着函数重载的选择原则。当遇到不明显的运算符时,编译程序将去寻找与参数相匹配的运算符函数。 考点3 运算符重载函数的两种形式
运算符重载的函数一般有两种形式:成员函数形式和友元函数形式。这两种形式都可以访问类中的私有成员 (l)将运算符重载函数说明为类的成员函数的格式如下: <类名>operator<运算符>(<参数表>) 其中,成员函数有隐含参数的this指针,一般是指第1个操作数。对双目运算符,有1个参数,一般指第2个操作数;对单目运算符,参数表为空。 (2)将运算符重载函数说明为类的友元函数的格式如下: friend<类名>operator<运算符>(<参数表>) 其中,友元函数没有隐含参数的this指针。因此,对双目运算符,友元函数有2个参数;对单目运算符,友元函数有1个参数。 8.2 典型运算符的重载 考点4 几种典型运算符的重载
1.重载取负运算符“-” 取负运算符“-”是一元运算符,当作为成员函数重载时参数表中没有参数,那个惟一的操作数以this指针的形式隐藏在参数表中。当把取负运算符作为非成员函数重载时,那个惟一的操作数必须出现在参数表中。“-”是一个典型的一元运算符,除了++、--外的其他一元运算符的用法与此类似。例如把取负运算符“-”当成员函数重载:类名operator-(){//函数体}。 2.重载加法运算符“+” 加法运算符“+”是一个二元运算符,当作为成员函数重载时参数表中只有1个参数,对应于第二个操作数,而第一个操作数是对象本身,以this指针的形式隐藏在参数表中。当把加法运算符作为非成员函数重载时,两个操作数必须都出现在参数表中。“+”是一个典型的二元运算符,除了赋值类运算符外的其他二元运算符的用法与此类似例如把加法运算符“+”作为友元函数重载的声明形式: friend类名operator+(参数1,参数2){//函数体} 3.重载运算符“++”和“- -” C++中提供了一元自加(十+)与自减运算符(一)的前缀运算和后缀运算,两者之间的最大差别在于说明的格式不同,对于++而言: 函数类型operator + +()//前缀运算 函数类型operator++(int) //后缀运算 由于在后缀情况下不需要使用形参,因此在函数定义中,只给出类型而没有指定形参名,这是C++所允许的另外需要注意的是,若将++重载为友元运算符,由于它们要修改操作数,所以必须使用引用参数。对于--来说,与++的用法完全一样。 4.重载类型转换并“long”类型转换符必须作为成员函数重载。在重载类型转换符时,不需要返回值类型的声明。 重载类型转换符“long”的语法形式为: operator long(参数表){//函数体} 其他类型转换符的重载方法与此类似。 小提示: =,[ ],(),->及所有的类型转换运算符只能作为成员函数重载,而且是不能针对枚举类型操作数的重载。
5.重载赋值运算符“=” 赋值运算符也必须作为成员函数重载。一般情况下并不需要重载“=”,但若类中包含指针指向动态空间的指针时,就需要重载赋值运算符。重载赋值运算符“=”时应注意的几点如下:
(1)返回值应声明为引用,但函数体中总是用return*this;语句返回。 (2)若参数被声明为指针或引用,一般应加上eonst修饰。 (3)若一个类需要重载运算符=,一般也就需要定义自己特有的拷贝构造函数,反之亦然。 6.重载复合赋值运算符“+=” 重载复合赋值运算符“+=”、“-=”、“*=”的方法与重载赋值运算符的方法差不多,不同的是复合赋值运算符既可重载为成员函数又可重载为非成员函数。当重载为友元函数时,两个操作数都必须出现在参数表中,而且第1个参数应声明为引用。 7.重载关系操作符“>” 在C++中的关系操作符有<、>、= =等,重载的这些关系运算符函数应返回逻辑值。例如,将关系运算符>重载为类A的成员函数的声明形式是: bool operator>(A a){return num*a. den>a. num*den;} 8.重载下标访问运算符“[]” 重载下标访问运算符“[]”,可以实现数组下标越界检测等。下标访问运算符“[]”只能作为成员函数重载。例如,一般下标访问运算符“[]”重载函数的定义形式为: 返回类型类名::operator[](下标类型形参){//函数体} 小提示: 一个重载的运算符函数不能带有默认的参数。
9.重载C++流运算符“>>”和“<<” 在C++中,C++流输入运算符“>>”和输出运算符“<<”只能重载为非类成员函数,一般重载为友元函数。重载C++流输入运算符“>>”和输出运算符“<<”的格式为: istream& operator>>( istream&,<类名>&); ostream& operator<<(ostream&,<类名>); 小提示: 一个重载的运算符函数不能带有默认的参数。 8.3 C++流的概念 考点5 C++流的基本概念 在C++中,输入输出操作是通过流来完成的执行输入输出操作的类体系叫做流类,提供这个流类实,系统叫做流类库。流类库的类等级如图8-1。所示这个类等级在头文件iostream. h中说明要和:用C++流,必须利用以下头文件。 iostream:使用cin,cout的预定义流对象进行针对标准设备的I/O操作,必须包含此头文件。 fstream:使用文件流对象进行针对磁盘文件的I/O操作,必须包含此头文件。 iomamp:使用setw,fixed等大多数操作符,必须包含此头文件。 小提示: 为使用新标准的C+十流,相关头文件名不得有扩展名,还必须在程序文件的开始部分插入名字空间声明;using namespace std; C++流预定义了4个流,它们是cin,cout,cerr和clog o它们可以直接用来输入输出,与这4个流相关联的具体设备如下。 cin:与标准输入设备相关联。 cout:与标准输出设备相关联。 cerr:与标准错误输出设备相关联(非缓冲)。 clog:与标准错误输出设备相关联(缓冲)。 C++流重载了提取运算符>>和插入运算符<<,使它们分别进行有格式输入和有格式输出。cin,count等预定义的流对象只能用于有格式的输入输出。 8.4输入输出的格式控制 考点6 默认的输入输出格式
C++流所识别的输入输出数据的类型及其默认的输入输出格式包括的内容如表8-1所示。 考点7 格式的标志与格式的控制 C++提供了一系列的可与运算符>>或<<配合使用的特殊函数;称为操作符。每个操作符都与一个具体的函数相联系,从而能够完成相应的输入、输出控制功能。许多操作符与格式控制标态符号相同.常用的格式控制符号 小提示: 精度的默认值为6,如果采用浮点格式输出时,精度的含义是有效位数;如果是采用定点格式或指数格式,精度的含义是小数位数。 8.5 文件流 考点8 文件流的建立、打开及关闭 l.文件流的建立 文件流是文件流类的实例对象C+十系统在头文件fstream中定义了3个文件流类: ifstream,ofstream和fstream。要创建文件流,必须包含头文件fstream,并声明所创建的文件流是上述哪个实例对象例如: ifstream fin; //创建输入流对象firs tfstream fout; //创建输出流对象fout itream fio; //创建输入输出流对象fio 2.文件的打开与关闭 关于文件的打开是既可以在定义文件流对象的同时打开文件,也可以在定义文件流对象以后用open ( )函数打开文件。C++允许用以下两种方法之一打开文件 (1)用成员函数open()。 (2)用构造1*1数(创建对象)。 其中,一可以通过构造函数或open()函数的第2个参数确定文件的打开方式。文件的打开方式如表8-3所示的常量来表示。 当文件相连接的流对象的生命周期结束时,它们的释放函数将关闭与这些流对象相连接的文件。另外,也可以使用close()函数显式地关闭文件。 考点9 文件流状态的判别 如表8-4所示的文件流的成员函数可以判别文件流的状态。
考点10 文件流的定位与特殊的文件流 1.文件流的定位 文件流的位置以字节为单位,它有两种不同的位置:输入位置和输出位置。文件流的定位方式有三种用ios base::seek dir中的一组枚举符号表示,它们是: (1)ios base::beg:相对于文件首; (2)ios base::cur:相对于当前位置(负数表示当前位置之前); (3)ios base::end:相对于文件尾。 每次输入或输出后自动定位于下一个需要输入或输出的位置。其中,完成输入定位的函数有;seekp()和tellg();完成输出定位的函数有:seekp)和tellp()。 2.特殊的文件流 有两种特殊的文件流:CON和PRN。其中,以CON为文件名时,流对象对应于键盘或显示器;以PRN为文件名时,流对象对应于打印机。 考点11 文件流的无格式输入输出
|
|
|
文章录入:杜斌 责任编辑:杜斌 |
|
上一篇文章: 计算机等级考试二级C++考点分析之继承和派生 下一篇文章: 计算机等级二级C程序修改汇总 |
【字体:小 大】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 |
|
|