C++運算符重載規矩詳解。本站提示廣大學習愛好者:(C++運算符重載規矩詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是C++運算符重載規矩詳解正文
C++許可重載的運算符和不許可重載的運算符
C++中絕年夜部門的運算符許可重載,詳細劃定見表
不克不及重載的運算符只要5個:
. (成員拜訪運算符)
.* (成員指針拜訪運算符)
:: (域運算符)
sizeof (長度運算符)
?: (前提運算符)
前兩個運算符不克不及重載是為了包管拜訪成員的功效不克不及被轉變,域運算符和sizeof 運算符的運算對象是類型而不是變量或普通表達式,不具有重載的特點。
C++運算符重載的規矩
C++對運算符重載界說了以下幾條規矩。
1) C++不許可用戶本身界說新的運算符,只能對已有的C++運算符停止重載。 例如,有人認為BASIC頂用“**“作為冪運算符很便利,也想在C++中將”**“界說為冪運算符,用”3**5“表現35,如許是不可的。
2) 重載不克不及轉變運算符運算對象(即搡作數)的個數。如關系運算符“>”和“ <” 等是雙目運算符,重載後仍為雙目運算符,須要兩個參數。運算符“ +”,“-”,“*”,“&”等既可以作為單目運算符,也能夠作為雙目運算符,可以分離將它們重載為單目運算符或雙目運算符。
3) 重載不克不及轉變運算符的優先級別。例如“*”和“/”優先於“ +”和“-”,豈論如何停止重載,各運算符之間的優先級別不會轉變。有時在法式中願望轉變某運算符的優先級,也只能應用加圓括號的方法強迫轉變重載運算符的運算次序。
4) 重載不克不及轉變運算符的結含性。如賦值運算符是右聯合性(自右至左),重載後仍為右聯合性。
5) 重載運算符的函數不克不及有默許的參數,不然就轉變了運算符參數的個數,與後面第(2)點抵觸。
6) 重載的運算符必需和用戶界說的自界說類型的對象一路應用,其參數至多應有一個是類對象(或類對象的援用)。也就是說,參數不克不及全體是C++的尺度類型,以避免用戶修正用於尺度類型數據的運算符的性質,以下面如許是纰謬的:
int operator + (int a,int b) { retum(a-b); }
本來運算符+的感化是對兩個數相加,如今妄圖經由過程重載使它的感化改成兩個數相減。 假如許可如許重載的話,假如有表達式4+3,它的成果是7呢照樣1?明顯,這是相對制止的。
假如有兩個參數,這兩個參數可以都是類對象,也能夠一個是類對象,一個是C ++尺度類型的數據,如
Complex operator + (int a,Complex&c) { return Complex(a +c.real, c.imag); }
它的感化是使一個整數和一個單數相加。
7) 用於類對象的運算符普通必需重載,但有兩個破例,運算符“=”和“&”不用重載。
①賦值運算符( = )可以用於每個類對象,可以應用它在同類對象之間互相賦值。 我們曉得,可以用賦值運算符對類的對象賦值,這是由於體系已為每個新聲明的類重載了一個賦值運算符,它的感化是逐一復制類的數據成員。用戶可以以為它是體系供給的默許的對象賦值運算符,可以直接用於對象間的賦值,不用本身停止重載。然則有時體系供給的默許的對象賦值運算符不克不及知足法式的請求,例如,數據成員中包括指向靜態分派內存的指針成員時,在復制此成員時便可能湧現風險。在這類情形下, 就須要本身重載賦值運算符。
②地址運算符&也不用重載,它能前往類對象在內存中的肇端地址。
8) 從實際上說,可以將一個運算符重載為履行隨意率性的操作,如可以將加法運算符重載為輸入對象中的信息,將“>”運算符重載為“小於”運算。但如許違反了運算符重載的初志,不但沒有提髙可讀性,反而令人莫明其妙,沒法懂得法式。應該使重載運算符的功效相似於該運算符感化於尺度類型數據時所完成的功效(如用“+”完成加法,用“>”完成“年夜於”的關系運算)。
9) 運算符重載函數可所以類的成員函數,也能夠是類的友元函數,還可所以既非類的成員函數也不是友元函敝的通俗函數。
以上這些規矩是很輕易懂得的,不用逝世記。把它們集中在一路引見,只是為了使讀者有一個全體的概念,也便於查閱。