• <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>
            華劍緣
            一切都在這個過程中獲得,將那些目標埋藏于心中
            posts - 19,comments - 20,trackbacks - 0
            ?this指針只能在一個類的成員函數中調用,它表示當前對象的地址。下面是一個例子:
            ????void Date::setMonth( int mn )
            ????{
            ???? month = mn; // 這三句是等價的
            ???? this->month = mn;
            ???? (*this).month = mn;
            ????}


            1. this只能在成員函數中使用。
            全局函數,靜態函數都不能使用this。
            實際上,成員函數默認第一個參數為T* const register this。
            如:
            class A{public: int func(int p){}};
            其中,func的原型在編譯器看來應該是: int func(A* const register this, int p);

            2. 由此可見,this在成員函數的開始前構造的,在成員的結束后清除。
            這個生命周期同任一個函數的參數是一樣的,沒有任何區別。
            當調用一個類的成員函數時,編譯器將類的指針作為函數的this參數傳遞進去。如:
            A a;
            a.func(10);
            此處,編譯器將會編譯成: A::func(&a, 10);
            嗯,看起來和靜態函數沒差別,對嗎?不過,區別還是有的。編譯器通常會對this指針做一些優化的,因此,this指針的傳遞效率比較高--如vc通常是通過ecx寄存器來傳遞this參數。

            3. 回答
            #1:this指針是什么時候創建的?
            this在成員函數的開始執行前構造的,在成員的執行結束后清除。
            #2:this指針存放在何處? 堆,棧,全局變量,還是其他?
            this指針會因編譯器不同,而放置的位置不同。可能是棧,也可能是寄存器,甚至全局變量。
            #3:this指針如何傳遞給類中函數的?綁定?還是在函數參數的首參數就是this指針.那么this指針又是如何找到類實例后函數的?
            this是通過函數參數的首參數來傳遞的。this指針是在調用之前生成的。類實例后的函數,沒有這個說法。類在實例化時,只分配類中的變量空間,并沒有為函數分配空間。自從類的函數定義完成后,它就在那兒,不會跑的。
            #4:this指針如何訪問類中變量的/?
            如果不是類,而是結構的話,那么,如何通過結構指針來訪問結構中的變量呢?如果你明白這一點的話,那就很好理解這個問題了。
            在C++中,類和結構是只有一個區別的:類的成員默認是private,而結構是public。
            this是類的指針,如果換成結構,那this就是結構的指針了。

            #5:我們只有獲得一個對象后,才能通過對象使用this指針,如果我們知道一個對象this指針的位置可以直接使用嗎?
            this指針只有在成員函數中才有定義。因此,你獲得一個對象后,也不能通過對象使用this指針。所以,我們也無法知道一個對象的this指針的位置(只有在成員函數里才有this指針的位置)。當然,在成員函數里,你是可以知道this指針的位置的(可以&this獲得),也可以直接使用的。
            #6:每個類編譯后,是否創建一個類中函數表保存函數指針,以便用來調用函數?
            普通的類函數(不論是成員函數,還是靜態函數),都不會創建一個函數表來保存函數指針的。只有虛函數才會被放到函數表中。
            但是,既使是虛函數,如果編譯器能明確知道調用的是哪個函數,編譯器就不會通過函數表中的指針來間接調用,而是會直接調用該函數。

            # 7:這些編譯器如何做到的?8:能否模擬實現?
            知道原理后,這兩個問題就很容易理解了。
            其實,模擬實現this的調用,在很多場合下,很多人都做過。
            例如,系統回調函數。系統回調函數有很多,如定時,線程啊什么的。

            舉一個線程的例子:
            class A{
            int n;
            public:
            static void run(void* pThis){
            A* this_ = (A*)pThis;
            this_->process();
            }
            void process(){}
            };

            main(){
            A a;
            _beginthread( A::run, 0, &a );
            }

            這里就是定義一個靜態函數來模擬成員函數。

            也有許多C語言寫的程序,模擬了類的實現。如freetype庫等等。
            其實,有用過C語言的人,大多都模擬過。只是當時沒有明確的概念罷了。
            如:
            typedef struct student{
            int age;
            int no;
            int scores;
            }Student;
            void initStudent(Student* pstudent);
            void addScore(Student* pstudent, int score);
            ...
            如果你把 pstudent改成this,那就一樣了。

            它相當于:
            class Student{
            public:
            int age; int no; int scores;
            void initStudent();
            void addScore(int score);
            }

            const常量可以有物理存放的空間,因此是可以取地址的


            ///this指針是在創建對象前創建.
            this指針放在棧上,在編譯時刻已經確定.
            并且當一個對象創建后,并且運行整個程序運行期間只有一個this指針.

            posted on 2006-08-10 14:53 華劍緣 閱讀(315) 評論(0)  編輯 收藏 引用
            久久er国产精品免费观看2| 66精品综合久久久久久久| 亚洲国产成人久久综合区| 亚洲伊人久久综合中文成人网| 中文字幕精品久久久久人妻| 久久亚洲sm情趣捆绑调教| 国产美女久久精品香蕉69| 久久久久人妻一区精品| 久久99国产综合精品| 久久久久人妻一区精品果冻| A级毛片无码久久精品免费 | 久久综合五月丁香久久激情| 亚洲国产成人精品无码久久久久久综合 | 亚洲午夜无码久久久久| 九九久久精品无码专区| 久久综合亚洲欧美成人| 91麻豆国产精品91久久久| 亚洲国产精品人久久| 久久无码中文字幕东京热| 国产精品亚洲综合专区片高清久久久| 亚洲精品视频久久久| 久久午夜无码鲁丝片午夜精品| 精品人妻久久久久久888| 久久精品国产日本波多野结衣| 精品人妻伦九区久久AAA片69| 国产精品久久亚洲不卡动漫| 久久久久青草线蕉综合超碰| 日韩欧美亚洲国产精品字幕久久久| www.久久热.com| 99久久婷婷免费国产综合精品| 无码国内精品久久人妻| 中文字幕热久久久久久久| 亚洲人成无码网站久久99热国产 | 天天躁日日躁狠狠久久| 久久婷婷五月综合色奶水99啪| 久久久久久av无码免费看大片| 国产精品久久久99| 欧美性大战久久久久久| 人妻精品久久久久中文字幕| 久久影视综合亚洲| 伊人久久综合无码成人网|