• <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 華劍緣 閱讀(309) 評論(0)  編輯 收藏 引用
            久久99精品国产麻豆蜜芽| 中文字幕人妻色偷偷久久| 久久香蕉一级毛片| 国产999精品久久久久久| 无码乱码观看精品久久| 久久亚洲AV成人无码电影| 国产亚洲婷婷香蕉久久精品| 久久无码一区二区三区少妇 | 久久久久人妻精品一区| a级成人毛片久久| 欧美日韩精品久久免费| 99久久综合狠狠综合久久止| 亚洲国产精品成人久久蜜臀 | 色偷偷偷久久伊人大杳蕉| 久久亚洲国产午夜精品理论片| 国产午夜电影久久| 香蕉久久av一区二区三区| 国产午夜福利精品久久| 欧美va久久久噜噜噜久久| 久久婷婷人人澡人人| 久久99精品久久久久久hb无码 | 久久精品水蜜桃av综合天堂| 精品久久久久久无码免费| 国内精品久久久久久99蜜桃| 久久亚洲AV无码西西人体| 蜜桃麻豆www久久| 久久亚洲中文字幕精品有坂深雪| 精品久久久一二三区| 精品多毛少妇人妻AV免费久久| 97久久国产亚洲精品超碰热| 亚洲午夜久久久久久久久电影网| 少妇久久久久久被弄到高潮| 国内精品久久久久久久coent| 99久久国产免费福利| AAA级久久久精品无码区| 狠狠久久亚洲欧美专区| 国产精品99久久精品| 国产精品久久久久影视不卡| 国产精品99久久精品| 久久综合欧美成人| 国产999精品久久久久久|