演算子リロード(operator overloading)

3926 ワード

演算子のリロード(operator overloading)は文法的な便利さにすぎず、別の関数の呼び出し方法にすぎない.
C++では、処理クラスの新しい演算子を定義できます.この定義は一般的な関数の定義に似ていますが、関数の名前はキーワードoperatorとその後に続く演算子から構成されています.違いはそれだけだ.彼は他の関数のように関数でもあり、コンパイラが適切なモードに遭遇すると、この関数が呼び出されます.
演算子のリロードには、まず興味深いツールです.しかし、それは文法的な便利さにすぎず、別の関数呼び出し方式である.したがって、演算子の再ロードは、クラスに関連するコードが書きやすく、特に読みやすい場合にのみ理由があります.
演算リロード構文:
定義演算子のリロードは、定義関数のようなものですが、この関数の名前はoperator@で、ここで@はリロードされた演算子を表します.関数パラメータテーブルのパラメータの数は、次の2つの要因に依存します.
(1)演算子は1元の(1つのパラメータ)、2元の(2つのパラメータ);
(2)演算子はグローバル関数(1元は1つのパラメータ、2元は2つのパラメータ)またはメンバー関数(1元にはパラメータがなく、2元には1つのパラメータ-このクラスのオブジェクトは左側のパラメータとして使用される)として定義されます.
#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+は、operator+=のrv( )パラメータとして される しいInterger( )を します.しかし、この は でなければ されます.
ロードできる :
まず、Cの のない ( えば**でべき を す)は できません. の は できません. のパラメータの は できません.
ロードできる :
+
  -
   *
   /
   %    ^
&
   |
   ~
   ,
   =
   !
<
   >
  <=
  >=
  ++
  --
+=
   -=   /=
 %=
  ^=
   &=
|=
  *=
  <<=
>>=
 []
 ()
->
 ->*
 new
new[]
delete
delete[]
<<
 >>
==
 !=
 &&
 ||
ロードできない :
:: .* . ?:
: の operator[]は、メンバー であり、1つのパラメータのみを け れる があります.オブジェクトは のように し、この から に を すことができるため、 の に に できます.この はよくリロードされます.
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はメンバーと メンバーの の のために のシミュレーションを した.
すべての メンバー
=()->メンバーでなければなりません
+=-=/=*=^=&=|=%=>>=<=メンバー
その のすべての メンバー