5.運算符重載
5.1 在類外定義的運算符重載函數
C++為運算符重載提供了一種方法,即在運行運算符重載時,必須定義一個運算符重載函數,
其名字為operator,后隨一個要重載的運算符。例如,要重載"+"號,應該寫一個名字為operator
的函數,其他的運算符也是如此。
函數 功能
operator+ 加法
operator- 減法
operator* 乘法
operator< 小於
因此,若要兩個對象相加,需要先定義一個運算符重載函數operator+,例如:
class Complex{ public: double real,imag; Complex(double r=0;doubble i=0) { real = r; imag = i; } }; Complex operator+(Complex om1,Complex om2) { Complex temp; temp.real = om1.real+om2.real; temp.imag = om1.imag+om2.imag; return temp; }
這樣,就可以方便使用語句:
int main() { Complex com1(1.1,2.2),com2(3.3,4.4),total; //total = com1+com2; //total = operator+(com1,com2); return 0; } //上述兩個注釋語句是等價的,顯然前者更簡單明了。
//例5.1 兩個Complex類對象相加的完整程序
#include<iostream> using namespace std; class Complex{ public: double real,imag; Complex(double r=0,double i=0) { real = r; imag = i; } }; Complex operator+(Complex om1,Complex om2) //定義運算符+的重載函數 { Complex temp; temp.real = om1.real+om2.real; temp.imag = om1.imag+om2.imag; return temp; } int main(int argc, char** agrv) { Complex com1(1.1,2.2),com2(3.3,4.4),total1,total2; total1 = com1+com2; //調用運算符重載函數operator的第一種方式 cout<<"total1.real="<<total1.real<<","<<"total1.imag="<<total1.imag<<endl; total2 = operator+(com1,com2); //調用運算符重載函數operator的第二種方式 cout<<"total2.real="<<total2.real<<","<<"total2.imag="<<total2.imag<<endl; return 0; }
C++對運算符重載指定如下一些規則:
(1)不允許重載的運算符有:
.(成員訪問運算符) .*(成員指針訪問運算符) ::(作用域符) Sizeof(長度運算符) ?:(條件運算符)
(2)不允許用戶定義新的運算符作為重載運算符
(3)重載的功能應當與原有的功能相類似(+就是實現加法,-就是實現減法)
(4)重載不能改變運算符的操作對象(即操作數)。例如,"+"就是一個雙目運算符(即只能代兩個操作數),重載后仍為雙目運算符,需要兩個參數。
(5)重載不能改變運算符原有的優先級。但是可以采用加"()"的辦法進行強制轉換。
(6)重載不能改變運算符原有的結合特性.例如,乘除法運算符都是從左往右結合的.必要時,可以采用加"()"的辦法
(7)運算符重載函數的參數至少應有一個是類對象(或類對象的引用)。也就是說,運算符重載函數的參數不能全是C++的標准型(基本數據類型)。目的是:防止用戶修改標准類型數據的運算符性質。
(8)運算符重載函數可以是普通函數,也可以是類的成員函數,還可以是類的友元函數。
(9)一般而言,用於類對象的運算符必須重載,但是賦值運算符"="除外,不必用戶進行重載,系統已經為每一個新聲明的類重載了一個賦值運算符函數,它的作是逐個復制類的數據成員,可以直接用於對象之間的賦值,用戶不必自己編寫運算符重載函數。
