this指標 新標準c 程式設計

2021-09-08 07:45:45 字數 1961 閱讀 8189

背景:

c++是在c語言的基礎上發展而來的,第乙個c++的編譯器實際上是將c++程式翻譯成c語言程式,然後再用c語言編譯器進行編譯。c語言沒有類的概念,只有結構,函式都是全域性函式,沒有成員函式。翻譯時,將class翻譯成struct、物件翻譯成結構變數是顯而易見的,但是對類的成員函式應該如何翻譯?對「my.modify();」這樣通過乙個物件呼叫成員函式的語句,又該如何翻譯呢?

c語言只有全域性函式,因此成員函式只能被翻譯成全域性函式;「my.modify();」這樣的語句也只能翻譯成普通的呼叫全域性函式的語句。那如何讓翻譯後的modify全域性函式還能作用在my這個結構變數上呢?答案是引入「this指標」。

示例:

下面來看一段c++程式到c程式的翻譯。

c++程式:

class ccar;

void ccar::setprice(int p)

int main()

翻譯後的c程式:

struct ccar;

void setprice(ccar* this,int p)

int main()

可以看出,類被翻譯成結構體,物件被編譯成結構變數,成員函式被翻譯成全域性函式。但是c程式的全域性函式setprice比c++的成員函式setprice多了乙個引數,就是「ccar*this」。「car.setprice(20000);」被翻譯成「setprice(&car,20000);」,後者在執行時,this形參指向的正是car這個變數,因而達到了setprice函式作用在car變數上的效果。

this指標的作用:

實際上,現在的c++編譯器從本質上來說也是按上面的方法來處理成員函式和對成員函式的呼叫的,即非靜態成員函式實際上的形參個數比程式設計師寫的多乙個。多出來的引數就是所謂的「this指標」。這個」this指標「指向了成員函式作用的物件,在成員函式執行的過程中,正是通過「this指標」才能找到物件所在的位址,因而也就能找到物件的所有非靜態成員變數的位址。

示例:

#incldueusing namespace std;

class a

程式的輸出結果是:

hello

在上面的程式中,p明明是乙個空指標,但它還是能正確呼叫a的成員函式hello,因為,參考上面c++到c程式的白泥臆,「p->hello()」實質上應該是「hello(p)」,在翻譯後的hello函式中,cout語句沒有用到this指標,因此依然可以輸出結果。如果hello函式中有對成員變數的訪問,則程式就會出錯。

this指標的使用:

c++規定,在非靜態成員函式內部可以直接使用this關鍵字,this就代表指向該函式所作用的物件的指標。

示例:#includeusing namespace std;

class a

a addone()

};int main(){

a c1(1,1),c2(0,0);

c2=c1.addone();

cout《輸出為 2,1

第9行,this指標的型別是a*。因為this指標就指向函式所作用的物件,所以this->real和real是完全等價的。「*this」代表函式所作用的物件,因此執行第16行,進入addone函式後,「*this」實際上就是c1。因此c2的值會變得和c1相同。

注意:

因為靜態成員函式並不作用於某個物件,所以在其內部不能使用this指標。

新標準c++程式設計

**請註明出處

posted @

2017-10-29 00:01

ff_d 閱讀(

...)

編輯收藏

封閉類 新標準c 程式設計

封閉類 乙個類的成員變數如果是另乙個類的物件,就稱之為 成員物件 包含成員物件的類叫封閉類。includeusing namespace std class a class b b是乙個封閉類,生成封閉類物件的語句一定要讓編譯器能夠弄明白其成員物件的是如何初始化的,否則就會編譯錯誤。封閉類的初始化 ...

讀《新標準C 程式設計》總結

引數的預設值 引數的預設值可以在函式宣告的時候寫,或者在定義的時候寫,但是不能兩處都寫 函式傳入引數的介面 傳入引數的介面一般為const 型別名 根據是否改變引數值決定加不加const 內聯函式 內聯函式的使用需要滿足該函式呼叫多次 記憶體小 內聯函式的宣告和定義要寫在一起 struct與clas...

C 新標準之std ratio

概覽 std ratio定義在檔案中,提供了編譯期的比例計算功能。為std chrono duration提供基礎服務。類定義std ratio是乙個模板類,關鍵 摘錄如下 格式有調整 template 1 struct ratio 第乙個引數 nx代表了分子,第二個引數 dx代表了分母。num是計...