1. 程式人生 > >2.c++-過載運算子operator

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 運算子符號(引數說明)
{     //函式體的內部實現

}

 ①運算子過載函式也是函式,過載的運算子不會改變運算子的優先順序、結合型和引數的個數。

 ②過載運算子不能違反語言的語法規則。

 ③賦值運算子除外,過載運算子可由派生類繼承下去。

 ④過載運算子不能使用預設引數。

 ⑤運算子=()[]->可作為類成員運算子,不能作為友元運算子。

 ⑥運算子“.”、“::”、“?:”不能過載。

 ⑦友元運算子的引數規則與類成員運算子的引數規則不同,一員運算子必須顯示地宣告一個引數,二員運算子必須顯示地宣告兩個引數。類成員運算子過載時,引數中隱含了一個

this指標。

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;
}

輸出結果如下圖所示: