运算符重载(operator overloading)

运算符重载(operator overloading)只是一种语法上的方便,也就说他只是另一种函数的调用方式。

C++中,可以定义一个处理类的新运算符。这种定义很像一个普通函数的定义,只是函数的名字由关键字operator及其后紧跟的运算符组成。差别仅此而已。他像任何其他函数一样也是一个函数,当编译器遇到适当的模式时,就会调用这个函数。

对于运算符重载首先它是一个有趣的工具。但是,它仅仅只是一种语法上的方便,是另外一种函数调用方式。因此,只有在涉及类的代码更易写,尤其是更加容易读时才有理由进行运算符重载。

运算重载语法:

定义运算符重载就像定义函数,只是该函数的名字是operator@,这里@代表了被重载的运算符。函数参数表中参数的个数取决于两个因素:

(1) 运算符是一元的(一个参数),二元的(两个参数);

(2) 运算符被定义为全局函数(一元是一个参数,二元是两个参数)还是成员函数(一元没有参数、二元一个参数—此时该类的对象用做左侧的参数);

#include
using namespace std;

class Integer
{
     int i;
public:
   explicit Integer(int ii) : i(ii){}
    const Integer
    operator+(const Integer& rv) const
  {
   cout << "operator+" << endl;
         return Integer(i + rv.i);
 }

   Inter&
   operator+=(const Integer& rv)
    {
        cout << "operator+=" << endl;
        i += rv.i;
        return *this;
    }
};

int main()
{
    cout << "built-in types:" << endl;
    int i = 1, j = 2, k = 3;
   
    k += i + j;
    
    cout << "user-defined types:" << endl;
    Interger ii(1), jj(2), kk(3);
    kk += ii + jj;
}
对于二元运算符,唯一的参数是出现在运算符右侧的那个操作数。当一元运算符被定义为成员函数时,是没有参数的。所掉用的成员函数属于运算符左侧的那个对象。operator+产生一个新的Interger(临时的),它用作operator+=的rv(右)参数。一但这个临时变量不在需要就销毁。

可以重载的运算符:
首先不能使用C中没有意义的运算符(例如用**代表求幂),不能改变运算符的优先级,不能改变运算符的参数个数。
可以被重载的运算符:
+   -    *    /    %    ^
&    |    ~    ,    =    !
<    >   <=   >=   ++   --
+=    -=   /=  %=   ^=    &=
|=   *=   <<= >>=  []  ()
->  ->*  new new[] delete delete[]
<<  >> ==  !=  &&  ||
不能被重载的运算符:

:: .* . ?:

注意事项
下标运算符operator[],必须是成员函数并且只接受一个参数。因为它所作用的对象应该像数组一样操作,可以经常从这个运算符返回一个引用,所以他可以很方便的被应用于等号左侧。这个运算符经常被重载。

class Array
{
    public:
       expilicit Array(){};
      ~ Array(){};


       int& operator[](const int x)
      {
            return i[x];
      }
    
       int i[7];    
};


void main()
{
   Array T;


   T[4] = -1;
}

operator,-逗号运算符的重载,当逗号出现在一个对象左右,而该对象的类型是逗号定义所支持的类型时,将调用逗号运算符。然而,“operator,”调用的目标不是函数参数,而是被逗号分隔开的、没有被括起来的对象。当逗号出现在对象前面后面时,逗号函数的调用方式。
class Before
{
    public:
    int m_Val;
};


Before& operator,(int,Before& b)
{
  cout << "前" << endl;
 
   return b;
}


class After
{
    public:
     explicit After(){}
     ~After(){}
    
      const After& operator,(const After&)
      {
             cout << "后"<ui =4;
             retun *this;
      }


      int ui;
};


int main()
{
    Before c;
    1,c;


     After b,a;
     b.ui = 8;
     a.ui = 3;


     b,a;
    return 0;
}

当希望一个对象表现的像一个之针时通常用operator->.

#include "stdafx.h"

template  
class CExam
{
public:
	explicit CExam():m_p(new T){}
	~CExam(){
		delete m_p;
	}

	T* operator ->() { return  m_p; }  
private:
	T* m_p;
};

class tmpClas
{
public:
	tmpClas(){}
	~tmpClas(){}

	void CalTime()
	{
		int yu;

		yu =2+2;
	}
};

int _tmain(int argc, _TCHAR* argv[])
{
	CExam tmpV;

	tmpV->CalTime();

	return 0;
}

Murray 为成员和非成员之间的选择提出了如下的仿真:

所有一元运算符                                 成员

= () -> ->*                                      必须是成员

+= -= /= *= ^= &= |= %= >>= <<=      成员

所有其他二元运算符                          非成员


 
 

你可能感兴趣的:(C++)