【C++】類和物件(3)—>> this指標
一、this指標的引入
我們在現實中,定義一個類都是根據一個需求來定義的。所以先來看一個常用的日期類 Date 。
class Date { public: void Print() { cout << _year << "-" << _month << "-" << _day << endl; //等價於cout << this->_year << "-" << this->_month << "-" << this->_day << endl; } void Init(int year, int month, int day) { _year = year; _month = month; _day = day; } private://封裝起來不允許隨便修改 int _year;//年 //用_區分成員變數和引數 int _month;//月 int _day;//日 }; int main() { Date d1; d1.Init(2018, 11, 11);//用Init函式初始化來間接修改值 d1.Print(); Date d2; d2.Init(2019, 2, 4); d2.Print(); //d2 - d1;//不能執行,因為這個類是我們自己定的規則,所以編譯器不懂這個“-”的真正意義 system("pause"); return 0; }
對於上述類,有這樣的一個問題:
Date類中有 Init 與 Print 兩個成員函式,函式體中沒有關於不同物件的區分,那當s1呼叫 Init 函式
時,該函式是如何知道應該設定s1物件,而不是設定s2物件呢?
C++中通過引入this指標解決該問題,即:C++編譯器給每個“成員函式“增加了一個隱藏的指標引數,讓該指
針指向當前物件(函式執行時呼叫該函式的物件),在函式體中所有成員變數的操作,都是通過該指標去訪
問。只不過所有的操作對使用者是透明的,即使用者不需要來傳遞,編譯器自動完成。
二、this指標的特徵
1. this指標的型別:類的型別* const
2. 只能在“成員函式”的內部使用
3. this指標本質上其實是一個成員函式的形參,是物件呼叫成員函式時,將物件地址作為實參傳遞給this形參。所以物件中不儲存this指標。
4. this指標是成員函式第一個隱含的指標形參,一般情況由編譯器通過ecx暫存器自動傳遞,不需要使用者傳遞
Q1:那麼 this指標 存在哪裡?
this指標是一個形參,所以它存在棧上。
Q2:this指標可以為空嗎?
class Date { public: void Print() { cout << _year << "-" << _month << "-" << _day << endl; } void Show() { cout << "Show()" << endl; } void Init(int year, int month, int day) { _year = year; _month = month; _day = day; } private://封裝起來不允許隨便修改 int _year;//年 //用_區分成員變數和引數 int _month;//月 int _day;//日 }; int main() { Date* p = NULL; p->Print(); p->Show(); system("pause"); return 0; }
在這裡,我們可以看到,它是可以編譯通過的,但是執行不了,實際上已經崩潰了。作為一個空指標,只要不被解引用就不會出問題。
所以說this指標可以為空,當我們在呼叫函式的時候,如果函式內部並不需要使用到this,也就是不需要通過this指向當前物件並對其進行操作時才可以為空(當我們在其中什麼都不放或者在裡面隨便列印一個字串),如果呼叫的函式需要指向當前物件,並進行操作,則會發生錯誤(空指標引用)就跟C中一樣不能進行空指標的引用。
空指標引用 ----> https://blog.csdn.net/Miss_Monster/article/details/86170625