運算符重載詳解(一)

1.運算符重載的方法
運算符重載的方法是定義一個重載運算符的函數,使指定的運算符不僅能實現原有的功能,而且能實現在函數中指定的新的功能。在使用被重載的運算符時,系統就自動調用該函數,以實現相應的功能。
運算符重載實質上是函數的重載。
重載運算符的函數一般格式如下:
函數類型 operator 運算符名稱 (形參表){
對運算符的重載處理
}
如:operator +()、operator + () 、operator+ ()、operator+(),書寫方式都可以
注意:函數名是由operator和運算符組成。如 “operator +”就是函數名**斜體樣式
例子1:通過函數來實現複數相加

class Complex{
public:
	Complex(){ real = 0, imag = 0; } //定義構造函數
	Complex(double r, double i){ real = r, imag = i; }//構造函數重載
	Complex complex_add(Complex &c2);		//聲明覆數相加函數
	void display();
private:
	double real;	//實部
	double imag;	//虛部
};
Complex Complex::complex_add(Complex &c2){
	Complex c;
	c.real = real + c2.real;
	c.imag = imag + c2.imag;
	//c.real = this->real + c2.real;  //第一種
	//c.imag = this->imag + c2.imag;
	//c.real = (*this).real + c2.real; //第二種
	//c.imag = (*this).imag + c2.imag;
	return c;
}
void Complex::display()
{	cout << real << "," << imag << "i" << endl; }
int main(){
	Complex c1(3, 4), c2(5, -10), c3; 
	c3 = c1.complex_add(c2); //調用複數相加函數
	cout << c3.display();  //8,-6i
	return 0;
}

例子2:通過運算符“+”重載來實現複數相加

class Complex
{
public:
	Complex(){ real = 0, imag = 0; } //定義構造函數
	Complex(double r, double i){ real = r, imag = i; }//構造函數重載
	Complex operator +(Complex &c2);		//聲明覆數相加函數
	void display();
private:
	double real;	//實部
	double imag;	//虛部
};
Complex Complex::operator +(Complex &c2)
{
	//①
	Complex c;
	c.real = real + c2.real;
	c.imag = imag + c2.imag;
	//c.real = (*this).real + c2.real; //第一種
	//c.imag = (*this).imag + c2.imag;
	//c.real = this->real + c2.real;   //第二種
	//c.imag = this->imag + c2.imag;
	return c;
    //②
//或者用一行表示
//return Complex(real + c2.real, imag + c2.imag); //該句創建一個臨時對象,它沒有對象名,是一個無名對象。在建立臨時對象過程中調用構造函數,return語句將此臨時對象作爲函數返回值。
}
void Complex::display()
{
	cout << real << "," << imag << "i" << endl;
}
int main()
{
	Complex c1(3, 4), c2(5, -10), c3; 
	c3 = c1 + c2; //調用複數相加函數
	cout << c3.display();
	return 0;
}

注:將運算符+重載爲類的成員函數後,C++編譯系統將程序中的表達式c1 + c2 解釋爲

c1.operator +(c2); //其中c1和c2是Complex類的對象

如何操作常量和複數相加

c3 = 3 + c2; 			//是錯誤的,與形參類型不匹配
c3 = Complex(3,0) + c2; //正確,類型均爲對象

2.重載運算符規則
<1>C++不允許用戶自己定義新的運算符,只能對已有的C++運算符進行重載
<2>C++允許重載的運算符
絕大部分運算符可以重載。
不能重載的運算符只有5個:
成員訪問運算符、成員指針訪問運算符(*)、域運算符(::)、長度運算符(sizeof)、條件運算符(?:)
<3>重載不能改變運算符運算對象(即操作數)的個數。
<4>重載不能改變運算符的優先級別。
<5>重載不能改變運算符的結合性。
<6>重載運算符的函數不能有默認的參數。
<7>重載的運算符必須和用戶定義的類型的對象一起使用,其參數至少應有一個是類的對象(或類對象的引用)。
<8>用於類對象的運算符一般必須重載,但有兩個例外,運算符“=”和“&”不必用戶重載。
<9>從理論上說,可以將一個運算符重載爲執行任意的操作。如,將“>”運算符重載爲“<”運算,但這樣違背了運算符重載的初衷,非但沒有提高可讀性,反而使人無法理解程序。應當是重載運算符的功能類似於該運算符作用於標準類型時所能實現的功能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章