2.c++-過載運算子operator
運算子過載注意點:
1.算術和關係操作符返回的是一個左值或右值,而不是一個引用
2.賦值操作符一定要定義為成員函式如“=”
3.一般而言,賦值操作符和複合賦值操作符應返回左運算元的引用如"="和''+="
C++不允許賦值運算子被過載為全域性形式,這是因為如果可以寫出全域性形式的賦值運算子函式的話,我們可以寫出這樣的函式:
int operator=(int a, integer b);
從而出現這樣的語句:
integer a(3);
2 = a;
現在我們寫一個簡單的integer類並重載賦值運算子:
因為在自賦值的情況下可能給物件造成傷害,所以在過載賦值運算子時必須要注意自賦值的情況
所以integer類中的賦值運算子函式應寫成這樣:
integer& integer::operator=(const integer& a)
{
if(this != &a)
i = a.i;
return *this;
};
1、 運算子過載的概念
運算子過載是C++的重要組成部分,它可以讓程式更加簡單易懂,簡單的運算子可以使複雜函式的理解更直觀。對於普通物件來說可以使用算術運算子讓它們參與計算,C++也允許為類的物件構造運算子來實現單目或雙目運輸,這個特性就叫運算子的過載。其實,任何使用運算子完成的功能,使用普通的函式也能夠完成。運算子的過載主要存在兩種形式,一種是作為類的友元函式進行使用,另一種則是作為類的成員函式進行使用。運算子的過載的形式為:
2、 運算子的運算規則
返回型別 operator 運算子符號(引數說明)
{ //函式體的內部實現
}
①運算子過載函式也是函式,過載的運算子不會改變運算子的優先順序、結合型和引數的個數。
②過載運算子不能違反語言的語法規則。
③賦值運算子除外,過載運算子可由派生類繼承下去。
④過載運算子不能使用預設引數。
⑤運算子=、()、[]和->可作為類成員運算子,不能作為友元運算子。
⑥運算子“.”、“::”、“?:”不能過載。
⑦友元運算子的引數規則與類成員運算子的引數規則不同,一員運算子必須顯示地宣告一個引數,二員運算子必須顯示地宣告兩個引數。類成員運算子過載時,引數中隱含了一個
3、 例項程式碼
1)友員
#include <iostream>
using std::cout;
using std::endl;
class Complex
{
public:
//Attribute
int x;
int y;
//Operator
void SetX(int a){x=a;}
void SetY(int b){y=b;}
friend Complex operator +(Complex &, Complex &);
friend Complex operator -(Complex &, Complex &);
friend Complex operator *(Complex &, Complex &);
friend Complex operator /(Complex &, Complex &);
friend Complex operator ++(Complex &);//前置方式
friend Complex operator ++(Complex &, int);//後置方式
};
// "+"過載運算子
Complex operator +(Complex& temp1,Complex& temp2 )
{
Complex ret;
ret.x=temp1.x+temp2.x;
ret.y=temp1.y+temp2.y;
return ret;
}
// "-"過載運算子
Complex operator -(Complex& temp1,Complex& temp2 )
{
Complex ret;
ret.x=temp1.x-temp2.x;
ret.y=temp1.y-temp2.y;
return ret;
}
// "*"過載運算子
Complex operator *(Complex& temp1,Complex& temp2 )
{
Complex ret;
ret.x=temp1.x*temp2.x;
ret.y=temp1.y*temp2.y;
return ret;
}
// "/"過載運算子
Complex operator /(Complex& temp1,Complex& temp2 )
{
Complex ret;
ret.x=temp1.x/temp2.x;
ret.y=temp1.y/temp2.y;
return ret;
}
// "++"前置運算子
Complex operator ++(Complex& temp1)
{
temp1.x=temp1.x+1;
temp1.y=temp1.y+1;
return temp1;
}
// "++"後置運算子
Complex operator ++(Complex& temp1,int)
{
temp1.x=temp1.x++;
temp1.y=temp1.y++;
return temp1;
}
//主函式()
int main()
{
Complex Complex1;
Complex Complex2;
Complex Ret;
Complex1.SetX(30);
Complex1.SetY(40);
Complex2.SetX(10);
Complex2.SetY(20);
cout<<"過載加法運算"<<endl;
Ret=Complex1+Complex2;
cout<<"Ret.x="<<Ret.x<<endl;
cout<<"Ret.y="<<Ret.y<<endl;
cout<<"過載減法運算"<<endl;
Ret=Complex1-Complex2;
cout<<"Ret.x="<<Ret.x<<endl;
cout<<"Ret.y="<<Ret.y<<endl;
cout<<"過載乘法運算"<<endl;
Ret=Complex1*Complex2;
cout<<"Ret.x="<<Ret.x<<endl;
cout<<"Ret.y="<<Ret.y<<endl;
cout<<"過載除法運算"<<endl;
Ret=Complex1/Complex2;
cout<<"Ret.x="<<Ret.x<<endl;
cout<<"Ret.y="<<Ret.y<<endl;
cout<<"前置++運算"<<endl;
Ret=++Complex1;
cout<<"Ret.x="<<Ret.x<<endl;
cout<<"Ret.y="<<Ret.y<<endl;
cout<<"後置++運算"<<endl;
Ret=Complex1++;
cout<<"Ret.x="<<Ret.x<<endl;
cout<<"Ret.y="<<Ret.y<<endl;
return 0;
}
2)非友員,相對於友員少了一個類物件引數
#include <iostream>
using std::cout;
using std::endl;
class Complex
{
public:
//Attribute
int x;
int y;
//Operator
void SetX(int a){x=a;}
void SetY(int b){y=b;}
//成員函式
Complex operator +(Complex &);
Complex operator -(Complex &);
Complex operator *(Complex &);
Complex operator /(Complex &);
Complex& operator ++();//前置方式
Complex& operator ++(int);//後置方式
};
// "+"過載運算子
Complex Complex::operator +(Complex& temp1)
{
Complex ret;
ret.x=x+temp1.x;
ret.y=y+temp1.y;
return ret;
}
// "-"過載運算子
Complex Complex::operator -(Complex& temp1)
{
Complex ret;
ret.x=x-temp1.x;
ret.y=y-temp1.y;
return ret;
}
// "*"過載運算子
Complex Complex::operator *(Complex& temp1)
{
Complex ret;
ret.x=x*temp1.x;
ret.y=y*temp1.y;
return ret;
}
// "/"過載運算子
Complex Complex::operator /(Complex& temp1)
{
Complex ret;
ret.x=x/temp1.x;
ret.y=y/temp1.y;
return ret;
}
// "++"前置運算子
Complex& Complex::operator ++()
{
x=x+1;
y=y+1;
return *this;
}
// "++"後置運算子
Complex& Complex::operator ++(int)
{
x=x++;
y=y++;
return *this;
}
//主函式()
int main()
{
Complex Complex1;
Complex Complex2;
Complex Ret;
Complex1.SetX(30);
Complex1.SetY(40);
Complex2.SetX(10);
Complex2.SetY(20);
cout<<"過載加法運算"<<endl;
Ret=Complex1+Complex2;
cout<<"Ret.x="<<Ret.x<<endl;
cout<<"Ret.y="<<Ret.y<<endl;
cout<<"過載減法運算"<<endl;
Ret=Complex1-Complex2;
cout<<"Ret.x="<<Ret.x<<endl;
cout<<"Ret.y="<<Ret.y<<endl;
cout<<"過載乘法運算"<<endl;
Ret=Complex1*Complex2;
cout<<"Ret.x="<<Ret.x<<endl;
cout<<"Ret.y="<<Ret.y<<endl;
cout<<"過載除法運算"<<endl;
Ret=Complex1/Complex2;
cout<<"Ret.x="<<Ret.x<<endl;
cout<<"Ret.y="<<Ret.y<<endl;
cout<<"前置++運算"<<endl;
Ret=++Complex1;
cout<<"Ret.x="<<Ret.x<<endl;
cout<<"Ret.y="<<Ret.y<<endl;
cout<<"後置++運算"<<endl;
Ret=Complex2++;
cout<<"Ret.x="<<Ret.x<<endl;
cout<<"Ret.y="<<Ret.y<<endl;
return 0;
}
輸出結果如下圖所示: