对运算符进行重载【C++】
一、多态性的概念
多态性是面向对象程序设计的重要特性之一。
多态性主要体现在:向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为。也就是说,每个对象可以用自己的方式去响应共同的消息。
C++ 支持两种形式的多态性,一种是编译时的多态性,称为静态联编。一种是运行时多态,称为动态联编。
多态的实现:函数重载、运算符重载、虚函数。
二、运算符重载
在以前的学习中,C++ 中预定义的运算符的操作对象只能是基本数据类型。实际上,对于很多用户自定义的类型(如类),也需要有类似的运算操作。
(1)运算符重载是对已有的运算符赋予多重含义
必要性:C++ 中预定义的运算符其运算对象只能是基本数据类型,而不适用于用户自定义类型(如类)。
实现机制:将指定的运算表达式转化为对运算符函数的调用,运算对象转化为运算符函数的实参。编译系统对重载运算符的选择,遵循函数重载的选择原则。
(2)运算符重载规则
C++ 中运算符的重载虽然给我们设计程序带来很多的方便,但对运算符的重载时,以下的几种情况需要注意:
a. 一般来说,不改变运算符原有含义,只让它能针对新类型数据的实际需要,对原有运算符进行适当的改造。例如,重载 “ + ” 运算符后,它的功能还是进行加法运算。
b. 重载运算符时,不能改变运算符原有的优先级别,也不能改变运算符需要的操作数的数目。重载之后运算符的优先级和结合性都不会改变。
c. 不能创建新的运算符,只能重载 C++ 中已有的运算符。
d. 有些运算符不能进行重载。如:“ . ” 类成员运算符、“ * ” 类指向运算符、“ :: ” 类作用域运符、“ ? : ” 条件运算符及 “ sizeof ” 求字节数运算符。
e. “ = ” 和 “ & ” 不必用户重载
运算符重载不能滥用,只有当用户自定义类型上的操作与内置运算符之间存在逻辑对应关系时,重载的运算符才能使程序显得更自然、更直观。
(3)运算符重载的实现
运算符重载的本质就是函数重载。在实现过程中,首先把指定的运算表达式转化为对运算符函数的调用,运算对象转化为运算符函数的实参,然后根据实参的类型来确定需要调用的函数,这个过程是在编译过程中完成的。运算符重载形式有两种:重载为类的成员函数和重载为类的友元函数。
a. 运算符重载为类的成员函数
语法形式为:
函数类型 operator 运算符(形参表) {
函数体;
}
b. 运算符重载为类的友元函数
运算符重载还可以为友元函数。当重载友元函数时,将没有隐含的参数 this 指针。语法形式如下:
friend 函数类型 operator 运算符(形参表);
重载为类成员函数时:参数个数 = 原操作数个数 - 1(后置 ++、-- 除外)。
重载为友元函数时:参数个数 = 原操作数个数,且至少应该有一个自定义类型的形参。
三、双目运算符重载
(1)双目运算符 B:
如果要重载 B 为类成员函数,使之能够实现表达式 oprd1 B oprd2,其中 oprd1 为 A 类对象,则 B 应被重载为 A 类的成员函数,形参类型应该是 oprd2 所属的类型。经重载后,表达式 oprd1 B oprd2<