c++メンバー演算子のリロードと友元演算子のリロードの比較(+,--演算子を例に)
8778 ワード
1、両目演算子の場合、メンバー演算子のリロード関数パラメータリストには1つのパラメータが含まれ、友元演算子のリロード関数パラメータリストには2つのパラメータが含まれている.単一演算子の場合、メンバー演算子のリロード関数パラメータリストにはパラメータがありませんが、友元演算子のリロード関数パラメータリストにはパラメータが含まれます.2、両目演算子のクラスは、友元演算子とメンバー関数演算子として再ロードできますが、整数を複数に加算する場合は、友元関数を使用する必要があります.例:友元演算子のリロード関数は1つの複素数と1つの整数の加算を実現する
結果:real=39 imag=34 real=24 imag=34メンバー関数演算子がある場合、整数がクラスのオブジェクトcom 2=com 1+27でない場合、com 2=com 1にコンパイルされる.Operator(100)com 2=12+com 1は、com 2=100にコンパイル.operator(com 1)、エラー、100はメンバー演算子のリロード関数を呼び出すことができません.したがって、整数を複数に加算する場合は、友元演算子を使用して関数を再ロードするしかありません.
演算子関数呼び出し形式友元メンバー関数a+b operator+(a,b)a.operator+(b)-a operator-(a)a.operator-()a++operator++(a,0)a.operator++(0)-a operator-(a)a.operator-();
メンバー関数を使用して、演算子を接頭辞と接尾辞で再ロードします.
結果:x=4 y=5 z=6 x=3 y=4 z=5 x=3 y=4 z=5 x=2 y=3 z=4
x=7 y=8 z=9 x=6 y=7 z=8 x=6 y=7 z=8 x=5 y=6 z=7
接尾辞の自己増分演算子を再ロードすると、接頭辞++演算子の再ロード関数と区別するためにint型パラメータが1つ増え、定義時にintのみを書くことができます.
友元関数を使用して、演算子++を接頭辞と接尾辞で再ロード
結果:x=4 y=5 z=6 x=5 y=6 z=7 x=6 y=7 z=8
x=7 y=8 z=9 x=8 y=9 z=10 x=9 y=10 z=11
友元演算子のリロード関数にはthisポインタがないため、thisポインタで指すオブジェクトは使用できません.オブジェクト参照パラメータでデータを渡す必要があります.
#include
using namespace std;
class complex
{
public:
complex(int r=0,int i=0);
friend complex operator+(complex com,int a)// ,+ ,
{
return complex(com.real+a,com.imag);
}
friend complex operator+(int a,complex com)// ,+ ,
{
return complex(a+com.real,com.imag);
}
void show();
private:
int real,imag;
};
void complex::show()
{
cout<<"real="<" imag="<complex::complex(int r,int i)
{
real=r;
imag=i;
}
int main()
{
complex com1(12,34),com2,com3;
com2=com1+27;
com2.show();
com3=12+com1;
com3.show();
return 0;
}
結果:real=39 imag=34 real=24 imag=34メンバー関数演算子がある場合、整数がクラスのオブジェクトcom 2=com 1+27でない場合、com 2=com 1にコンパイルされる.Operator(100)com 2=12+com 1は、com 2=100にコンパイル.operator(com 1)、エラー、100はメンバー演算子のリロード関数を呼び出すことができません.したがって、整数を複数に加算する場合は、友元演算子を使用して関数を再ロードするしかありません.
演算子関数呼び出し形式友元メンバー関数a+b operator+(a,b)a.operator+(b)-a operator-(a)a.operator-()a++operator++(a,0)a.operator++(0)-a operator-(a)a.operator-();
メンバー関数を使用して、演算子を接頭辞と接尾辞で再ロードします.
#include
using namespace std;
class three
{
public:
three(int a=0,int b=0,int c=0);
void print();
three operator--();// -- ( )
three operator--(int);// -- ( )
private:
int x,y,z;
};
three::three(int a,int b,int c)
{
x=a;
y=b;
z=c;
}
void three::print()
{
cout<<"x="<" y="<" z="<operator--()
{
--x;
--y;
--z;
return *this;//
}
three three::operator--(int)
{
three temp(*this);
x--;
y--;
z--;
return temp;
}
int main()
{
three obj1(4,5,6),obj2,obj3(7,8,9),obj4;
obj1.print();
--obj1;
obj1.print();
obj2=obj1--;//obj2 obj1-- obj1
obj2.print();
obj1.print();
cout<operator--();
obj3.print();
obj4=obj3.operator--(0);
obj4.print();
obj3.print();
return 0;
}
結果:x=4 y=5 z=6 x=3 y=4 z=5 x=3 y=4 z=5 x=2 y=3 z=4
x=7 y=8 z=9 x=6 y=7 z=8 x=6 y=7 z=8 x=5 y=6 z=7
接尾辞の自己増分演算子を再ロードすると、接頭辞++演算子の再ロード関数と区別するためにint型パラメータが1つ増え、定義時にintのみを書くことができます.
友元関数を使用して、演算子++を接頭辞と接尾辞で再ロード
#include
using namespace std;
class three
{
public:
three(int a=0,int b=0,int c=0);
void print();
friend three operator++(three &op);// ++ ( )
friend three operator++(three &op,int);// ++ ( )
private:
int x,y,z;
};
three::three(int a,int b,int c)
{
x=a;
y=b;
z=c;
}
void three::print()
{
cout<<"x="<" y="<" z="<operator++(three &op)
{
++op.x;
++op.y;
++op.z;
return op;
}
three operator++(three &op,int)
{
op.x++;
op.y++;
op.z++;
return op;
}
int main()
{
three obj1(4,5,6),obj2(7,8,9);
obj1.print();
++obj1;
obj1.print();
obj1++;
obj1.print();
cout<operator++(obj2);//
obj2.print();
operator++(obj2,0);
obj2.print();
return 0;
}
結果:x=4 y=5 z=6 x=5 y=6 z=7 x=6 y=7 z=8
x=7 y=8 z=9 x=8 y=9 z=10 x=9 y=10 z=11
友元演算子のリロード関数にはthisポインタがないため、thisポインタで指すオブジェクトは使用できません.オブジェクト参照パラメータでデータを渡す必要があります.