• <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>
            隨筆-4  評論-40  文章-117  trackbacks-0
             

            轉(zhuǎn)載 C++的運(yùn)算符重載

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

              運(yùn)算符重載是通過創(chuàng)建運(yùn)算符函數(shù)實(shí)現(xiàn)的,運(yùn)算符函數(shù)定義了重載的運(yùn)算符將要進(jìn)行的操作。運(yùn)算符函數(shù)的定義與其他函數(shù)的定義類似,惟一的區(qū)別是運(yùn)算符函數(shù)的函數(shù)名是由關(guān)鍵字operator和其后要重載的運(yùn)算符符號構(gòu)成的。運(yùn)算符函數(shù)定義的一般格式如下:

             

               

            <返回類型說明符> operator <運(yùn)算符符號>(<參數(shù)表>)
            {

                 
            <函數(shù)體>

            }

             

             運(yùn)算符重載時(shí)要遵循以下規(guī)則:

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

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

            (
            3) 運(yùn)算符重載實(shí)質(zhì)上是函數(shù)重載,因此編譯程序?qū)\(yùn)算符重載的選擇,遵循函數(shù)重載的選擇原則。

            (
            4) 重載之后的運(yùn)算符不能改變運(yùn)算符的優(yōu)先級和結(jié)合性,也不能改變運(yùn)算符操作數(shù)的個(gè)數(shù)及語法結(jié)構(gòu)。

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

            (
            6) 運(yùn)算符重載是針對新類型數(shù)據(jù)的實(shí)際需要對原有運(yùn)算符進(jìn)行的適當(dāng)?shù)母脑欤剌d的功能應(yīng)當(dāng)與原有功能相類似,避免沒有目的地使用重載運(yùn)算符。

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

            成員函數(shù)運(yùn)算符

             運(yùn)算符重載為類的成員函數(shù)的一般格式為:

                
            <函數(shù)類型> operator <運(yùn)算符>(<參數(shù)表>)

                
            {

                 
            <函數(shù)體>

                }

              當(dāng)運(yùn)算符重載為類的成員函數(shù)時(shí),函數(shù)的參數(shù)個(gè)數(shù)比原來的操作數(shù)要少一個(gè)(后置單目運(yùn)算符除外),這是因?yàn)槌蓡T函數(shù)用this指針隱式地訪問了類的一個(gè)對象,它充當(dāng)了運(yùn)算符函數(shù)最左邊的操作數(shù)。因此:

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

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

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

                調(diào)用成員函數(shù)運(yùn)算符的格式如下:

                
            <對象名>.operator <運(yùn)算符>(<參數(shù)>)

                它等價(jià)于

                
            <對象名><運(yùn)算符><參數(shù)>

                例如:a
            +b等價(jià)于a.operator +(b)。一般情況下,我們采用運(yùn)算符的習(xí)慣表達(dá)方式。

            友元函數(shù)運(yùn)算符

             運(yùn)算符重載為類的友元函數(shù)的一般格式為:

                friend 
            <函數(shù)類型> operator <運(yùn)算符>(<參數(shù)表>)

                
            {

                 
            <函數(shù)體>

                }

              當(dāng)運(yùn)算符重載為類的友元函數(shù)時(shí),由于沒有隱含的this指針,因此操作數(shù)的個(gè)數(shù)沒有變化,所有的操作數(shù)都必須通過函數(shù)的形參進(jìn)行傳遞,函數(shù)的參數(shù)與操作數(shù)自左至右一一對應(yīng)。

             調(diào)用友元函數(shù)運(yùn)算符的格式如下:

                
            operator <運(yùn)算符>(<參數(shù)1>,<參數(shù)2>)

                它等價(jià)于

                
            <參數(shù)1><運(yùn)算符><參數(shù)2>

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

            兩種重載形式的比較

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

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

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

            (
            3) 類型轉(zhuǎn)換函數(shù)只能定義為一個(gè)類的成員函數(shù)而不能定義為類的友元函數(shù)。

            (
            4) 若一個(gè)運(yùn)算符的操作需要修改對象的狀態(tài),選擇重載為成員函數(shù)較好。

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

            (
            6) 當(dāng)運(yùn)算符函數(shù)是一個(gè)成員函數(shù)時(shí),最左邊的操作數(shù)(或者只有最左邊的操作數(shù))必須是運(yùn)算符類的一 個(gè)類對象(或者是對該類對象的引用)。如果左邊的操作數(shù)必須是一個(gè)不同類的對象,或者是一個(gè)內(nèi)部 類型的對象,該運(yùn)算符函數(shù)必須作為一個(gè)友元函數(shù)來實(shí)現(xiàn)。

            (
            7) 當(dāng)需要重載運(yùn)算符具有可交換性時(shí),選擇重載為友元函數(shù)。

             

            posted on 2009-03-02 10:26 李陽 閱讀(525) 評論(0)  編輯 收藏 引用 所屬分類: C++
            中文精品99久久国产| 老司机午夜网站国内精品久久久久久久久| 97久久精品人人澡人人爽| 久久精品国产影库免费看| 久久黄视频| 伊人久久综合无码成人网| 色婷婷综合久久久久中文一区二区| 久久久噜噜噜久久中文福利| 久久99精品国产99久久6男男| 久久精品免费网站网| 色欲综合久久躁天天躁蜜桃| 久久精品www人人爽人人| 久久综合九色综合久99| 国产精品久久久久久五月尺| AV狠狠色丁香婷婷综合久久| 亚洲午夜精品久久久久久浪潮| 国产成人精品久久免费动漫| 性做久久久久久久久老女人| 99久久久国产精品免费无卡顿| 亚洲日韩欧美一区久久久久我| 久久精品国产亚洲一区二区| 99久久精品免费看国产一区二区三区 | 亚洲国产精品无码久久一线| 亚洲国产成人久久综合碰| 狠狠色丁香久久婷婷综合五月| 中文字幕无码av激情不卡久久| 91精品国产9l久久久久| 亚洲中文字幕久久精品无码APP| 国产精品熟女福利久久AV| 丰满少妇高潮惨叫久久久| 青青草原精品99久久精品66| 人人妻久久人人澡人人爽人人精品 | 国产精品久久久久AV福利动漫| yellow中文字幕久久网| 亚洲精品乱码久久久久久按摩| 国产精品美女久久久久av爽| 无码人妻精品一区二区三区久久久| 区亚洲欧美一级久久精品亚洲精品成人网久久久久 | 色综合久久88色综合天天 | 久久久久中文字幕| 999久久久无码国产精品|