c++演算子リロード(2)
3830 ワード
メンバー演算子の再ロード
構文フォーマット(1)クラスの内部
(2)クラス内宣言プロトタイプクラス外定義
説明*return thisを使用して、現在のオブジェクトの値を返す両目演算子のリロードができます.両目演算子の場合、メンバー演算子のリロード関数のパラメータテーブルには、演算子の右オペレータとして1つのパラメータしかありません.もう1つのオペランドは、このクラスの現在のオブジェクトがthisポインタを介して関数に暗黙的に渡されていることを示しています.
複数クラスComplexでは、2つのプライベートメンバー変数realとimgがそれぞれ複数の実部と虚部を表すように定義され、次にいくつかの共通のメンバー関数が定義されます.1つはパラメータを持たないデフォルトの構造関数であり、もう1つは2つのパラメータを持つ構造関数であり、この構造関数によってプライベートメンバー変数realとimgの初期化が実現されます.次に、戻り値ペアのないdisp()関数を使用して出力複素数の値を表示します.次に、4つの演算のリロード関数と、複素数の共役複素数を計算するための代入リロード演算子と、1つの>演算子のリロードを使用して複素数のサイズを判断します.最後に、複素数のモデリング演算に使用される一般的なメンバー関数です.
しゅつりょく
説明クラスのコンストラクション関数を使用すると、一時オブジェクト(名前を付けない)を作成できます.無名オブジェクトが結果を返すと、実行効率が高くなります.一般的な書き方は読み取り可能です.
ps:visual c++6.0はc++標準を完全に実現していない、#includeは友元関数演算子の再ロードをサポートしていない.hでいいです.
メンバー演算子のリロード関数と友元演算子のリロード関数の比較
(1)両目演算におけるメンバ~のパラメータテーブル1つのパラメータ友元2つの単目演算におけるメンバにパラメータ友元がないもの(2)整数をオブジェクトに加算する場合に友元を用いることが望ましい
たとえば、複数を整数に加算する場合は、メンバー演算子を使用して関数「+」演算子を再ロードします.
comとcom 1がクラスComplexのオブジェクトである場合、以下の文が正しい
しかし、次の文は機能しません.
次の2つの友元演算子を定義して関数を再ロードする場合
説明
構文フォーマット(1)クラスの内部
operator ( )
{
···
}
(2)クラス内宣言プロトタイプクラス外定義
class X {
operator ( );
};
X::operator ( )
{
···
}
説明*return thisを使用して、現在のオブジェクトの値を返す両目演算子のリロードができます.両目演算子の場合、メンバー演算子のリロード関数のパラメータテーブルには、演算子の右オペレータとして1つのパラメータしかありません.もう1つのオペランドは、このクラスの現在のオブジェクトがthisポインタを介して関数に暗黙的に渡されていることを示しています.
class X{
···
int operater +(x a);
···
}
複数クラスComplexでは、2つのプライベートメンバー変数realとimgがそれぞれ複数の実部と虚部を表すように定義され、次にいくつかの共通のメンバー関数が定義されます.1つはパラメータを持たないデフォルトの構造関数であり、もう1つは2つのパラメータを持つ構造関数であり、この構造関数によってプライベートメンバー変数realとimgの初期化が実現されます.次に、戻り値ペアのないdisp()関数を使用して出力複素数の値を表示します.次に、4つの演算のリロード関数と、複素数の共役複素数を計算するための代入リロード演算子と、1つの>演算子のリロードを使用して複素数のサイズを判断します.最後に、複素数のモデリング演算に使用される一般的なメンバー関数です.
#include "math.h"
#include
using namespace std;
class Complex{
private:
double real;
double img;
public:
Complex();
Complex(double r,double i);
void disp();
Complex operator + (const Complex &c);
Complex operator - (const Complex &c);
Complex operator * (const Complex &c);
Complex operator / (const Complex &c);
//
Complex& operator=(const Complex &c);
//
bool operator>(const Complex &c);
//
double getMol();
};
Complex::Complex(){
}
Complex::Complex(double r,double i):real(r),img(i)//
{
}
Complex& Complex::operator=(const Complex &c){
this->real=c.real;
this->img=c.img*(-1);//
return *this;
}
void Complex::disp(){
if(img>0){
cout<(const Complex &c){
return real>c.real && img>c.img;
}
int main(int argc, char* argv[])
{
Complex c1(1,-2);
Complex c2(2,3);
c1.disp();
c2.disp();
Complex cAdd=c1.operator +(c2);
cAdd.disp();
Complex cSub=c1.operator -(c2);
cSub.disp();
Complex cMul=c1.operator *(c2);
cMul.disp();
Complex cChu=c1.operator /(c2);
cChu.disp();
double mol=c1.getMol();
cout<(c2);
if(isBig==true){
cout<
しゅつりょく
1-2* i
2+3* i
:3+1* i
:-1-5* i
:8-1* i
:-0.307692-0.538462*i
:2.23607
Press any key to continue
説明クラスのコンストラクション関数を使用すると、一時オブジェクト(名前を付けない)を作成できます.無名オブジェクトが結果を返すと、実行効率が高くなります.一般的な書き方は読み取り可能です.
Complex Complex::operator+(const Complex &c){
Complex a;
a.real=real+c.real;
a.img=img+c.img;
cout<
Complex Complex::operator+(const Complex &c){
return Complex(a.rear+b.rear,a.imag+b.imag);//
}
ps:visual c++6.0はc++標準を完全に実現していない、#includeは友元関数演算子の再ロードをサポートしていない.hでいいです.
メンバー演算子のリロード関数と友元演算子のリロード関数の比較
(1)両目演算におけるメンバ~のパラメータテーブル1つのパラメータ友元2つの単目演算におけるメンバにパラメータ友元がないもの(2)整数をオブジェクトに加算する場合に友元を用いることが望ましい
たとえば、複数を整数に加算する場合は、メンバー演算子を使用して関数「+」演算子を再ロードします.
Complex operator+(int a)
{
return (real+a,imag);
}
comとcom 1がクラスComplexのオブジェクトである場合、以下の文が正しい
com = com+100; // ,
// C++ :
com = com.operator(100);
しかし、次の文は機能しません.
com = 100+com;
C++ :
com = 100.operator(com);
次の2つの友元演算子を定義して関数を再ロードする場合
friend Complex operator+(Complex com,int x)
// + ,
{
return Complex(com.real+x,com.imag);
}
friend Complex operator+(int a,Complex com)
// + ,
{
return Complex(a+com.real,com.imag);
}
説明