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

            小明思考

            高性能服務(wù)器端計(jì)算
            posts - 70, comments - 428, trackbacks - 0, articles - 0
              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            考考你對(duì)C++對(duì)象模型的理解

            Posted on 2005-12-06 09:34 小明 閱讀(2498) 評(píng)論(12)  編輯 收藏 引用 所屬分類(lèi): C/C++
            這是小明我自編的題目。

            1.請(qǐng)?jiān)诓贿\(yùn)行程序的情況下,說(shuō)出下面的程序運(yùn)行后會(huì)崩潰么?如果是,在哪一行。

             1 #include <stdio.h>
             2 #include <memory.h>
             3 class Test 
             4 
             5 public
             6         Test() 
             7         { 
             8                 memset(this,0,sizeof(*this)); 
             9         } 
            10         int s; 
            11         void test() 
            12         { 
            13                 printf("test()\n"); 
            14         }
            15         void test1() 
            16         { 
            17                 printf("test1():%d\n",this->s); 
            18         }
            19         virtual void test2() 
            20         { 
            21                 printf("test2()\n"); 
            22         }
            23 }; 
            24 
            25 int main() 
            26 
            27         Test *s; 
            28         s->test(); 
            29         s->test2(); 
            30         s->test1(); 
            31         return 0
            32 }

            2 .修改一下,又是在哪一行呢?

             1 #include <stdio.h>
             2 #include <memory.h>
             3 class Test 
             4 
             5 public
             6         Test() 
             7         { 
             8                 memset(this,0,sizeof(*this)); 
             9         } 
            10         int s; 
            11         void test() 
            12         { 
            13                 printf("test()\n"); 
            14         }
            15         void test1() 
            16         { 
            17                 printf("test1():%d\n",this->s); 
            18         }
            19         virtual void test2() 
            20         { 
            21                 printf("test2()\n"); 
            22         }
            23 }; 
            24 
            25 int main() 
            26 
            27         Test *= new Test(); 
            28         s->test(); 
            29         s->test1(); 
            30         s->test2(); 
            31         return 0
            32 }

            3.再修改一下,情況會(huì)如何呢?
             1 #include <stdio.h>
             2 #include <memory.h>
             3 class Test 
             4 
             5 public
             6         Test() 
             7         { 
             8                 memset(this,0,sizeof(*this)); 
             9         } 
            10         int s; 
            11         void test() 
            12         { 
            13                 printf("test()\n"); 
            14         }
            15         void test1() 
            16         { 
            17                 printf("test1():%d\n",this->s); 
            18         }
            19         virtual void test2() 
            20         { 
            21                 printf("test2()\n"); 
            22         }
            23 }; 
            24 
            25 int main() 
            26 
            27         Test s ;
            28         s.test(); 
            29         s.test1(); 
            30         s.test2(); 
            31         return 0
            32 }




            最后說(shuō)一下答案吧
            第一題是在29行,第二題在30行,最后一題不報(bào)錯(cuò)。
            如果你不知道為什么,建議看看<<Inside the c++ Object Model>>

            Feedback

            # re: 考考你對(duì)C++對(duì)象模型的理解  回復(fù)  更多評(píng)論   

            2005-12-06 13:19 by 芋頭
            這題挺有意思的,呵呵。
            再加一個(gè):
            int main()
            {
            Test s ;
            Test* s1 = &s;
            s1->test();
            s1->test1();
            s1->test2();
            return 0;
            }

            # re: 考考你對(duì)C++對(duì)象模型的理解  回復(fù)  更多評(píng)論   

            2005-12-22 10:00 by LiaoLiaoPro
            簡(jiǎn)單。

            Test()
            {
            memset(this,0,sizeof(*this));
            }

              構(gòu)造函數(shù)中,把對(duì)象所在的內(nèi)存塊置為了0。而對(duì)象中含有虛函數(shù),所以指向虛函數(shù)表的vptr指針也被置為了0。

              前兩種調(diào)用都是通過(guò)指針進(jìn)行調(diào)用,用指針或引用(樓上的例子)調(diào)用虛函數(shù)時(shí)會(huì)通過(guò)vptr指針間接調(diào)用,通過(guò)對(duì)象調(diào)用則不會(huì)。所以1,2出錯(cuò)。3不出錯(cuò)。

            在1中,樓主把test1放在test2后調(diào)用,是為了讓test2出錯(cuò)吧,呵呵。因?yàn)閠est1放在上面的話,在test1中就出錯(cuò)了(引用了this指針,但this卻是個(gè)野指針。)

            # re: 考考你對(duì)C++對(duì)象模型的理解  回復(fù)  更多評(píng)論   

            2006-03-03 17:00 by 笑笑生
            題很好啊,贊一個(gè)

            # re: 考考你對(duì)C++對(duì)象模型的理解  回復(fù)  更多評(píng)論   

            2006-03-09 16:35 by september_29
            我的QQ是 417522707 精通了 Cpp Obj Model,但是苦于無(wú)人交流,周?chē)亩际侨海恢牢以谡f(shuō)什么的研究生,希望能與你交個(gè)朋友

            # re: 考考你對(duì)C++對(duì)象模型的理解  回復(fù)  更多評(píng)論   

            2006-03-10 14:48 by init
            也可以s1->Test::test2(), 則不會(huì)根據(jù)vptr指針來(lái)invoke function.

            # re: 考考你對(duì)C++對(duì)象模型的理解  回復(fù)  更多評(píng)論   

            2006-03-11 10:15 by init
            例子1跟有無(wú)memset()沒(méi)關(guān)系,根本沒(méi)產(chǎn)生對(duì)象,test()和test1()代碼獨(dú)立于Test對(duì)象,而test2()必須由對(duì)象中的vptr來(lái)調(diào)用(除非使用Test::test2())。如果要強(qiáng)調(diào)memset的影響,main()中這樣: Test*s = new Test()

            # re: 考考你對(duì)C++對(duì)象模型的理解  回復(fù)  更多評(píng)論   

            2006-05-31 09:11 by Neo
            建議以后出題的時(shí)候的類(lèi)名用 A,B,C,
            函數(shù)名用fun,

            不覺(jué)得 test() & Test() 很像嗎,還是在故意考驗(yàn)大家的眼力?

            # re: 考考你對(duì)C++對(duì)象模型的理解  回復(fù)  更多評(píng)論   

            2008-04-30 11:02 by 瘋子
            用這句一切都OK了memset((char *)this + 4,0,sizeof(*this) - 4);

            # re: 考考你對(duì)C++對(duì)象模型的理解  回復(fù)  更多評(píng)論   

            2008-07-26 08:02 by lengbufang
            哦哦!!

            # re: 考考你對(duì)C++對(duì)象模型的理解  回復(fù)  更多評(píng)論   

            2009-08-08 01:45 by 周龍亭
            不要用C語(yǔ)言的方法來(lái)寫(xiě)C++程序

            # re: 考考你對(duì)C++對(duì)象模型的理解  回復(fù)  更多評(píng)論   

            2009-09-03 14:12 by yyu
            用這句一切都OK了memset((char *)this + 4,0,sizeof(*this) - 4);
            C++里沒(méi)有規(guī)定vptr的存放位置,所以你句修改對(duì)于不同的編譯器可能出錯(cuò)

            # re: 考考你對(duì)C++對(duì)象模型的理解  回復(fù)  更多評(píng)論   

            2009-09-16 11:54 by yilog
            你們用的是什么編譯器?第一個(gè)程序,那s沒(méi)指向,直接在28行就宕掉了,不是這樣的么,我用的vs2005是這樣的。
            一本久久精品一区二区| 日韩久久久久久中文人妻 | 免费精品国产日韩热久久| 精品99久久aaa一级毛片| 亚洲精品NV久久久久久久久久 | 久久er国产精品免费观看2| 久久被窝电影亚洲爽爽爽| 狠狠久久综合| 久久精品欧美日韩精品| 国内精品伊人久久久久影院对白| 精品久久久无码人妻中文字幕| 91精品国产91久久久久福利| 久久精品国产99久久久香蕉| 亚洲国产精品无码久久| 国产亚洲美女精品久久久| 久久精品国产久精国产一老狼| 亚洲国产精品久久久久婷婷软件| 国产99久久久国产精品小说 | 久久99精品久久久久久秒播| 久久这里只有精品首页| 亚洲欧美精品伊人久久| 亚洲av成人无码久久精品| 亚洲欧美一级久久精品| 国产免费久久久久久无码| 丰满少妇高潮惨叫久久久| 久久久久久伊人高潮影院| 久久久久久国产精品免费免费 | 久久久久高潮综合影院| 久久午夜福利电影| 99久久精品无码一区二区毛片 | 精品久久久久久国产潘金莲| 亚洲欧美成人久久综合中文网 | 国产成人精品综合久久久| 日韩精品无码久久久久久| 一本一道久久综合狠狠老 | 亚洲国产美女精品久久久久∴| 久久强奷乱码老熟女| 久久精品成人欧美大片| 国内精品久久久久国产盗摄| 国产真实乱对白精彩久久| 久久国产成人亚洲精品影院|