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