重載操作符與轉換(1)

 


         把學習C++primer的感受寫下來,哪怕是照着抄,也要慢慢喫透。發現瞪着兩隻眼睛看,效果就是眼球發酸,瞌睡,把筆動起來,對學習是有好處的。寫的同時,腦子也會跟着思考。不瞌睡。妙法——從效率上講還是比較快的。
  重載操作符與轉換
  通過操作符重載,能夠針對類類型的操作數定義不同的操作符版本。
  一、重載操作符的定義
  重載操作符是具有特殊名稱的函數:保留字operator後接需定義的操作符符號。重載操作符具有返回類型和形參表,如下語句:
  Sales_item operator+(const Sales_item&, const Sales_item&);
  除了函數調用操作符之外,重載操作符的形參數目(包括成員函數的隱式this指針)與操作符的操作數數目相同。函數調用操作符可以接受任意數目的操作數。
  不能重載的操作符包括“::”,“.*”,“.”,“?:”
  還有重載操作符必須具有一個類類型操作數。用於內置類型的操作符,其含義不能改變。例如,內置的整型加號操作符不能重定義。
  // error: can not redefine built-in operator for ints
  int operator+(int, int);
  也不能爲內置數據類型重定義加號操作符。
  重載操作符必須具有至少一個類類型或枚舉類型的操作數。這條規則強制重載操作符不能重新定義用於內置類型對象的操作符的含義。
  加強記憶:重載操作符必須具有一個類類型操作數。
  操作符的優先級、結合性或操作數數目不能改變,不管操作數的類型和操作符的功能定義如何。
  重載操作符並不保證操作數的求值順序,尤其是,不會保證內置邏輯AND、邏輯OR和逗號操作符的操作數求值。
  重載這些&&、||或逗號操作符不是一種好的做法。
  大多數重載操作符可以定義爲普通非成員函數或類的成員函數。
  作爲類成員的重載函數,其形參看起來比操作數數目少1。作爲成員函數的操作符有一個隱含的this形參,限定爲第一個操作數。
  重載一元操作符如果作爲成員函數就沒有顯式形參,如果作爲非成員函數就有一個形參。類似的,重載二元操作符定義爲成員時就有一個形參,定義爲非成員函數時,有兩個形參。
  操作符定義爲非成員函數時,通常必須將它們設置爲所操作類的友元。
  使用重載操作符可以隱式調用也可以顯式調用。
  調用成員操作符函數與調用其它任意函數一樣:指定運行函數的對象,然後使用點或箭頭操作符獲取希望調用的函數。
  重載操作符的設計
  1、不要重載具有內置含義的操作符。
  重載逗號、取地址、邏輯與、邏輯或等操作符通常不是好做法,這些操作符具有有用的內置含義。如果我們定義了自己的版本,就不能使用這些內置含義了。
  2、大多數操作符對類對象沒有意義。
  設計類的時候,應該確定要支持哪些操作符。
  爲類設計操作符,最好的方式是先設計類的公用接口。定義了接口之後,就可以考慮應將那些操作符定義爲重載操作符。
  3、符合賦值操作符
  如果一個類有算數操作符或位操作符,那麼提供相應的複合賦值操作符一般是一個好的做法。
  4、相等和關係操作符
  如果類定義了相等操作符,它也應該定義不等操作符。類用戶會假設如果可以進行相等比較,則也可以進行不等比較。同樣的規則也應用於其它關係操作符。
  5、選擇成員或非成員實現
  爲類設計重載操作符的時候,必須選擇是將操作符設置爲類成員還是普通非成員函數。在某些情況下,程序員沒有選擇,操作符必須是成員;在另一些情況下,有些經驗原則可指導我們做出決定。
  一些指導原則:
  (1)賦值、下標、調用和成員訪問箭頭燈操作符必須定義爲成員,將這些操作符定義爲非成員函數將在編譯時標記爲錯誤。
  (2)像賦值一樣,複合賦值操作符通常應定義爲類的成員。
  (3)改變對象狀態或與給定類型緊密聯繫的其他一些操作符,通常應定義爲類成員。
  (4)對稱的操作符,如算術操作符、相等操作符、關係操作符和位操作符,最好定義爲普通非成員函數。
  

本文轉自
http://blog.csdn.net/sandyqy/archive/2007/10/06/1813305.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章