Chinaunix首页 | 论坛 | 博客
  • 博客访问: 39588
  • 博文数量: 8
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 82
  • 用 户 组: 普通用户
  • 注册时间: 2013-07-19 14:23
个人简介

本尊不死,尔等终究为奴...

文章分类

全部博文(8)

文章存档

2016年(1)

2015年(4)

2013年(3)

我的朋友

分类: C/C++

2015-12-04 12:51:19

一, 运算符重载的意义
    C++ 允许我们重定义操作符用于类类型对象时的含义。如果需要,可以像内置转换那样使用类类型转换,将一个类型的对象隐式转换到另一类型。
    通过操作符重载,可以重定义大多数操作符,使它们用于类类型对象。明智地使用操作符重载可以使类类型的使用像内置类型一样直观。允许程序使用表达式而不是命名函数,可以使编写和阅读程序容易得多。将     

点击(此处)折叠或打开

  1. cout << "The sum of " << v1 << " and " << v2 << " is " << v1 + v2 << endl;

 和以下更为冗长的代码相比较就能够看到。如果 IO 使用命名函数,类似下面的代码将无法避免:      

点击(此处)折叠或打开

  1. // hypothetical expression if IO used named functions 
  2. cout.print("The sum of ").print(v1).
  3.      print(" and ").print(v2).print(" is ").
  4.      print(v1 + v2).print("\n").flush();


二, 运算符重载的规则
    1.  C++中的运算符除了以下四个之外,全部可以重载,而且只能重载C++中已有的运算符
不能重载的运算符只有五个: 成员运算符“.”、指针运算符“*”、作用域运算符::“sizeof”、条件运算符?:
    2. 重载之后的优先级和结合性不会改变;
    3. 通过连接其他合法符号可以创建新的操作符。例如,定义一个 operator** 以提供求幂运算是合法的. 另外, 重载操作符必须具有一个类类型操作数. 例如,内置的整型加号操作符不能重定义: 
        int operator+(int, int);//非法
三, 运算符重载形式有两种,重载为类的成员函数和重载为类的友元函数。 
    1. 运算符重载为类的成员函数的一般语法形式为:
 
    函数类型 operator 运算符(形参表)
 
    { 
        
函数体;
 
    } 
    2. 运算符重载为类的友元函数的一般语法形式为:
 
    friend 
函数类型 operator 运算符(形参表)
 
    { 
         
函数体;
 
    } 
    其中,函数类型就是运算结果类型;operator是定义运算符重载函数的关键字;运算符是重载的运算符名称。
 当运算符重载为类的成员函数时,函数的参数个数比原来的操作个数要少一个;当重载为类的友元函数时,参数个数与原操作数个数相同。原因是重载为类的成员函数时,如果某个对象使用重载了的成员函数,自身的数据可以直接访问,就不需要再放在参数表中进行传递,少了的操作数就是该对象本身。而重载为友元函数时,友元函数对某个对象的数据进行操作,就必须通过该对象的名称来进行,因此使用到的参数都要进行传递,操作数的个数就不会有变化。 
运算符重载的主要优点就是允许改变使用于系统内部的运算符的操作方式,以适应用户自定义类型的类似运算.

四, 
举一个关于给复数运算重载复数的四则运算符的例子。复数由实部和虚部构造,可以定义一个复数类,然后再在类中重载复数四则运算的运算符。先看以下源代码    

点击(此处)折叠或打开

  1. #include <iostream>

  2. using namespace std;

  3. class complex
  4. {
  5. public:
  6.     complex() : m_dReal(0),    m_dImag(0){}
  7.     complex(double r, double i) : m_dReal(r), m_dImag(i){}

  8.     inline complex operator +(const complex &c);
  9.     inline complex operator -(const complex &c);
  10.     inline complex operator *(const complex &c);
  11.     inline complex operator /(const complex &c);
  12.     friend inline ostream& operator<<(ostream& os, const complex &c);

  13. private:
  14.     double    m_dReal;
  15.     double    m_dImag;
  16. };

  17. inline complex complex::operator +(const complex &c)
  18. {
  19.     return complex(m_dReal + c.m_dReal, m_dImag + c.m_dImag);
  20. }

  21. inline complex complex::operator -(const complex &c)
  22. {
  23.     return complex(m_dReal - c.m_dReal, m_dImag - c.m_dImag);
  24. }

  25. inline complex complex::operator *(const complex &c)
  26. {
  27.     return complex(m_dReal * c.m_dReal - m_dImag * c.m_dImag, m_dReal * c.m_dImag + m_dImag * c.m_dReal);
  28. }

  29. inline complex complex::operator /(const complex &c)
  30. {
  31.     return complex((m_dReal * c.m_dReal + m_dImag + c.m_dImag) / (c.m_dReal * c.m_dReal + c.m_dImag * c.m_dImag),
  32.         (m_dImag * c.m_dReal - m_dReal * c.m_dImag) / (c.m_dReal * c.m_dReal + c.m_dImag * c.m_dImag));
  33. }

  34. inline ostream& operator<<(ostream& os, const complex &c)
  35. {
  36.     if(c.m_dImag < 0)
  37.         os << c.m_dReal << c.m_dImag << 'i';
  38.     else
  39.         os << c.m_dReal << '+' <<c.m_dImag <<'i';
  40.     os << endl;

  41.     return os;
  42. }

  43. void main()
  44. {
  45.     complex c1(2.0, 3.0), c2(4.0, -2.0), c3;
  46.     c3 = c1 + c2;
  47.     cout<<"c1+c2=" << c3;

  48.     c3 = c1 - c2;
  49.     cout<<"c1-c2=" << c3;

  50.     c3 = c1 * c2;
  51.     cout<<"c1*c2=" << c3;

  52.     c3 = c1 / c2;
  53.     cout<<"c1/c2=" << c3;

  54.     c3 = (c1+c2) * (c1-c2) * c2/c1;
  55.     cout<<"(c1+c2)*(c1-c2)*c2/c1=" << c3;
  56. }
输出如下: 
c1+c2=6+1i

c1-c2=-2+5i
c1*c2=14+8i
c1/c2=0.45+0.8i
(c1+c2)*(c1-c2)*c2/c1=9.61538+25.2308i

说明:
    1. 重载为成员函数, 
将运算符重载函数说明为类的成员函数格式如下:

    <类名> operator <运算符>(<参数表>)

    其中,operator是定义运算符重载函数的关键字。

    程序中出现的表达式:

            c1+c2

     编译程序将给解释为:
        
c1.operator+(c2)

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

    2. 重载为友元函数, 的运算符重载函数的定义格式如下: 

    friend <类型说明符> operator <运算符>(<参数表>)
    
当重载友元函数时,将没有隐含的参数this指针。这样,对双目运算符,友元函数有2个参数,对单目运算符,友元函数有一个参数。但是,有些运行符不能重载为友元函数,它们是:=,(),[]和->

阅读(1237) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~