• <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)  編輯 收藏 引用
            久久久国产精品网站| 精品免费久久久久国产一区| 国产精品久久久久久久午夜片| 久久中文字幕一区二区| 久久青青草原综合伊人| 97超级碰碰碰碰久久久久| 久久精品成人免费观看97| 国内精品久久久久久久久| 亚洲精品午夜国产va久久| 久久亚洲国产成人精品性色| 秋霞久久国产精品电影院| 国产成人无码精品久久久免费| 国产精品久久久久久久人人看| 97r久久精品国产99国产精| 久久亚洲av无码精品浪潮| 国产精品禁18久久久夂久| 三级片免费观看久久| 久久久久久狠狠丁香| 亚洲色大成网站www久久九| 久久www免费人成精品香蕉| 久久综合综合久久综合| 亚洲午夜精品久久久久久app| 热久久国产精品| 久久国产精品一国产精品金尊| 亚洲国产精品一区二区三区久久| 久久人人爽人人爽人人片AV不| 久久精品无码av| 亚洲国产精品久久久久网站| 99久久精品国产一区二区| 亚洲国产精品无码久久久久久曰| 91久久精品电影| 青青青国产成人久久111网站| 国产99久久精品一区二区| 国产精品久久午夜夜伦鲁鲁| 狠狠色噜噜色狠狠狠综合久久| 亚洲欧洲久久久精品| 久久精品国产一区二区三区不卡| 精品综合久久久久久88小说| 久久伊人精品青青草原高清| 青青青伊人色综合久久| 国产亚洲美女精品久久久|