• <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>
            兩段想當(dāng)然寫(xiě)下的代碼,你看出問(wèn)題了吧
            1 class Data;
            2 Data* FindData();
            3 void GetData(Data* dataPtr)
            4 {
            5     dataPtr=FindData();
            6 }
            7 Data* data=NULL;
            8 GetData(data);
            9 data->somefunction();
            第二段代碼,更得仔細(xì)點(diǎn)
             1 class A;
             2 class B;
             3 const * GetA();
             4 const * GetB();
             5 template<typename T>
             6 int GetSpecialValue(T* classPtr)
             7 {
             8    return  3721;
             9 }
            10 
            11 template<>
            12 int GetSpecialValue<>(A* classPtr)
            13 {
            14    return  37;
            15 }
            16 template<>
            17 int GetSpecialValue<>(B* classPtr)
            18 {
            19    return 21;
            20 }
            21 const * classPtr=GetA();
            22 int ret=GetSpecialValue(classPtr);
            23 cout<<ret<<endl; //out 3721! why not 37?
            24 
            25 
            26 
            第一段的問(wèn)題在于看到指針想當(dāng)然認(rèn)為是地址,data 可以帶回反回值,其實(shí)因?yàn)檫@里是值傳遞,實(shí)參data把自己的值賦給了dataPtr,dataPtr后來(lái)確實(shí)從FindData()得到了想要的值,但這對(duì)一點(diǎn)影響也沒(méi)有,所以函數(shù)返回時(shí),data的值沒(méi)有發(fā)生變化,也就是沒(méi)有帶回想要的值。
            只要不想當(dāng)然,仔細(xì)一想就明白了,解決辦法很簡(jiǎn)單:
            1  void GetData(Data*& dataPtr)
            2 4 {
            3 5     dataPtr=FindData();
            4 6 }
            第二段的問(wèn)題是沒(méi)有注意到那個(gè)const, T*  和 T const* 是不一樣的,不能完全匹配,所以不會(huì)找到對(duì)A類型的特化版本,解決辦法可以這樣:
             1 template<typename T>
             2 int GetSpecialValue(T const* classPtr)
             3 {
             4    return  3721;
             5 }
             6 
             7 template<>
             8 int GetSpecialValue<>(A const* classPtr)
             9 {
            10    return  37;
            11 }
            12 template<>
            13 int GetSpecialValue<>(B const* classPtr)
            14 {
            15    return 21;
            16 }
            能過(guò)這兩個(gè)小例子就可以知道,C++細(xì)節(jié)很多,要仔細(xì),不能想當(dāng)然。
            posted on 2009-05-06 21:09 清源游民 閱讀(1766) 評(píng)論(5)  編輯 收藏 引用 所屬分類: C++

            FeedBack:
            # re: c++,要細(xì)心不能想當(dāng)然
            2009-05-06 22:15 | Sunshine Alike
            恍然小悟,謝了 :)  回復(fù)  更多評(píng)論
              
            # re: c++,要細(xì)心不能想當(dāng)然
            2009-05-20 20:52 | 閆軍yy
            !!!  回復(fù)  更多評(píng)論
              
            # re: c++,要細(xì)心不能想當(dāng)然
            2009-06-01 13:05 | peng
            您好:
            我用第一段代碼做了一個(gè)測(cè)試,好象可以呀?
            #include <stdio>
            class Data{
            public:
            void somefunction(){printf("bbb\n");}
            };
            Data asd=Data();
            Data* FindData() {
            // return new Data(); //用這句也行
            return &asd;
            }

            void GetData(Data* dataPtr) { dataPtr=FindData(); }

            int main(int argc, char* argv[])
            {
            printf("aaa\n");
            Data* data=NULL;
            GetData(data);
            data->somefunction();
            return 0;
            }

            程序運(yùn)行并打印出
            aaa
            bbb  回復(fù)  更多評(píng)論
              
            # re: c++,要細(xì)心不能想當(dāng)然
            2009-06-01 16:18 | 清源游民
            @peng
            你的這個(gè)測(cè)試其實(shí)引出了,c++的一個(gè)更深入的問(wèn)題:c++對(duì)象模型。
            在你的程序中,當(dāng)執(zhí)行GetData(data)后,你認(rèn)為data已經(jīng)有值了,非NULL,
            要不怎么會(huì)沒(méi)報(bào)錯(cuò),而且打印了‘正確’結(jié)果,其實(shí)如果這樣寫(xiě)你的測(cè)試代碼
            Data* data=NULL;
            //注意:你的原來(lái)那行注釋掉 GetData(data);
            data->somefunction();
            一樣會(huì)打印出結(jié)果:bbb,沒(méi)有報(bào)錯(cuò)
            你可能會(huì)懷疑:data=NULL????
            沒(méi)錯(cuò),這就是c++對(duì)象模型問(wèn)題了。編譯器會(huì)把data->somefunction()這行代碼改成類似這樣:
            sonefunction(data),data就是this指針。因?yàn)閟omefunction()函數(shù)里沒(méi)有用到this指針,他為null,也無(wú)所謂。所以會(huì)打印出“bbb".

            真的,c++要細(xì)心,不能想當(dāng)然,呵呵。

              回復(fù)  更多評(píng)論
              
            # re: c++,要細(xì)心不能想當(dāng)然
            2009-12-03 16:38 | joewan
            @清源游民
            這個(gè)點(diǎn)評(píng)真精彩!
            雖然我對(duì)c++類型模型知道一些,以及mangling機(jī)制;
            只是對(duì)這個(gè)
            Data* data=NULL;
            data->somefunction();
            能打印出結(jié)果來(lái)頗感意外,NULL指針竟然也能解引用!

            我也是從其他朋友blog,知道你,訂閱你的blog了,向你致敬!  回復(fù)  更多評(píng)論
              
            <2007年3月>
            25262728123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            留言簿(35)

            隨筆分類(78)

            隨筆檔案(74)

            文章檔案(5)

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            成人免费网站久久久| 色综合久久中文综合网| 无码精品久久一区二区三区| 无码人妻少妇久久中文字幕| 久久天天躁夜夜躁狠狠| 国产高潮国产高潮久久久91| 亚洲国产成人精品91久久久 | 久久一本综合| 亚洲国产精品无码久久久不卡| 久久精品国产只有精品2020| 久久亚洲国产成人精品无码区| 久久久久久久久久久久中文字幕| 精品久久人人爽天天玩人人妻| 国产精品久久久久久久app| 久久免费视频观看| 一本久久a久久精品亚洲| 久久久精品国产Sm最大网站| 久久这里只有精品18| 亚洲国产视频久久| 精品免费久久久久国产一区 | 久久久久久久久久久精品尤物| 久久精品国产亚洲77777| 欧美国产成人久久精品| 国产一级持黄大片99久久| 国产精品乱码久久久久久软件| 精品久久国产一区二区三区香蕉 | 久久国产成人午夜AV影院| 思思久久99热只有频精品66| 久久国产精品免费一区| 91精品婷婷国产综合久久| 久久综合88熟人妻| 久久久久人妻一区二区三区vr| 色8久久人人97超碰香蕉987| 久久婷婷是五月综合色狠狠| 日韩中文久久| 亚洲国产日韩欧美久久| 久久天天躁狠狠躁夜夜av浪潮 | 97久久香蕉国产线看观看| 久久人妻少妇嫩草AV无码专区| 一本久久免费视频| 久久SE精品一区二区|