.1.运算符重载的定义及实例
C++ 中的多态性分为动态多态性和静态多态性,前者由虚函数实现,后者由函数重载和运算符重载实现。静态多态性的优点是函数调用速度快、效率高,缺点是编程不够灵活。
运算符重载是对已经有的运算符赋予多重含义,同一个运算符作用于不同类型的数据将产生不同的行为。C++中的运算符只能是基本数据类型,很多用户自定义的行为需要用运算符重载实现,运算符重载扩充了C++语言本身的功能。
下面是运算符重载的一个例子,+可以完成两个int型数据加法,或者两个double类型的数据加法,如果要完成两个类对象的相加,需要使用重载。例子中定义了复数类并实现相加的功能。
2.C++可以重载的运算符
+ |
- |
* |
/ |
% |
^ |
& |
| |
~ |
! |
, |
= |
< |
> |
<= |
>= |
++ |
-- |
<< |
>> |
== |
!= |
&& |
|| |
+= |
-= |
/= |
%= |
^= |
&= |
|= |
*= |
<<= |
>>= |
[] |
() |
-> |
->* |
new |
new[] |
Delete |
delete[] |
C++不可以重载的运算符有:
:: . .* ?:
(1) 重载的运算符的优先级和结合性都不会改变运算符重载的规则如下:
(2) 运算符重载是对原有运算符的适当改造,一般地,重载的功能与原来的功能类似
(3) 运算符重载不能改变原运算符的操作对象个数,同时至少有一个操作数是自定义类型。
3.运算符重载的方式
运算符重载分为成员函数重载和友元函数重载两种。这里先介绍成员函数重载的方式,它的格式为:
<函数类型> operator <运算符>(<形式参数>)
{
···//<函数体>
}
运算符重载时,用operator作关键字,重载单目运算符时,形式参数表为空,调用单目运算符的当前对象是唯一的操作数,重载双目运算符时,形参表指定第二个操作数,第一个操作数即为调用运算符的对象本身。在上面介绍的例子中,重载+实现两个复数的相加,应该有两个操作数,但是由于使用了成员重载,形式参数表中只需要一个参数。
# include <iostream> using namespace std; class Complex { public: Complex(int i,int j):x(i),y(j){} Complex & operator+(Complex &); void print(); private: int x; int y; }; Complex & Complex::operator+(Complex & a) { x+=a.x; y+=a.y; return *this; } void Complex::print() { cout<<x<<"+"<<y<<"i"<<endl; } int main() { Complex t1(1,3); Complex t2(2,4); Complex t3=t1+t2; // t3.print(); cin.get(); return 0; }
运算符的友元重载形式为:
friend <函数类型> operator <运算符>(<形式参数>)
{
··· // <函数体>
}
从形式上看,友元重载单目运算符时,形式参数表为一个操作数,重载双目运算符时,形式参数表为两个参数,这一点与成员重载的方式不同。
# include <iostream> using namespace std; class Complex { public: Complex(){} Complex (int i,int j):x(i),y(j){} void print(); friend Complex & operator+(Complex &a,Complex &b); private: int x; int y; }; Complex & operator +(Complex &a,Complex &b) { Complex c; c.x=a.x+b.x; c.y=a.y+b.y; return c; } void Complex::print() { cout<<x<<"+"<<y<<"i"<<endl; } int main() { Complex t1(1,2); Complex t2(2,3); Complex t3=t1+t2; t3.print(); cin.get(); return 0; }
上面的介绍了成员函数和友元函数重载运算符,什么时候用成员函数的形式重载运算符,什么时候用友元函数的形式重载运算符?这里有一些经验规则:
(1) = [] () ->必须用成员函数的形式重载
(2) 复合赋值运算符通常定义为类的成员
(3) 改变对象状态或与给行类型紧密联系的运算符,如自增、自减、解引用通常定义为类成员
(4) 对称的操作符,如算术操作符、相等操作符、关系操作符和位操作符,最好定义为友元函数