操作符

操作符,常見於計算機語言之中,不同的指令用操作符這個欄位的不同編碼來表示,每一種編碼代表一種指令。

指令系統的每一條指令都有一個操作符,它表示該指令應進行什麼性質的操作。不同的指令用操作符這個欄位的不同編碼來表示,每一種編碼代表一種指令。組成操作符欄位的位數一般取決於計算機指令系統的規模。

C++ 中重載操作符

以下以操作符+為例說明:
用戶定義的類型,如:字元串,日期,複數,聯合體以及檔案常常重載,二元操作符以實現對象的連線,附加或合併機制。但是要正確實現操作符會給設計,實現和性能帶來一定的挑戰 。
內建的 操作符有兩個類型相同的運算元,相加並返回右值 6,然後被賦值給 x。我們可以斷定內建的是一個二元的,對稱的,可交換的操作符。它產生的結果的類型與其運算元類型相同。按照這個規測,當你為某個用戶定義類型重載操作符時,也應該遵循相應內建操作符的特徵。
下面我們就來分析內建操作符的特徵並嘗試模仿其相應的重載機制。
第一步:在成員函式和非成員函式之間選擇
你可以用類成員函式的方式實現二元操作符如:+、- 以及 ==,例如:class String {public: bool operator==(const String & s); // 比較 *this 和 s};
這個方法是有問題的。相對於其內建的操作符來說,重載的操作符在這裡不具有對稱性;它的兩個參數一個類型為:const String * const(這個參數是隱含的),另一個類型為:const String &。因此,一些 STL 算法和容器將無法正確處理這樣的對象。
另外一個可選方法是把重載操作符 + 定義為一個外部(extern)函式,該函式帶兩個類型相同的參數:
String operator + (const String & s1, const String s2);
這樣一來,類 String 必須將該重載操作符聲明為友元:
class String{public: friend String operator+(const String& s1,const String&s2);};
第二步:返回值的兩難選擇
如前所述,內建操作符 + 返回右值,其類型與運算元相同。但是在調用者堆疊里返回一個對象效率很低,處理大型對象時尤其如此。那么能不能返回一個指針或引用呢?答案是不行。因為返回指針破壞參數類型與返回值類型應該相同的規則。更糟的是,連結多個表達式將成為不可能:
String s1,s2,s3; String res;res=s1+s2+s3; // 不可能用 String* 作為返回值
雖然有一個辦法可以定義額外的 + 操作符重載版本,但這個辦法是我們不希望用的,因為返回的指針必須指向動態分配的對象。這樣的話,如果調用者釋放(delete)返回的指針失敗,那么將導致記憶體泄漏。顯然,返回 String* 不是一個好主意。
那么返回 String& 好不好呢?返回的引用必須一定要是一個有效的 String。它避免了使用動態對象分配,該方法返回的是一個本地靜態對象的引用。靜態對象確實解決了記憶體泄漏問題,但這個方法的可行性仍然值得懷疑。在一個多執行緒套用中,兩個執行緒可能會並發調用 + 操作符,因此造成 String 對象的混亂。而且,因為靜態對象總是保留其調用前的狀態,所以有必要針對每次 + 操作符的調用都清除該靜態 String 對象。由此看來,在堆疊上返回結果仍然是最安全和最簡單的解決方案。

相關詞條

相關搜尋

熱門詞條

聯絡我們