C 中的this指標原來是這麼一回事

2021-10-25 03:27:03 字數 2504 閱讀 1102

#include using namespace std;

class student

void printstudent()

private:

char name[20];

char ***[3];

int age;

};int main()

對於以上**,現在有這樣乙個問題,**中的student類,有initstudent和printstudent倆個成員函式,但是函式體中沒有任何關於不同物件的區分,那麼當s1呼叫上述成員函式對自己進行初始化以及列印資訊時,該函式又怎麼知道是對s1這個物件進行操作而不是s2呢?

帶著這個問題,我們先不著急給出答案,由於我們知道,c語言中的結構體和c++中的類非常類似,因此我們不妨先回憶一下對於類似的問題,在c語言中是如何處理的:

#include typedef struct studentstudent;

void initstudent(student *ps, char *n, char *s, int a)

void printstudent(student *ps)

int main()

看到這裡,我們不難回憶起,正是通過給相應的函式傳遞當前結構體變數的位址,才讓對應的函式清楚的知道,當前是在為哪乙個變數進行相關操作,從而準確無誤的對當前傳入的結構體變數進行初始化及資訊列印。

可是說到頭,這只是c語言中的處理方式,而在c++中,我可沒看到**給成員函式傳遞了物件的位址之類的行為啊。但這正是我要說的,其實,對於上述同樣的問題,c++的處理方式和c語言比起來,可以說其實是「換湯不換藥」,c語言通過傳遞當前結構體變數的位址來區分對不同變數的操作,而c++中則通過引入this指標來解決該問題。

什麼意思呢?c++編譯器給每個「非靜態的成員函式「增加了乙個隱藏的指標引數,讓該指標指向當前物件(函式執行時呼叫該函式的物件),在函式體中所有成員變數的操作,都是通過該指標去訪問。只不過所有的操作對使用者是透明的,即使用者不需要來傳遞,編譯器自動完成。

說的直白一點,就是說,在實際呼叫成員函式期間,隱式的傳遞了當前物件的位址,而成員函式的通過隱藏的this指標來接受這個位址從而能夠使成員函式區分不同的物件。

在對this指標的存在的原因及方式有了乙個整體的認識之後,下面再對其特性做乙個簡單的了解:

this指標的型別:類型別 *const

只能在普通的成員函式中使用(如靜態成員函式中不存在this指標)

this指標本質上其實是乙個成員函式的形參,是物件呼叫成員函式時,將物件的位址作為實參傳遞給this形參。所以物件中不儲存this指標。從上述結論可以得出this指標不影響類的大小,即sizeof()的結果。

this指標是成員函式第乙個隱含的指標形參,一般情況由編譯器通過ecx暫存器自動傳遞,不需要使用者傳遞。

在了解了上述特性之後,我們再對一開始給出的那段**做乙個全新的認識,不難理解,編譯器在對上述類進行編譯時會對其成員函式做一定的修改,而這個修改主要就是增加this指標:

class student

/*編譯器修改後

void initstudent(student *const this, char *n, char *s, int a)

*/ void printstudent()

/*編譯器修改後

void printstudent(student *const this)

*/ private:

char name[20];

char ***[3];

int age;

};

最後乙個問題:this指標可以為空嗎?觀察下述**:

class student

void testthis()

void initstudent(char *n, char *s, int a)

void printstudent()

private:

char name[20];

char ***[3];

int age;

};int main()

結論:

當以物件.成員函式()的方式進行呼叫時,this指標不可以為空。因為物件只要存在就不會為空。

當以p->成員函式()的方式進行呼叫時,this指標可以為空,因為最終是將p作為引數傳遞給了成員函式,如果p指向的是nullptr,this指標將來就是nullptr。在不通過其訪問成員變數或成員函式(成員函式中有成員變數)時並不會報錯。

大學原來是這麼美好

人的一生會失去很多東西,有的追逐一生也得不到,有的短暫的擁有卻最終失去!我們一生都在為這些得到與得不到而苦腦 徘徊。我的大學時光也就這樣在揮揮噁噁的荒度了!記得大二時曾看過一部 大學我被你上了 記得當時在圖書館偶然看到這本書的時候,還以為是講一段美妙的大學愛情故事呢,等近不急待的看完了整部 才發現原...

排序演算法原來是這麼排的

常用的排序演算法有以下幾類 插入排序 直接插入排序,希爾排序 選擇排序 簡單選擇排序,堆排序 交換排序 氣泡排序,快速排序 歸併排序,基數排序。排序方法選擇得當與否直接影響程式執行的速度和輔助儲存空間的占有量,進而影響整個軟體的效能。下面對這些演算法一一的介紹他們究竟是怎麼排的。插入排序 直接插入排...

MacBook風扇這麼響,原來是這些細節沒在意!

偶爾會有一點熱量是正常現象 mac可以應付這些熱量。但是,當您一直聽到macbook air風扇的噪音時,您的計算機可能會過熱,這可能是由於您要執行的任務太難使cpu和ram無法處理,或者是因為macbook風扇控制系統無法正常工作。過熱是危險的,因為它本質上是螺旋式下降 cpu和ram變熱,因為它...