深入淺出c++之---this指針


前言:C語言中的數組指針和指針數組

數組指針,是指向數組的指針的縮寫;指針數組,是存放指針的數組的縮寫。其實很多時候,往往因為簡寫和縮寫帶給我們很多困惑。我曾想過不用簡稱去學習,但在很多時候,我們查詢的書籍文檔和文章中還是會頻頻出現這樣的簡稱,所以有必要扣一下字眼了。

1     int *p[3];//[]優先級大於*,所以p是一個數組,數組中存放3個指向int的指針,這也就是指針數組。
2     int (*p1)[3];//先看括號,p1是一個指針,指向一個數組,數組的類型為int,這也就是數組指針。

無論在《c和指針》還是《Effective C++》中,對於這樣稍微復雜一點的表達式進行解釋的時候,都告訴我們先從變量名開始讀,然后看變量名緊跟的運算符的優先級,即可完成解讀。那么這和this指針有什么關系呢?關系就在於簡稱。

引用c++ primer中文版第五版上的原話:常量指針(const pointer)!當我第一次讀到這里的時候,就覺得怪怪的,常量指針到底是指向常量的指針還是指針本身是常量?(這一點尤為重要)很明顯,根據英文const pointer顯示作者想要表達的是這個指針是一個常量,也就是 T * const pointer,作為c語言的后續語言,我想在簡稱的時候也應該和c保持一致,const pointer簡稱為指針常量更好,T * const pointer 先找變量名pointer,往左讀,const證明是常量,讀完表達式,pointer指針是常量,簡稱指針常量更可取,為什么呢?

數組指針,強調了這是一個指針,指向數組;

指針數組,強調了這是一個數組,數組里面存的指針。

那么同理的話,常量指針,強調這是一個指針,指向常量;

指針常量,強調常量,表示這個指針是常量即const pointer。

當然這是我個人從c過度而來並根據《c和指針》&&《Effective C++》上的習慣,你也可以像書上一樣的簡稱,只要你明白具體的意思。但是最好使用的簡稱能快速反應出具體事實。就此,我認為該書此處釋義有待商榷。

說完前言,回到正題------this指針。

引用c++ primer上的例子:

1  struct Sales_data{
2      std::string isbn() const {return bookNo}
3      ......
4      std::string bookNo;
5  };

isbn函數時如何獲得bookNo成員所依賴的對象的呢?

例如我們定義一個:Sales_data   total;

然后 total.isbn();當我們調用成員函數時,實際上是在替某個對象調用它。成員函數通過一個名為this的隱式參數來訪問調用它的那個對象。當我們在isbn函數中返回bookNo的時候,其實隱式執行了this->bookNo, 即total.bookNo。this顧名思義,就是“這個”的意思,誰來調用成員函數,this就指向誰的指針。

total.isbn(); 編譯器等價地認為:Sales_data:: isbn(&total);編譯器負責把total的地址傳遞給isbn的隱式形參this。在成員函數內部,我們可以直接使用調用該函數的對象的成員,而無需通過成員訪問符來做到這一點,因為this正是指向這個對象的。this形參是隱式的,任何自定義名為this的參數或者變量的行為都是非法的。因為this的目的總是指向“這個”對象, 所以this是一個常量指針 (這是書上原話,而經過我剛才的前言,這里改為指針常量更合適) 。 即,this是一個指針常量。這樣理解后面的就輕松多了。

在上面的例子中,this的類型是Sales_data * const。盡管this是隱式的,但它也必須遵守初始化規則,默認情況下我們不能把this綁定到一個常量對象上。c++中的做法是把const關鍵字放在成員函數的參數列表之后,此時緊跟在參數列表后面的const表示this是一個指向常量的指針。這樣的函數也叫常量成員函數。即加了const在參數列表之后,this此刻的類型為const Sales_data *const。

到這里,以后自己寫成員函數的時候就不會那么模糊了,首先明確this是一個指針,它本身是個常量,要想把一個常量綁定給this,我們需要把這個this指針限定為常量指針(指向常量的指針)。那么,以后自己寫成員函數時,就把它當做一個普通指針一樣對待,那么,this將不再迷糊。不需要指向常量就不在參數列表后加const,需要就加上const。

NOTE:

即使bookNo定義在isbn之后,isbn還是可以使用bookNo,編譯器分兩步處理類,首先編譯成員的聲明,然后才輪到成員函數體(如果有的話)。因此,成員函數體可以隨意使用類中的其他成員而無須在意成員出現的次序。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM