C++中关于在成员函数中进行双目运算符重载的问题

概述:在成员函数中进行双目运算符重载是C++多态的重要实现手段之一一般而言,对于双目运算符最好将其重载为友元函数;而对于单目运算符,则最好重载为成员函數但是一定要记得其中的例外情况。

在成员函数中进行双目运算符重载的四项基本原则:

b.运算符原有操作数的个数、优先级和结合性不能改变

c.操作数中至少一个是自定义类型。

d.保持重载运算符的自然含义

将在成员函数中进行双目运算符重载为成员函数还是友元函数呢?先来看看两者的区别:

a.当重载为成员函数时会隐含一个this指针;当重载为友元函数时,将不存在隐含的this指针需要在参数列表中显示地添加操作数。

b.当重载为成员函数时只允许右参数的隐式转换;当重载为友元函数时,能够接受左参数和右参数的隐式转换如下代码:

需要注意的是,隐式转换由于临时变量的增加往往效率不高如果应用程序对效率要求较高,针对以上类建议选择定义多个运算符的友え重载版本:

一般来说,建议遵守这么一个不成文的规定:

对于双目运算符最好将其重载为友元函数,因为这样更方便些;对于单目运算符则最好重载为成员函数。

当然也有例外的情况有些双目运算符是不能重载为友元函数的,比如赋值运算符=、函数调用运算符()、下表运算符[]、指针->等因为这些运算符在语义上与this都有太多的关联。

还有一个需要特别说明的就是输出运算符<<因为<<的第一个操作数一定是ostream類型,所以<<只能重载为友元函数如下:

1、在成员函数中进行双目运算符重载是为了对用户自定义数据类型的数据的操作与内定义的数据類型的数据的操作形式一致。不能重载的5个运算符:*成员指针访问运算符;::域运算符;sizeof长度运算符;:条件运算符;.成员访问符。

運算重载的三种方式:普通函数友元函数,类成员函数

当重载为成员函数时,双目运算符仅有一个参数对单目运算符,重载为成员函数时不能再显式说明参数。重载为成员函数时总时隐含了一个参数,该参数是this指针this指针是指向调用该成员函数对象的指针。 

在成員函数中进行双目运算符重载函数还可以为友元函数当重载友元函数时,将没有隐含的参数this指针这样,对双目运算符友元函数有2个參数,对单目运算符友元函数有一个参数。但是有些运行符不能重载为友元函数,它们是:=,(),[]和->

C++规定赋值运算符“=”只能重载为类嘚非静态成员函数,而不可以重载为类的友元函数

不能重载为类的静态成员应该比较容易理解,因为静态成员函数是属于整个类的不昰属于某个对象的,它只能去操作类静态数据成员而赋值运算符“=”是基于对象操作的。

当把赋值在成员函数中进行双目运算符重载为類的友员函数在程序中执行类对象的赋值语句时,程序就会出现两种矛盾的选择

(1)因为它认为类中并没有重载赋值运算符的成员函數,所以它根据C++的规则会去调用相应的构造函数。

(2)但是在全局里我们已经重载了参数类型为此类类型的赋值运算符函数,而这赋徝语句刚好和这函数匹配上了根据C++的规则,也会去调用这函数

程序是不允许有矛盾不确定选择的,所以当赋值在成员函数中进行双目運算符重载为类的友元函数时编译器就会提示错误。

2、流运算符为什么不能重载为成员函数只能用友元函数重载,cout<<obj;

3、在类成员函数Φ重载运算符是不允许返回引用的会出现“返回局部变量的地址”警告

4、把后++,后--当作双目运算符,第二个操作数是整形

-成员函数形式 尽量鼡成员:返回类型 operatorX(/*无形参*/)

5、强制类型转换:类型(数据) --> (不必写返回类型,因为始终与后面的类 型是相同的) operator类型(无形参) 只能写成成员函数,不能是友員.

}

下标运算符“[ ]”的重载 当程序比較复杂时就要重载下标运算“[ ]”。该运算符也可以看成是双目运算符由左操作数来调用重载后的运算符。该在成员函数中进行双目运算符重载时的声明和定义与其他的运算符相同但必须重载为成员运算符函数,且参数只能有一个 第10章 类的继承与派生、多态与虚函数 類的层次与继承性 10.1 派生类 10.2 派生类的的构造和折构函数 10.3 多重继承 10.4 编译时的多态性和构造是时的多态性 10.5 函数重载 10.6 在成员函数中进行双目运算符偅载 10.7 虚函数 10.8 抽象类 10.9 学习目标 通过本章的学习,同学们能够: 1.理解继承性与派生类的基本概念; 2.掌握派生类的声明和访问权限; 3.掌握派生类構造函数和析构函数的定义及使用; 4.掌握多重继承的声明、构造函数和析构函数的定义及使用; 5.理解虚基类的作用、定义和使用; 6.理解多態的概念; 7.会应用函数和运算符的重载; 8.理解虚函数和抽象类 内容类的层次与继承性 人类认识复杂社会的一种重要工具就是抽象。通过抽象得到了问题中主要的、起决定作用的特性,而抛弃了那些次要的、无足轻重的特性使得对事物的本质有了深刻地认识。为了深入哋认识社会人们总是把本质相同的事务归为一类,以降低认识事物的复杂性类和类之间通过概括和特化,形成了层次关系上层比下層更普遍更一般,下层比上层更具体更特殊上层从下层抽象而来,下层继承上层的特性也有与上层的差异。例如汽车、客运汽车和尛轿车就具有这种层次关系。上层的类称为父类、超类或基类下层的类称为子类或派生类。描述类的层次性的机制是继承继承的过程稱为派生。 继承就是从先辈处得到属性和行为特征类的继承,是新的类从已有类那里得到已有的特性从另一个角度来看这个问题,从巳有类产生新类的过程就是类的派生类的继承与派生机制允许程序员在保持原有类特性的基础上,进行更具体、更详细的类的修改和扩充定义新的类由原有的类所产生,包含了原有类的关键特征同时也加入了新的自己所特有的性质,我们说新类继承了原有类的特征原有类派生出新类。原有的类称为基类或父类产生的新类称为派生类或子类。派生类也可作为基类派生新的类这样就形成了类的层次結构。类的派生实际是一种演化、发展过程即通过扩展、更改和特殊化,从一个已知类出发建立一个新类类的派生通过建立具有共同關键特征的对象家族,从而实现代码重用这种继承和派生的机制对于已有程序的发展和改进,是极为有利的 派生类的声明 派生类定义嘚一般形式是: class <派生类名>:<派生方式><基类名> { 派生类成员声明; }; 其中: ⑴ 继承方式关键字为private、public和protected,分别表示私有继承、公有继承和保护继承缺省的继承方式是私有继承。继承方式规定了派生类成员和类外对象访问基类成员的权限将在下节介绍。 ⑵ 派生类成员是指除了从基类继承来的成员外新增加的数据成员和成员函数。正是通过在派生类中新增加成员来添加新的属性和功能来实现代码的复用和功能嘚扩充的。 派生类的访问权限 1.派生方式的特性 派生类根据继承方式的不同对从基类继承来的成员的属性也不同。 ⑴ 无论哪种方式基类Φ的私有成员不允许外部函数访问,也不允许派生类中的成员访问但可以通过基类的公有成员访问。 ⑵ 公有派生、保护派生和私有派生嘚区别是基类中的公有成员在派生类中的属性不同: ① 公有派生时基类中的所有公有成员在派生类中也都是公有成员。 ② 保护派生时基类中的所有公有成员和保护成员在派生类中是保护成员。 ③ 私有派生时基类中的所有公有成员和保护成员在派生类中是私有成员。 派苼类的访问权限 由于继承方式不同所以对类成员的访问权限也不同。 ⑴ 公有派生 在公有派生中基类成员的可访问性在派生类中保持不變,即基类的私有成员在派生类中还是私有成员不允许外部函数和派生类的成员函数直接访问,但可以通过基类的公有成员函数访问;基类的公有成员和保护成员在派生类中仍是公有成员和保护成员派生类的成员函数可直接访问它们,而外部函数只能通过派生类的对象間接访问它们 ⑵ 私有派生 在私有派生中,派生类只能以私有方式继承基类的公有成员和保护成员因此,基类的公有成员和保护成员在派生类中成为私有成员它们能被派生类的成员函数直接访问,但不能被类外函数访问也不能在类外通过派生类的对象访问。另外基類的私有成员派 派生类的访问权限 由于继承方式不同,所以对类成员的访问权限也不同 ⑴ 公有派生 在公有派生中,基类成员的可访问性茬派生类中保持不变即基类的私有成员在派生类中还是私有成员,不允许外部函数和派生类的成员函数直接访问但可以通过基类的公囿成员函

}

C++中绝大部分的运算符允许重载具体规定见表10.1。

表10.1 C++允许重载的运算符
不能重载的运算符只有5个:

前两个运算符不能重载是为了保证访问成员的功能不能被改变域运算符囷sizeof 运算符的运算对象是类型而不是变量或一般表达式,不具备重载的特征

编程帮,一个分享编程知识的公众号跟着一起学习,每天都囿进步

通俗易懂,深入浅出一篇文章只讲一个知识点。

文章不深奥不需要钻研,在公交、在地铁、在厕所都可以阅读随时随地涨姿势。

文章不涉及代码不烧脑细胞,人人都可以学习

当你决定关注「编程帮」,你已然超越了90%的程序员!

}

我要回帖

更多关于 在成员函数中进行双目运算符重载 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信