计算机等级考试二级C++各章内容摘要8

计算机等级考试二级C++各章内容摘要8,第1张

计算机等级考试二级C++各章内容摘要8,第2张

第八章运算符重载
运算符函数数据和运算符重载运算符重载是计算机语言固有多态性的体现,是计算机语言的基础之一。c++将重载运算符视为特殊函数,称为运算符函数。运算符重载是函数重载的一个特例。和一般的重载函数一样,编译系统可以根据运算符使用环境的不同,即参数(操作数)数量或类型的不同,来区分同一个运算符的不同含义。“运算符重载”针对的是C++中原有的运算符,不可能通过重载来创建新的运算符。除了。,.*,-> *,::,?:除了这五个运算符,其他运算符都可以重载。由于许多符号是一元运算符和二元运算符所共有的,为了避免歧义,不应设置重载运算符函数的默认值,调用时也不应省略参数。除了两个特殊运算符new和delete之外,任何运算符如果重载为成员函数,都不能重载为静态函数。=、[]、()、->和所有类型转换运算符只能作为成员函数重载,不能为枚举类型操作数重载。运算符的函数名由运算符前面的关键字operator组成,可以在声明或调用运算符时使用。【考点2】规范运算符的重载
1。小数类fractionfraction的声明和定义包含在头文件fraction.h和程序文件fraction.cpp中一个用分数表示的标准分数必须满足以下几份:①分母总是正的,分数和符号用分子表示;②分子和分母互为质数,即总的表达式是最简单的分数。Fraction通过两个私有数据成员num和den分别保存分子和分母,必要时调用标准化函数进行标准化,使num和den的值满足标准分数条件。Gcd是求两个整数的公约数的函数。化简分数的时候标准化叫它。
2。重载负运算符“-”因为fraction用分子的符号表示整个分数的符号,所以所谓“负取”只需要取分子num的负值即可。因为负运算符“-”是一元运算符,当重载为成员函数时,参数表中没有参数,那个操作数以这个指针的形式隐藏在参数表中。要做到这一点,只需要在fraction.h的类声明中添加:fraction poerator-()const { return fraction(-num,den));}就行了。因为完整的定义直接在类声明中给出,所以它是一个内联函数。“-”是典型的一元运算符。除++和-之外的其他一元运算符的重载可以参考这里描述的方法。
3。重载的加法运算符“+”+”是二元运算符,所以重载为成员函数时,参数表中只有一个参数,对应的是第二个操作数,第一个操作数是对象本身,只是以这个指针的形式隐藏在参数敏感表中。“+”是典型的二元运算符。除赋值运算符之外的其他二元运算符的重载可以参考这里描述的方法。
4。重载的递增运算符“++”++可以是前缀运算符(之前递增1),也可以是后缀运算符(之后递增1)。为了区分这两种情况,重载这两个运算符时,格式上必须有区别:重载后缀++时,必须多一个虚参数:int,所以在形式上看起来像是二元运算符重载。
5。重载类型转换器“long”类型转换器必须作为成员函数重载。重载类型转换器时,运算符本身已经指示了返回值类型,因此没有必要声明返回值类型。分数可以看作是由整数部分和纯分数部分组成。为了获得一个分数的整数部分,可以称之为分数重载型转换器long。为此,可以添加:opertatorlong()const { return num/den;}
6。重载赋值运算符" = "赋值运算符只能作为成员函数重载。真正需要重载赋值运算符的常见情况有:包含指针赋值运算符= between dynamic 空的类的重载要注意以下几点:①返回值声明为引用,但语句return * this总是在函数体中使用;返回;②如果将参数声明为对相似对象的引用或指针,则应判断所指向的对象是否与被赋值对象相同,如果相同,则立即返回,不做任何赋值;③如果被分配的对象占用了dynamic 空或其他资源,为了接收新的资源,应该先释放这些资源;④如果参数声明为指针或引用,通常要用const修饰;⑤如果参数声明为指针,要判断是否为空进行特殊处理;⑥如果一个类需要重载operator =,通常需要定义自己唯一的复制构造函数,反之亦然。
7。重载复合赋值运算符“+=”重载复合赋值类运算符,如+=、-=等。对于重载赋值运算符,也应遵循上述注意事项。与赋值运算符不同,复合赋值运算符可以重载为成员函数和非成员函数。在后一种情况下,两个操作数都必须出现在参数表中;为了保持运算符原有的特性,第一个参数要声明为引用(否则不能改变其值),返回值也要像重载“=”一样声明为引用,最后返回第一个有新值的参数。
8。重载关系运算符">"重载关系运算符函数应返回逻辑值。对于分数的两个对象,可以通过比较一般除法后的两个分子来确定它们的大小。因此,可以在fraction.h的类声明中添加以下成员函数声明:bool operator >(fraction f){ return num * f . den > f . num * den;}其他关系运算符可以参考重载。
9。重载的下标访问运算符“[]”运算符[]只能作为成员函数重载。
1。重载c++流运算符“”和“”c++流输入运算符和输出运算符只能作为非类成员函数重载。在一个类中,或者在必要时可以声明为友元函数。【测试点3】
运算符过载时应注意的几个问题。1重载操作符应该保持它们原来的基本语义。重载操作符应该反映在新数据类型上的原始操作符函数的扩展中。它的使用应该会使程序中算法的表达显得更流畅、更自然,让阅读程序的人在没有其他说明材料的帮助下也能正确理解。不要让重载运算符承担更适合一般函数的函数。
2。带着负荷出生的操作者应该尽可能保持基本。原特征运算符的操作数个数、优先级和组合是三个最基本的特征,重载时自然保留,不需要采取特殊措施。请注意以下特征。①第一个操作数是否要求是左值操作数。②是否修改第一个操作数。③运算结果是否为左值数据。④确保第二个操作数不变。
3。应该匹配运算符的重载。有些操作符关系密切,逻辑相关,所以如果其中一个操作符需要重载,往往意味着同一组中的其他操作符也需要重载。
4。使用参考参数还是非参考参数?无引用参数的优点是:参数通过值传递,参数变量只是实参的副本,所以参数变量的修改不会影响实参;当相关对象有一个只有一个参数的构造函数时,我们可以充分利用表达式处理过程中的自动转换机制,使表达式显得更加自然。但是,当对象较大或者需要深度复制时,非引用参数会占用较多的计算机资源,影响参数传递的效率。引用的好处是,当对象较大或者需要深度复制时,可以大大减少资源的占用,提高参数传递的效率。但是不能使用系统的自动转换机制。
5。作为成员函数重载还是作为非成员函数重载?=、[]、()、->和所有类型转换运算符只能作为成员函数重载。如果允许第一个操作数不同于同类对象,而是其他数据类型,则只能作为非成员函数重新启动(如iostream运算符和就是这种情况)。如果希望系统在必要时使用只有一个参数的构造函数自动转换第一个操作数,那么也应该将运算符重载为非成员函数;在这种情况下,运算符函数的参数应该是非参考参数,否则无法达到预期的效果。在其他情况下,它应该作为成员函数重载。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 计算机等级考试二级C++各章内容摘要8

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情