• <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)  編輯 收藏 引用
            久久久中文字幕| 久久男人AV资源网站| 精品人妻伦一二三区久久| 午夜精品久久久久久毛片| 亚洲v国产v天堂a无码久久| 国产精品内射久久久久欢欢| 99久久中文字幕| 丁香五月网久久综合| 精品无码久久久久国产| av午夜福利一片免费看久久| 久久精品国产亚洲AV高清热 | 狠狠色婷婷综合天天久久丁香 | 麻豆AV一区二区三区久久| 精品人妻伦九区久久AAA片69| 久久中文字幕精品| 久久精品人妻中文系列| 欧美一区二区久久精品| 99久久精品免费看国产一区二区三区 | 久久久久久久波多野结衣高潮| 成人久久免费网站| 亚洲AV成人无码久久精品老人| 国产精品美女久久久久久2018| 狠狠色丁香婷综合久久| 久久精品这里只有精99品| 一本色道久久88综合日韩精品 | 亚洲国产日韩欧美综合久久| 久久午夜夜伦鲁鲁片免费无码影视| 色播久久人人爽人人爽人人片AV| 亚洲综合精品香蕉久久网| 2022年国产精品久久久久| 久久精品国产第一区二区| 色婷婷久久久SWAG精品| 亚洲国产美女精品久久久久∴ | 精品伊人久久大线蕉色首页| 精品久久久噜噜噜久久久| 久久久WWW免费人成精品| 精品国产乱码久久久久久人妻| 久久精品无码一区二区三区| 中文国产成人精品久久亚洲精品AⅤ无码精品| 久久夜色精品国产欧美乱| 国产成人精品久久一区二区三区av |