• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            woaidongmao

            文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
            隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
            數據加載中……

            C++的運算符重載之形式

            C++中預定義的運算符的操作對象只能是基本數據類型。但實際上,對于許多用戶自定義類型(例如類),也需要類似的運算操作。這時就必須在C++中重新定義這些運算符,賦予已有運算符新的功能,使它能夠用于特定類型執行特定的操作。運算符重載的實質是函數重載,它提供了C++的可擴展性,也是C++最吸引人的特性之一。

            運算符重載是通過創建運算符函數實現的,運算符函數定義了重載的運算符將要進行的操作。運算符函數的定義與其他函數的定義類似,惟一的區別是運算符函數的函數名是由關鍵字operator和其后要重載的運算符符號構成的。運算符函數定義的一般格式如下:

                <返回類型說明符> operator <運算符符號>(<參數表>)

                {

                 <函數體>

                }

                運算符重載時要遵循以下規則:

            (1) 除了類屬關系運算符"."、成員指針運算符".*"、作用域運算符"::"sizeof運算符和三目運算符"?:"以外,C++中的所有運算符都可以重載。

            (2) 重載運算符限制在C++語言中已有的運算符范圍內的允許重載的運算符之中,不能創建新的運算符。

            (3) 運算符重載實質上是函數重載,因此編譯程序對運算符重載的選擇,遵循函數重載的選擇原則。

            (4) 重載之后的運算符不能改變運算符的優先級和結合性,也不能改變運算符操作數的個數及語法結構。

            (5) 運算符重載不能改變該運算符用于內部類型對象的含義。它只能和用戶自定義類型的對象一起使用,或者用于用戶自定義類型的對象和內部類型的對象混合使用時。

            (6) 運算符重載是針對新類型數據的實際需要對原有運算符進行的適當的改造,重載的功能應當與原有功能相類似,避免沒有目的地使用重載運算符。

            運算符函數重載一般有兩種形式:重載為類的成員函數和重載為類的非成員函數。非成員函數通常是友元。(可以把一個運算符作為一個非成員、非友元函數重載。但是,這樣的運算符函數訪問類的私有和保護成員時,必須使用類的公有接口中提供的設置數據和讀取數據的函數,調用這些函數時會降低性能。可以內聯這些函數以提高性能。)  

            成員函數運算符

            運算符重載為類的成員函數的一般格式為:

                <函數類型> operator <運算符>(<參數表>)

                {

                 <函數體>

                }

            當運算符重載為類的成員函數時,函數的參數個數比原來的操作數要少一個(后置單目運算符除外),這是因為成員函數用this指針隱式地訪問了類的一個對象,它充當了運算符函數最左邊的操作數。因此:

            (1) 雙目運算符重載為類的成員函數時,函數只顯式說明一個參數,該形參是運算符的右操作數。

            (2) 前置單目運算符重載為類的成員函數時,不需要顯式說明參數,即函數沒有形參。

            (3) 后置單目運算符重載為類的成員函數時,函數要帶有一個整型形參。

                調用成員函數運算符的格式如下:

                <對象名>.operator <運算符>(<參數>)

                它等價于

                <對象名><運算符><參數>

                例如:a+b等價于a.operator +(b)。一般情況下,我們采用運算符的習慣表達方式。

            友元函數運算符

            運算符重載為類的友元函數的一般格式為:

                friend <函數類型> operator <運算符>(<參數表>)

                {

                 <函數體>

                }

            當運算符重載為類的友元函數時,由于沒有隱含的this指針,因此操作數的個數沒有變化,所有的操作數都必須通過函數的形參進行傳遞,函數的參數與操作數自左至右一一對應。

            調用友元函數運算符的格式如下:

                operator <運算符>(<參數1>,<參數2>)

                它等價于

                <參數1><運算符><參數2>

                例如:a+b等價于operator +(a,b)

            兩種重載形式的比較

            在多數情況下,將運算符重載為類的成員函數和類的友元函數都是可以的。但成員函數運算符與友元函數運算符也具有各自的一些特點:

            (1) 一般情況下,單目運算符最好重載為類的成員函數;雙目運算符則最好重載為類的友元函數。

            (2) 以下一些雙目運算符不能重載為類的友元函數:=()[]->

            (3) 類型轉換函數只能定義為一個類的成員函數而不能定義為類的友元函數。

            (4) 若一個運算符的操作需要修改對象的狀態,選擇重載為成員函數較好。

            (5) 若運算符所需的操作數(尤其是第一個操作數)希望有隱式類型轉換,則只能選用友元函數。

            (6) 當運算符函數是一個成員函數時,最左邊的操作數(或者只有最左邊的操作數)必須是運算符類的一個類對象(或者是對該類對象的引用)。如果左邊的操作數必須是一個不同類的對象,或者是一個內部類型的對象,該運算符函數必須作為一個友元函數來實現。

            (7) 當需要重載運算符具有可交換性時,選擇重載為友元函數。

             

            posted on 2008-09-22 12:42 肥仔 閱讀(1037) 評論(0)  編輯 收藏 引用 所屬分類: C++ 基礎

            久久亚洲电影| 久久99精品九九九久久婷婷 | 日本加勒比久久精品| 久久国产高清一区二区三区| 久久人妻少妇嫩草AV蜜桃| 久久久无码精品亚洲日韩蜜臀浪潮 | 亚洲日本va中文字幕久久| 欧美伊香蕉久久综合类网站| 精品久久久久久无码国产| 亚洲第一极品精品无码久久| 久久香蕉一级毛片| 亚洲精品乱码久久久久久| 久久91这里精品国产2020| 伊人久久大香线蕉综合影院首页| 欧美亚洲另类久久综合| 日本五月天婷久久网站| 久久se精品一区精品二区国产 | 成人a毛片久久免费播放| 久久久久亚洲精品日久生情| 日本加勒比久久精品| 97久久精品人人做人人爽| 精品久久久久久无码专区| 狠狠色丁香久久婷婷综合蜜芽五月 | 久久国产高清字幕中文| 久久久精品人妻一区二区三区蜜桃| 久久国产精品无码网站| 久久精品天天中文字幕人妻| 免费久久人人爽人人爽av| 香蕉久久夜色精品国产2020| 久久99精品国产99久久6| 久久精品成人影院| 狠色狠色狠狠色综合久久| 久久国产色AV免费观看| 日产精品久久久一区二区| 伊人久久大香线蕉av不卡| 亚洲精品午夜国产VA久久成人| 久久精品国产亚洲AV香蕉| 色狠狠久久综合网| 亚洲午夜无码久久久久| 香蕉久久av一区二区三区 | 欧美粉嫩小泬久久久久久久 |