您好,登錄后才能下訂單哦!
這篇文章主要介紹了C++的this指針實例分析的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇C++的this指針實例分析文章都會有所收獲,下面我們一起來看看吧。
this指針是存在與類的成員函數中,指向被調用函數所在的類實例的地址。一個對象的this指針并不是對象本身的一部分,不會影響sizeof(對象)的結果。this作用域是在類內部,當在類的非靜態成員函數中訪問類的非靜態成員的時候,編譯器會自動將對象本身的地址作為一個隱含參數傳遞給函數。
先直接給出一個C++Primer里的類,你可能還不能完全看懂,但是不著急,我們一點點解釋
class Sales_data { std::string isbn() const { return bookNo; } Sales_data& combine(const Sales_data&); double avg_price() const; std::string bookNo; unsigned untis_sold = 0; double revenue = 0.0; }; //Sales_data非成員函數接口 Sales_data add(const Sales_data, const Sales_data&); std::ostream& print(std::ostream&, const Sales_data&); std::istream& read(std::istream&, const Sales_data&);
類的所有成員都必須在類內部聲明,但是成員函數體可以定義在外部,比如我們上面寫的Sales_data類,isbn函數定義在了內部,combine和avg_price函數定義在了外部
定義在類內部的函數是隱式的inline函數
inline函數,即為調用時“內聯地”展開的函數,也就是就說:調用時,并不通過函數調用的機制,而是通過將函數體直接插入調用處來實現的,比如以下調用
inline const string & cout
”this“的概念#
我們先看isbn函數
std::string isbn() const { return bookNo; }
它的參數列表為空,返回一個string對象,那它是怎么知道這個string對象是來自哪個類的?
this
先看一個調用的例子
total.isbn() 當我們調用成員函數時,實際上是在替某個對象(這里是total)調用它,isbn指向Sales_data的成員(bookNo),則它隱式地指向調用該函數的對象的成員
在total.isbn()調用中,isbn返回bookNo時,實際上它隱式地返回total.bookNo
成員函數isbn又通過一個名為this的額外的隱式參數來訪問調用它的那個對象(this其實就是指向當前對象的指針),當我們調用一個成員函數時,用該函數的對象地址初始化this,this就會指向當前對象
例如調用total.isbn()則編譯器負責把total的地址傳遞給isbn的隱式形參this,可以等價地理解為編譯器將該調用重寫成了以下形式
std::string isbn() const { return this->bookNo }
因為this的目的總是指向”這個“對象,所以this是一個常量指針(這是一個頂層const,this指針本身就是常量)
isbn() const#
首先你要知道const的基本用法,頂層cosnt和底層const如何區別,建議先閱讀這篇文章,下面這幾行代碼方便你回憶起頂層cosnt
int i = 0; int* const p1 = &i; //p1本身是常量,頂層const const int ci = 42; //ci本身是常量,頂層const const int* p2 = &ci; //*在const之后,p2是指向常量的指針,底層const const int* const p3 = p2; //先看左邊是頂層,再看右邊是底層,p3是指向常量的常量指針 const int& r = ci; //聲明引用的const都是底層const,r是一個對常量的引用
好進入正題
先講結論:”isbn() const里的const的作用是修改隱式this指針的類型
首先我們忘掉isbn,默認情況下,this的類型是指向類類型的 非常量版本的 常量指針(這是一個頂層const,this指針自己是常量,但是它所指向的對象并不是常量),在Sales_data的成員函數中,this的默認類型是Sales_data* const
盡管this是隱式的,但也遵循初始化規則,所以默認情況下我們不能把this直接綁定到一個常量對象上,同時也不能在一個常量對象上調用普通的函數成員(需要用到this)
具體來說,如果,我是說如果,如果isbn是一個普通函數沒有const,this也是一個普通的指針,isbn內不會改變this所指的對象(只是返回bookNo),則我們應該把this聲明成const Sales_data* const,所以把this設置為指向常量的指針可以提高靈活性
然而this隱式的,是不會出現在參數列表中的,所以在哪將this聲明稱指向常量的指針呢?C++的做法就是允許把const關鍵字放在成員函數的參數列表之后,就是我們看到的isbn() const,此時緊跟在參數列表后面的const表示this是一個指向常量的指針,像這樣使用const的成員函數常被稱作常量成員函數
//下面代碼是非法的,只用于說明隱式的this指針如何使用,但我們不能顯式定義this指針 //謹記此處的this是一個指向常量的指針,因為isbn是一個常量成員
std::string Sales_data::isbn(const Sales_data *const this){ return this->isbn; }
定義一個返回this對象的函數#
我們之前在Sales_data內聲明了一個combine函數
Sales_data& combine(const Sales_data&);
現在我們在外部定義這個函數
Sales_data& Sales_data::combine(const Sales_data &rhs){ untis_sold += rhs.untis_sold; revenue += rhs.revenue; return *this; }
Sales_data::combine使用作用域運算符以說明:我們定義了一個名為combine的函數,并且該函數聲明在Sales_data類的作用域內,因此當combine使用untis_sold和revenue時,也是隱式地使用了Sales_data的成員
我們調用這個combine時
total.combine(trans)
total的地址被綁定到隱式的this參數上,而rhs綁定到了trans上
你應該注意到了,這個函數的關注點應該在于返回類型和返回語句
combine設計的初衷是盡量模仿+=運算符,+=把左側的運算對象當成左值返回,為了盡可能一致,combine必須返回引用類型(這時左側運算對象是一個Sales_data對象,所以返回類型為Sales_data&)
怎么返回呢,現在我們就不需要使用隱式的this指針訪問函數調用者 的某個具體成員,而是需要把調用函數的對象當成一個整體來訪問
return *this;
return語句解引用this指針,獲得了執行該函數的對象,total.combine(trans)就會返回對total的引用。
關于“C++的this指針實例分析”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“C++的this指針實例分析”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。