函數重載就是對一個已有的函數賦予新的含義實現不同功能,即一名多用
運算符也可以重載。其實計算機處理整數、單精度數、雙精度數加法的操作方法不同,由於c++對運算符“+”進行重載,使“+”適用於int,float,double類型的不同運算。
運算符重載的方法是定義一個重載運算符的函數,實質就是函數的重載。函數一般格式:
函數類型 operator 運算符名(形參表)
{對運算符的重載處理}
注意:函數名由operator和運算符組成)如,int operator + (int a,int b){return (a+b);}
#include <iostream> using namespace std; 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; return c;} void Complex∷display( ) { cout<<″(″<<real<<″,″<<imag<<″i)″<<endl;} int main( ) { Complex c1(3,4),c2(5,-10),c3; c3=c1+c2; //運算符+用於複數運算 cout<<″c1=″;c1.display( ); cout<<″c2=″;c2.display( ); cout<<″c1+c2=″;c3.display( ); return 0; }
注意點:
運算符被重載後,其原有的功能仍然保留,沒有喪失或改變
通過運算符重載,擴大了 C++已有運算符的作用範圍,使之能用於類對象。
運算符重載對 C++有重要的意義,把運算符重載和類結合起來,可以在 C++程序中定義出很有實用意義而使用方便的新的數據類型。
運算符重載使 C++具有更強大的功能、 更好的可擴充性和適應性,這是 C++最吸引人的特點之一。
(1) C++不允許用戶自己定義新的運算符,只能對已有的 C++運算符進行重載。
(2) C++允許重載的運算符
C++中絕大部分的運算符允許重載 ,不能重載的運算符只有 5 個:
. (成員訪問運算符)
.* (成員指針訪問運算符)
∷ (域運算符)
sizeof(長度運算符)
?: (條件運算符)
前兩個運算符不能重載是爲了保證訪問成員的功能不能被改變,域運算符和sizeof 運算符的運算對象是類型而不是變量或一般表達式,不具重載的特徵。
(3) 重載不能改變運算符運算對象(即操作數)的個數。
(4) 重載不能改變運算符的優先級別。
(5) 重載不能改變運算符的結合性。
(6) 重載運算符的函數不能有默認的參數,否則就改變了運算符參數的個數,與前面第(3)點矛盾。
(7) 重載的運算符必須和用戶定義的自定義類型的對象一起使用,其參數至少應有一個是類對象(或類對象的引用)。 也就是說,參數不能全部是 C++的標準類型,以防止用戶修改用於標準類型數據的運算符的性質。
(8) 用於類對象的運算符一般必須重載,但有兩個例外,運算符“=”和“&”不必用戶重載。
① 賦值運算符(=)可以用於每一個類對象,可以利用它在同類對象之間相互賦值。
② 地址運算符&也不必重載,它能返回類對象在內存中的起始地址。
(9) 應當使重載運算符的功能類似於該運算符作用於標準類型數據時所實現的功能。
(10) 運算符重載函數可以是類的成員函數,也可以是類的友元函數,還可以是既非類的成員函數也不是友元函數的普通函數。
例如,將上面重載函數不作爲成員函數,而放在類外,作爲 Complex 類的友元函數
#include <iostream> using namespace std; class Complex {public: Complex( ){real=0;imag=0;} Complex(double r,double i){real=r;imag=i;} friend Complex operator + (Complex &c1,Complex &c2);//重載函數作爲友 元函數 void display( ); private: double real; double imag; }; Complex operator + (Complex &c1,Complex &c2) //定義作爲友元函數的重載函數 {return Complex(c1.real+c2.real, c1.imag+c2.imag);} void Complex∷display( ) {cout<<″(″<<real<<″,″<<imag<<″i)″<<endl;} int main( ) {Complex c1(3,4),c2(5,-10),c3; c3=c1+c2; cout<<″c1=″; c1.display( ); cout<<″c2=″; c2.display( ); cout<<″c1+c2 =″; c3.display( ); }
解決運算符重載後使用交換律:
//轉換構造函數:(將一個其他類型(肯定包括類類型了)的數據轉換成一個類的對象p.332)
轉換構造函數只能有一個參數,Complex(double r){real=r;imag=0;}
現在可以Complex c=c1+(Complex)2.3
//類型轉換函數:同上反,將一個類的對象轉換成另一個類型的數據)
在函數名前不能指定函數類型,沒有參數:operator double(){return real;}
現在可以double d=2.3+c1;
一個包含轉換構造函數,類型轉換函數,重載運算符+ 的友元函數的例子
#include <iostream> using namespace std; class Complex {public: Complex(){real=0;imag=0;} Complex(double r){real=r;imag=0;} //轉換構造函數 Complex(double r,double i){real=r;imag=i;} operator double(){return real;} //類型轉換函數 friend Complex operator+(Complex c1,Complex c2);//重載運算符+ 的友元函數 void display(); private: double real; double imag; }; Complex operator +(Complex c1,Complex c2) { return Complex(c1.real+c2.real,c1.imag+c2.imag);} void Complex::display() {cout<<"("<<real<<", "<<imag<<")"<<endl;} int main() {Complex c1(3,4),c2; double d1; d1=2.5+c1; cout<<"d1="<<d1<<endl; c2=Complex(d1); cout<<"c2="; c2.display(); return 0; }