在c++中我們可以使用
int a=10;
int b=20;
int c=a+b;
我們知道int型別相加即為將變數中的值相加,a+b=30;
這是由於編譯器編譯系統在內部過載了內建型別的加法運算,這種過載的實質是函式過載,即int operator+(int,int)但是編譯系統只能對內建的型別進行函式過載。
那麼如果變數的型別是類型別呢?
如:
#includeusing namespace std;
class cint
private:
int ma;
};int main()
在上面的**中,我們也要想實現類似int型別的相加,將物件a和物件b的成員變數相加。
編譯器的過載只能對系統定義的基本資料型別起作用,對使用者自己定義的資料型別無法提供相應的運算子過載形式。
這就必須我們手動實現這個函式,相當於對'+'號進行了重定義,實現cint物件之間的相加。
運算子過載的方式就是定義乙個函式,在函式體內實現想要的功能,當用到該運算子時,編譯器就會自動呼叫這個函式。也就是說,運算子過載就是通過函式定義實現的,它本質上是函式過載。
運算子過載規則
1. 不可以過載的運算子
長度運算子(sizeof)、條件運算子(: ?)、成員選擇符(.)、物件選擇符(.*)、域解析符(::)、建構函式的成員初始化器(:)不能被過載
1. 不可以過載的運算子
.* :: ?: sizeof
2.過載運算子的限制
不改變運算子的優先順序
不改變運算子的結合性
不改變運算子所需要的運算元
不能建立新的運算子
3.運算子過載的語法形式
運算子函式定義的一般格式如下:
《返回型別說明符》 operator 《過載的運算子符號》(《參數列》)
運算子過載為成員函式
我們實現cint類的'+' 運算子過載函式
cint operator+(const cint rhs)
在上面的函式我們可以看出'+'需要兩個運算元,但是由於類的成員函式中預設的this指標,系統預設將左運算元作為預設引數傳遞給this指標,所以我們只需要在形參列表中將右運算元傳入。
我們知道在c語言中有前置++和後置++,按照運算子過載函式的定義都為 operator++();
為了區別這個函式是前置++還是後置++,我們在後置++的形參列表中新增乙個整型引數加以區別,並無其他含義
前置++運算子過載函式
const cint operator++(int)
後置++運算子過載函式
cint& operator++()
在上面我們知道系統預設將雙目運算子的左運算元傳遞給this指標,那麼在過載運算子時
例如:
cint arr = ;
int len = sizeof(arr) / sizeof(arr[0]);
for (cint i = 0;i < len; i++)
我們知道在arr[i]這個關係中,arr是左運算元,i是右運算元,按照規則我們將arr傳遞給this指標,可是arr並不是乙個物件,
這個**就會出現問題。
為了實現運算子的過載,我們在過載是將右運算元傳遞給this指標,而將左運算元通過形參帶入
因為arr[i]=*(arr+i)=*(i+arr)=i[arr]
例如:
int& operator(int* arr)
當然我們也可以過載int
例如:
operator int()
該函式的返回值型別就是函式名,所以不用顯式地表示出。
什麼叫返回型別就是函式名?
返回型別是int,函式名也是int,就是說不寫成 int operator int() ,
返回型別被省去了。
operator int() 是型別轉換運算子,目的是把cint型別的物件轉換成int型別
在呼叫arr[i]時會呼叫arr[i.operatoe int()],此時i就已經轉換成int型別,arr[i]也就可以編譯通過
運算子過載為友員函式
友元函式宣告 friend +函式原型
友員是單向的
例如:函式a是cint類的友元函式,函式a中可以訪問cint類中的私有成員變數,但cint類不能訪問函式a中的變數。
不存在傳遞關係
例如:函式a是cint類的友元函式,cint類又是cdouble類的友員,但函式a與cdouble類之間不存在友員關係。
例如:int a;
cin>>a;
cout《如果a的型別是cint型別呢?
那我們必須過載'>>','<<'運算子
《運算子的過載函式
ostream& operator<<(ostream& out, const cint& rhs)
《運算子的過載函式
istream& operator>>(istream& in, cint& rhs)
說明幾點:
1.第乙個形參為對ostream、istream物件的引用,在該物件上將產生輸出,輸入,ostream為非const,因為寫入到流會改變流的狀態;該形參是乙個引用,因為不能複製ostream、istream物件(在c++中定義的標準輸入輸出流類istream和ostream,其中拷貝建構函式和賦值操作符函式都被放置在了private部分,且只有宣告,沒有定義)。
2.第二個形參一般應是對要輸出的類型別的引用,該形參是乙個引用以避免複製實參,減少一次拷貝。
3.返回型別是乙個ostream、istream引用,它的值通常是輸出操作符所操作的ostream、istream物件,首先因為ostream、istream物件不能複製,所以必須是引用;其次引用可以少一次拷貝,提高效率;最後,為了體現連續性,實現連續輸出,達到用多個輸出、輸入操作符操作乙個ostream、istream物件的效果,如果不是引用,程式返回的時候就會生成新的臨時物件,也就是說,連續的兩個《操作符實際上是針對不同物件的,這就好比cout<>a>>b 與cin>>a; cin>>b;的區別。
運算子過載之過載型別運算子
普通型別 類型別 呼叫對應的只有乙個引數 引數的型別就是這個普通型別 的建構函式 需求 boy boy1 10000 薪資 建構函式boy int boy boy2 rock 姓名 建構函式boy char 普通型別賦值給類型別其實很簡單,就是專門的對這個賦值的型別定義乙個建構函式。編譯器在執行 的...
運算子過載 賦值運算子的過載
有時候希望賦值運算子兩邊的型別可以不匹配,比如,把乙個int型別變數賦值給乙個complex物件,或把乙個 char 型別的字串賦值給乙個字串物件,此時就需要過載賦值運算子 注意 賦值運算子 只能過載為成員函式 賦值運算子過載例項示例 include include using namespace ...
運算子過載
c 中的運算子 1。大多數系統預定義運算子都能過載 不值得過載 不能被過載 2過載不能改變優先順序 不能改變結合性 不能改變運算子所需運算元的個數 過載後,可按這些運算子的表達方式使用 運算子過載的語法 一 通過運算子過載函式進行過載 1。運算子過載函式是成員函式 語法形式 type x opera...