• <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>

            統(tǒng)計(jì)

            • 隨筆 - 50
            • 文章 - 42
            • 評(píng)論 - 147
            • 引用 - 0

            留言簿(6)

            隨筆分類

            文章分類

            Link

            搜索

            •  

            積分與排名

            • 積分 - 164660
            • 排名 - 159

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            對(duì)于c++中常量成員函數(shù),返回常量引用,const_cast的總結(jié)

            常量成員函數(shù):

            先看這個(gè)例子

            bool Sales_item::same_isbn(const Sales_item &rhs) const

            { return (isbn rhs.isbn);}

            藍(lán)色的const用于修飾顯示傳入的形參rhs,而對(duì)于類的成員則有隱式的,而外的this指針作為形參傳入,而紅色部分的const正是修飾這部分參數(shù)this

            const 成員函數(shù)的引入

            現(xiàn)在,可以理解跟在Sales_item 成員函數(shù)聲明的形參表后面的const 所起的作用了: const改變了隱含的this 形參的類型。在調(diào)用total.same_isbn(trans) 時(shí),隱含的this 形參將是一個(gè)指向total 對(duì)象的const Sales_item*類型的指針。就像如下編寫same_isbn 的函數(shù)體一樣:

             

            / / pseudo-code illustration of how the implicit this pointer is used

            / / This code is illegal: We may not explicitly define the this pointer ourselves

            / / Note that this is a pointer to const because same_isbn is a const member

            bool Sales_item::same_isbn(const Sales item *const this ,const Sales_item &rhs) const

            return (this->isbn rhs.isbn);}

             

            用這種方式使用const 的函數(shù)稱為常量成員函數(shù)(const member function) 。由于this 是指向const 對(duì)象的指針,const 成員函數(shù)不能修改調(diào)用該函數(shù)的對(duì)象。因此,函數(shù)avg-price

            和函數(shù)sarne isbn 只能讀取而不能修改調(diào)用它們的對(duì)象的數(shù)據(jù)成員。

            NOTE

            const對(duì)象指向const的指針或引用只能用于調(diào)用其const成員函數(shù)如果嘗試用它們來調(diào)用非const 成員函數(shù),則是錯(cuò)誤的。

             

            返回常量引用:

             

            在看一個(gè)例子:

             1mycls const& returntest()//定義返回值為一個(gè)常量引用
             2{
             3       mycls my1(3);
             4       cout<<"a in the func is"<<&my1<<endl;
             5       return my1;
             6}

             7int _tmain(int argc, _TCHAR* argv[])
             8{
             9       //測(cè)試返回引用類型
            10       mycls const&str = returntest();//使用cont&接受返回值
            11       //str.m_q=12;//編譯報(bào)錯(cuò),不可以修改const類型
            12       mycls &str1=const_cast<mycls&>(str);//去掉const屬性,以便修改
            13       str1.m_q=12;
            14       cout<<"&b="<<&str<<endl;
            15       cout<<"&b="<<&str1<<endl;
            16       system("pause");
            17   return 0
            18}

            以上mycls是我自己定義的一個(gè)類,聲明如下

             1class mycls
             2{
             3    public:
             4        mycls(int a);
             5        char a[100000];
             6        //~mycls(void);
             7        int m_q;
             8    template <class T> inline int compare(const T &a,const T &b)
             9    {
            10        if(a == b)
            11            return 0;
            12        else if(a > b)
            13            return 1;
            14        else if(a<b)
            15            return -1;
            16        return 0;
            17    }

            18    mycls& operator+(mycls a);
            19    virtual int dosomething(int a);
            20    virtual void doanotherthing(void);
            21}
            ;
            22
            通過代碼注釋,我想這不難理解,用一個(gè)引用類型的返回值最大好處就是可以避免內(nèi)存拷貝,注意到我的類中有一個(gè)長(zhǎng)度為100000的char數(shù)組,我想頻繁拷貝這個(gè)數(shù)組對(duì)于一下性能較低的機(jī)器還是很耗時(shí)的,這時(shí)我們返回const &類型,避免了文件的拷貝,從輸出也可以看到,returntest函數(shù)內(nèi)的對(duì)象地址與main函數(shù)內(nèi)所返回的引用對(duì)象地址完全一致。


             

            posted on 2008-12-04 17:08 pear_li 閱讀(3421) 評(píng)論(4)  編輯 收藏 引用 所屬分類: C++

            評(píng)論

            # re: 對(duì)于c++中常量成員函數(shù),返回常量引用,const_cast的總結(jié) 2008-12-06 10:39 blackball

            有時(shí)候我用const_cast的時(shí)候去掉const屬性并沒有實(shí)質(zhì)性的效果,比如:
            const int var = 10;
            int *pt = const_cast<int*>(&var);
            *pt = 20;
            cout<<" "<<&var << endl;
            cout<<*pt<<" "<< var<< endl;

            這樣輸出的結(jié)果就會(huì)很奇怪,地址相同但是值不同。
            這是怎么回事呢?

            # re: 對(duì)于c++中常量成員函數(shù),返回常量引用,const_cast的總結(jié) 2008-12-06 18:19 pear_li

            @blackball
            這個(gè)我覺得應(yīng)該是編譯器對(duì)常量?jī)?yōu)化造成的,你可以在var前冠以volatile試試,應(yīng)該是沒問題的

            # re: 對(duì)于c++中常量成員函數(shù),返回常量引用,const_cast的總結(jié) 2010-12-05 23:10 querw

            returntest() 返回了一個(gè)棧內(nèi)的變量, 你確定沒有問題嗎?

            # re: 對(duì)于c++中常量成員函數(shù),返回常量引用,const_cast的總結(jié)[未登錄] 2013-08-16 11:21 gong

            { return (isbn rhs.isbn);}
            這里是不是掉東西了?前面的isbn表示什么?
            久久久久人妻一区精品| www久久久天天com| 无码任你躁久久久久久老妇App| 亚洲欧美日韩精品久久亚洲区| 久久香综合精品久久伊人| 精品久久久久久无码专区| 久久99精品久久久久久齐齐| 国产精品免费看久久久香蕉| 婷婷久久综合| 97久久超碰国产精品2021| 亚洲国产精品一区二区三区久久 | 一本色道久久88—综合亚洲精品| 久久精品亚洲一区二区三区浴池| 热久久这里只有精品| 99精品久久久久久久婷婷| 久久精品国产黑森林| 国产成人无码久久久精品一| 无码乱码观看精品久久| 久久久久AV综合网成人 | 少妇内射兰兰久久| 久久本道伊人久久| 亚洲成色www久久网站夜月| 激情综合色综合久久综合| 精品久久久久久无码中文字幕一区| 久久这里只有精品视频99| 久久国产一区二区| 久久久久人妻精品一区| 亚洲综合精品香蕉久久网| 日韩久久无码免费毛片软件| 91亚洲国产成人久久精品网址| 久久综合久久自在自线精品自 | 日韩人妻无码精品久久久不卡| 伊人色综合久久天天网| 久久99精品国产麻豆不卡| 色综合久久天天综合| 国内精品伊人久久久久AV影院| 97精品伊人久久大香线蕉| 伊人久久大香线蕉AV一区二区 | 国产69精品久久久久APP下载| 久久综合日本熟妇| 久久婷婷色综合一区二区|