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

前言:C語言中的數組指針和指針數組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指針是常量,簡稱指針常量更可取,爲何呢?學習

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

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

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

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

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

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

引用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,編譯器分兩步處理類,首先編譯成員的聲明,而後才輪到成員函數體(若是有的話)。所以,成員函數體能夠隨意使用類中的其餘成員而無須在乎成員出現的次序。

相關文章
相關標籤/搜索