日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++中this指针的使用方法.

發(fā)布時間:2024/4/14 c/c++ 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++中this指针的使用方法. 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
this指針僅僅能在一個類的成員函數(shù)中調(diào)用,它表示當(dāng)前對象的地址。以下是一個樣例: void Date::setMonth( int mn ) { month = mn; // 這三句是等價的 this->month = mn; (*this).month = mn; } 1. this僅僅能在成員函數(shù)中使用。 全局函數(shù),靜態(tài)函數(shù)都不能使用this。 實際上,成員函數(shù)默認(rèn)第一個參數(shù)為T* const register this。 如: class A{public: int func(int p){}}; 當(dāng)中,func的原型在編譯器看來應(yīng)該是: int func(A* const register this, int p); 2. 由此可見,this在成員函數(shù)的開始前構(gòu)造的,在成員的結(jié)束后清除。 這個生命周期同任一個函數(shù)的參數(shù)是一樣的,沒有不論什么差別。 當(dāng)調(diào)用一個類的成員函數(shù)時,編譯器將類的指針作為函數(shù)的this參數(shù)傳遞進去。如: A a; a.func(10); 此處,編譯器將會編譯成: A::func(&a, 10); 嗯,看起來和靜態(tài)函數(shù)沒區(qū)別,對嗎?只是,區(qū)別還是有的。編譯器一般會對this指針做一些優(yōu)化的,因此,this指針的傳遞效率比較高--如vc一般是通過ecx寄存器來傳遞this參數(shù)。3. 回答 #1:this指針是什么時候創(chuàng)建的? this在成員函數(shù)的開始運行前構(gòu)造的,在成員的運行結(jié)束后清除。 #2:this指針存放在何處? 堆,棧,全局變量,還是其它? this指針會因編譯器不同,而放置的位置不同??赡苁菞?#xff0c;也可能是寄存器,甚至全局變量。 #3:this指針怎樣傳遞給類中函數(shù)的?綁定?還是在函數(shù)參數(shù)的首參數(shù)就是this指針.那么this指針又是怎樣找到類實例后函數(shù)的? this是通過函數(shù)參數(shù)的首參數(shù)來傳遞的。this指針是在調(diào)用之前生成的。類實例后的函數(shù),沒有這個說法。類在實例化時,僅僅分配類中的變量空間,并沒有為函數(shù)分配空間。自從類的函數(shù)定義完畢后,它就在那兒,不會跑的。 #4:this指針怎樣訪問類中變量的/? 假設(shè)不是類,而是結(jié)構(gòu)的話,那么,怎樣通過結(jié)構(gòu)指針來訪問結(jié)構(gòu)中的變量呢?假設(shè)你明確這一點的話,那就非常好理解這個問題了。 在C++中,類和結(jié)構(gòu)是僅僅有一個差別的:類的成員默認(rèn)是private,而結(jié)構(gòu)是public。 this是類的指針,假設(shè)換成結(jié)構(gòu),那this就是結(jié)構(gòu)的指針了。#5:我們僅僅有獲得一個對象后,才干通過對象使用this指針,假設(shè)我們知道一個對象this指針的位置能夠直接使用嗎? this指針僅僅有在成員函數(shù)中才有定義。因此,你獲得一個對象后,也不能通過對象使用this指針。所以,我們也無法知道一個對象的this指針的位置(僅僅有在成員函數(shù)里才有this指針的位置)。當(dāng)然,在成員函數(shù)里,你是能夠知道this指針的位置的(能夠&this獲得),也能夠直接使用的。 #6:每一個類編譯后,是否創(chuàng)建一個類中函數(shù)表保存函數(shù)指針,以便用來調(diào)用函數(shù)? 普通的類函數(shù)(不論是成員函數(shù),還是靜態(tài)函數(shù)),都不會創(chuàng)建一個函數(shù)表來保存函數(shù)指針的。僅僅有虛函數(shù)才會被放到函數(shù)表中。 可是,既使是虛函數(shù),假設(shè)編譯器能明白知道調(diào)用的是哪個函數(shù),編譯器就不會通過函數(shù)表中的指針來間接調(diào)用,而是會直接調(diào)用該函數(shù)。# 7:這些編譯器怎樣做到的?8:是否能模擬實現(xiàn)? 知道原理后,這兩個問題就非常easy理解了。 事實上,模擬實現(xiàn)this的調(diào)用,在非常多場合下,非常多人都做過。 比如,系統(tǒng)回調(diào)函數(shù)。系統(tǒng)回調(diào)函數(shù)有非常多,如定時,線程啊什么的。舉一個線程的樣例: 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 ); }這里就是定義一個靜態(tài)函數(shù)來模擬成員函數(shù)。也有很多C語言寫的程序,模擬了類的實現(xiàn)。如freetype庫等等。 事實上,實用過C語言的人,大多都模擬過。僅僅是當(dāng)時沒有明白的概念罷了。 如: typedef struct student{ int age; int no; int scores; }Student; void initStudent(Student* pstudent); void addScore(Student* pstudent, int score); ... 假設(shè)你把 pstudent改成this,那就一樣了。它相當(dāng)于: class Student{ public: int age; int no; int scores; void initStudent(); void addScore(int score); }const常量能夠有物理存放的空間,因此是能夠取地址的///this指針是在創(chuàng)建對象前創(chuàng)建. this指針放在棧上,在編譯時刻已經(jīng)確定. 而且當(dāng)一個對象創(chuàng)建后,而且執(zhí)行整個程序執(zhí)行期間僅僅有一個this指針.

轉(zhuǎn)載于:https://www.cnblogs.com/hrhguanli/p/4079890.html

總結(jié)

以上是生活随笔為你收集整理的C++中this指针的使用方法.的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。