日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
詳解C++this指針

this指針是存在與類的成員函數(shù)中,指向被調(diào)用函數(shù)所在的類實例的地址。一個對象的this指針并不是對象本身的一部分,不會影響sizeof(對象)的結(jié)果。this作用域是在類內(nèi)部,當在類的非靜態(tài)成員函數(shù)中訪問類的非靜態(tài)成員的時候,編譯器會自動將對象本身的地址作為一個隱含參數(shù)傳遞給函數(shù)。

img

先直接給出一個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非成員函數(shù)接口
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&);

類的所有成員都必須在類內(nèi)部聲明,但是成員函數(shù)體可以定義在外部,比如我們上面寫的Sales_data類,isbn函數(shù)定義在了內(nèi)部,combine和avg_price函數(shù)定義在了外部

定義在類內(nèi)部的函數(shù)是隱式的inline函數(shù)

inline函數(shù),即為調(diào)用時“內(nèi)聯(lián)地”展開的函數(shù),也就是就說:調(diào)用時,并不通過函數(shù)調(diào)用的機制,而是通過將函數(shù)體直接插入調(diào)用處來實現(xiàn)的,比如以下調(diào)用

inline const string &
cout 

”this“的概念#

我們先看isbn函數(shù)

std::string isbn() const { return bookNo; }

它的參數(shù)列表為空,返回一個string對象,那它是怎么知道這個string對象是來自哪個類的?

this

先看一個調(diào)用的例子

total.isbn() 當我們調(diào)用成員函數(shù)時,實際上是在替某個對象(這里是total)調(diào)用它,isbn指向Sales_data的成員(bookNo),則它隱式地指向調(diào)用該函數(shù)的對象的成員

在total.isbn()調(diào)用中,isbn返回bookNo時,實際上它隱式地返回total.bookNo

成員函數(shù)isbn又通過一個名為this的額外的隱式參數(shù)來訪問調(diào)用它的那個對象(this其實就是指向當前對象的指針),當我們調(diào)用一個成員函數(shù)時,用該函數(shù)的對象地址初始化this,this就會指向當前對象

例如調(diào)用total.isbn()則編譯器負責把total的地址傳遞給isbn的隱式形參this,可以等價地理解為編譯器將該調(diào)用重寫成了以下形式

std::string isbn() const { return this->bookNo }

因為this的目的總是指向”這個“對象,所以this是一個常量指針(這是一個頂層const,this指針本身就是常量)

isbn() const#

首先你要知道const的基本用法,頂層cosnt和底層const如何區(qū)別,建議先閱讀這篇文章,下面這幾行代碼方便你回憶起頂層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是一個對常量的引用

好進入正題

先講結(jié)論:”isbn() const里的const的作用是修改隱式this指針的類型

首先我們忘掉isbn,默認情況下,this的類型是指向類類型的 非常量版本的 常量指針(這是一個頂層const,this指針自己是常量,但是它所指向的對象并不是常量),在Sales_data的成員函數(shù)中,this的默認類型是Sales_data* const

盡管this是隱式的,但也遵循初始化規(guī)則,所以默認情況下我們不能把this直接綁定到一個常量對象上,同時也不能在一個常量對象上調(diào)用普通的函數(shù)成員(需要用到this)

具體來說,如果,我是說如果,如果isbn是一個普通函數(shù)沒有const,this也是一個普通的指針,isbn內(nèi)不會改變this所指的對象(只是返回bookNo),則我們應(yīng)該把this聲明成const Sales_data* const,所以把this設(shè)置為指向常量的指針可以提高靈活性

然而this隱式的,是不會出現(xiàn)在參數(shù)列表中的,所以在哪將this聲明稱指向常量的指針呢?C++的做法就是允許把const關(guān)鍵字放在成員函數(shù)的參數(shù)列表之后,就是我們看到的isbn() const,此時緊跟在參數(shù)列表后面的const表示this是一個指向常量的指針,像這樣使用const的成員函數(shù)常被稱作常量成員函數(shù)

//下面代碼是非法的,只用于說明隱式的this指針如何使用,但我們不能顯式定義this指針 //謹記此處的this是一個指向常量的指針,因為isbn是一個常量成員

std::string Sales_data::isbn(const Sales_data *const this){
   return this->isbn;
}

定義一個返回this對象的函數(shù)#

我們之前在Sales_data內(nèi)聲明了一個combine函數(shù)

Sales_data& combine(const Sales_data&);

現(xiàn)在我們在外部定義這個函數(shù)

Sales_data& Sales_data::combine(const Sales_data &rhs){
   untis_sold += rhs.untis_sold;
   revenue += rhs.revenue;
   return *this;
}

Sales_data::combine使用作用域運算符以說明:我們定義了一個名為combine的函數(shù),并且該函數(shù)聲明在Sales_data類的作用域內(nèi),因此當combine使用untis_sold和revenue時,也是隱式地使用了Sales_data的成員

我們調(diào)用這個combine時

total.combine(trans)

total的地址被綁定到隱式的this參數(shù)上,而rhs綁定到了trans上

你應(yīng)該注意到了,這個函數(shù)的關(guān)注點應(yīng)該在于返回類型和返回語句

combine設(shè)計的初衷是盡量模仿+=運算符,+=把左側(cè)的運算對象當成左值返回,為了盡可能一致,combine必須返回引用類型(這時左側(cè)運算對象是一個Sales_data對象,所以返回類型為Sales_data&)

怎么返回呢,現(xiàn)在我們就不需要使用隱式的this指針訪問函數(shù)調(diào)用者 的某個具體成員,而是需要把調(diào)用函數(shù)的對象當成一個整體來訪問

return *this;

return語句解引用this指針,獲得了執(zhí)行該函數(shù)的對象,total.combine(trans)就會返回對total的引用


分享標題:詳解C++this指針
本文路徑:http://m.5511xx.com/article/cdihcoj.html