现在的位置: 首页 > 综合 > 正文

C/C++开发语言系列之14—C++重载运算符

2013年12月09日 ⁄ 综合 ⁄ 共 1812字 ⁄ 字号 评论关闭

虽然重载运算符所实现的功能完全可以用函数实现,但是使用运算符重载能使用户程序易于编写、阅读和维护。在实际工作中,类的声明和类的使用往往是分离的。假如在声明Complex类时,对运算符+,-,*,/都进行了重载,那么使用这个类的用户在编程时可以完全不考虑函数是怎么实现的,放心大胆地直接使用+,-,*,/进行复数的运算即可,十分方便。
对下面的运算符重载函数operator+还可以改写得更简练一些:
Complex Complex∷operator + (Complex &c2)
{return Complex(real+c2.real, imag+c2.imag);}

需要说明的是: 运算符被重载后,其原有的功能仍然保留,没有丧失或改变。通过运算符重载,扩大了C++已有运算符的作用范围,使之能用于类对象。

运算符重载对C++有重要的意义,把运算符重载和类结合起来,可以在C++程序中定义出很有实用意义而使用方便的新的数据类型。运算符重载使C++具有更强大的功能、更好的可扩充性和适应性,这是C++最吸引人的特点之一。

  1. C++不允许用户自己定义新的运算符,只能对已有的C++运算符进行重载。
  2. C++允许重载的运算符。


C++中绝大部分的运算符允许重载,不能重载的运算符只有5个:
.  (成员访问运算符)
.* (成员指针访问运算符)
∷ (域运算符)
sizeof(长度运算符)
?: (条件运算符)


#include
<iostream>

using namespace std;
class Complex
{
   public:
   Complex( ){real=0;imag=0;}
   Complex(double r,double i){real=r;imag=i;}
   Complex operator+(Complex &c2);//声明重载运算符的函数
   void display( );
   private:
   double real;
   double imag;
};
Complex Complex∷operator+(Complex &c2) //定义重载运算符的函数
{
   Complex c;
   c.real=real+c2.real;
   c.imag=imag+c2.imag;
return c;
}

void Complex∷display( )
{
   cout<<″(″<<real<<″,″<<imag<<″i)″<<endl;
}

int main( )
{
   Complex c1(3,4),c2(5,-10),c3;
   c3=c1+c2; //运算符+用于复数运算
   cout<<″c1=″;c1.display( );
   cout<<″c2=″;c2.display( );
   cout<<″c1+c2=″;c3.display( );
   return 0;
}
运行结果:
c1=(3+4i)
c2=(5-10i)
c1+c2=(8,-6i)




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

  1. 重载不能改变运算符运算对象(即操作数)的个数。
  2. 重载不能改变运算符的优先级别。
  3. 重载不能改变运算符的结合性。
  4. 重载运算符的函数不能有默认的参数,否则就改变了运算符参数的个数,与前面第(3)点矛盾。
  5. 重载的运算符必须和用户定义的自定义类型的对象一起使用,其参数至少应有一个是类对象(或类对象的引用)。也就是说,参数不能全部是C++的标准类型,以防止用户修改用于标准类型数据的运算符的性质。
  6. 用于类对象的运算符一般必须重载,但有两个例外,运算符“=”和“&”不必用户重载。

    ① 赋值运算符(=)可以用于每一个类对象,可以利用它在同类对象之间相互赋值。

    ② 地址运算符&也不必重载,它能返回类对象在内存中的起始地址。
  7. 应当使重载运算符的功能类似于该运算符作用于标准类型数据时所实现的功能。
  8. 运算符重载函数可以是类的成员函数(如例10.2),也可以是类的友元函数,还可以是既非类的成员函数也不是友元函数的普通函数。


如前面例程中对运算符“+”进行了重载,使之能用于两个复数的相加。在该例中运算符重载函数operator+作为Complex类中的成员函数。“+”是双目运算符,为什么在例程中的重载函数中只有一个参数呢?实际上,运算符重载函数有两个参数,由于重载函数是Complex类中的成员函数,有一个参数是隐含的,运算符函数是用this指针隐式地访问类对象的成员。

抱歉!评论已关闭.