struct person
;void setpersoninfo(person* p,char* name, char*gender, int age)
void printperson(person* p)
從上述c語言**中我們可以看出,函式如果要操縱類物件,必須要將類物件的資訊給進來,為了節省空間,傳遞了該物件的位址。
實際上,在c++類中的成員函式實現方式和上述類似,(非靜態)成員函式也有乙個隱藏的指標,指向了呼叫函式的物件本身。這個指標就叫做:this指標。
class person
void printperson()
private:
char _name[20];
char _gender[3];
int _age;
};int main()
在上述**中,我們用person類建立了三個物件s1,s2,s3,然後分別呼叫setpersoninfo函式來設定每個物件裡面的具體資訊。
但是我們發現每個物件只用來儲存資料資訊,**和資料分開來儲存並且只儲存了乙份,從函式形式來看,setpersoninfo函式只有乙份(如下圖所示)並且函式中沒有區分不同物件的標誌,為什麼當s1呼叫函式時,函式就知道是s1呼叫而不是其他函式呢?
這就要引入c++中的下乙個知識點–this指標。
this指標:
1.主要作用:
,當在類的非靜態成員函式中訪問類的非靜態成員的時候,編譯器會自動將物件本身的位址作為乙個隱含引數傳遞給函式。
this指標是類的乙個自動生成、自動隱藏的私有成員,它存在於類的非靜態成員函式中,指向被呼叫函式所在的物件。
全域性僅有乙個this指標,當乙個物件被建立時,this指標就存放指向物件資料的首位址。
2.如何使用:
(1)在類的非靜態成員函式中返回類物件本身的時候,直接使用 return *this
(2)當引數與成員變數名相同時使用this指標,如this->n = n (不能寫成n = n)
3.this指標特性:
4._thiscall呼叫約定:
5.this指標是否可以為空?
class myclass
void print()
};
void main()
看上面的這段**,似乎很詭異。 用乙個空指標呼叫成員函式,簡直是天大的錯誤,可以遺憾的是,卻是可行的,至少對於上面的這段程式來說,不會照成錯誤。
為什麼?
在類初始化的時候,編譯器會將它的函式分配到類的外部,當然這也包括靜態成員函式,這樣的做法,主要是為了節約記憶體,這也是為什麼靜態函式可以在物件初始化之前執行的原因。
大家知道,每個物件,都有乙個指向自己的this指標,這個指標的值,將會因為物件的不同而不同,它的作用主要就是用來區分不同的物件,這樣你就可以根據它來訪問不同的物件的成員變數。
編譯器編譯後的成員函式的第乙個引數是this指標,通過this指標引用資料成員及呼叫其它成員函式。
main函式中的hello函式並沒有使用類中的任何成員變數,所以,它也就不會用到this指標,此時的this指標是null。由於你呼叫的成員函式沒有使用到類的資料成員,所以即使傳入的this指標為空,從而我們就可以沒有障礙的使用hello函式,然而相對的是,如果你在pmy->hello()之後接著呼叫pmy->print(),那麼將會報空指標錯誤,因為這個函式試圖用this指標訪問成員變數i。
結論:
1)null物件指標可以呼叫成員函式
2)通過物件呼叫成員函式,物件的指標會被傳入函式中,指標名稱為this
3)null物件指標呼叫成員函式時,只要不訪問此物件的成員變數,則程式正常執行
4)null物件指標呼叫成員函式時,一旦訪問此物件的成員變數,則程式崩潰
C 中的this指標
當乙個成員函式被呼叫時,自動向它傳遞乙個隱含的引數,該引數是乙個指向接 受該函式的呼叫的物件的指標,在程式中可以使用關鍵字this指標來引用改制鎮,因此稱該指標為this指標。this指標是c 實現封裝的一種機制,它將成員和用於操作這些成員的成員函式聯絡在一起。例如 location類的成員函式in...
C 中的this指標
1.this 指標的引入 每個成員函式 static函式外 都有乙個額外的隱含的this指標,乙個類物件在條用成員函式時this指標初始化為呼叫函式物件的位址。例1 sales item.h class sales item sales item.cpp bool sales item same i...
C 中的指標
在學習c c 過程中,指標是乙個比較讓人頭痛的問題,稍微不注意將會是程式編譯無法通過,甚至造成宕機。在程式設計過程中,指標也往往是產生隱含bug的原因。下面就來談談指標的應用以及需要注意的一些問題,裡面也許就有你平時沒有注意到的問題,希望能幫助各位讀者理解好指標。一 我們先來回憶一下指標的概念吧,方...