C++:07---this指標
一、this指標介紹
概念:this指標是成員函式的一個隱式引數,在類中本質上就是物件的指標(常量指標)
特點:
在成員函式中可通過this指標區別成員變數與形參變數
this可以顯式呼叫
示例程式碼:
class Cperson { private: int age; float height; public: void InitPerson(int age,float height); }; void Cperson::InitPerson(int age,float height) { this->age=age; this->height=height; }
二、返回*this成員函式
概念:返回值是*this,也就是返回呼叫此成員函式的物件的自身引用,返回值型別為物件引用型別
class Person
{
private:
int age;
public:
Person& setAge(int age);//返回自身引用
};
Person& Person::setAge(int age)
{
this->age=age;
return *this;//返回*this(自身引用)
}
從const成員函式返回*this:如果一個const成員函式返回*this,那麼此函式的返回值型別是常量引用:比如上面的程式碼中的setAge函式變為常量成員函式
const Person& setAge(int age)const;
三、this指標剖析
this指標剖析
對於類成員函式而言,並不是一個物件對應一個單獨的成員函式體,而是此類的所有物件共用這個成員函式體。當程式被編譯之後,此成員函式地址已經確定
我們常說,呼叫類的成員函式時,會將當前物件的this指標傳遞給成員函式:
上面我們說了,一個類的成員函式只定義了一份,所有物件共用這個成員函式體
那麼如何區分哪個物件呼叫此函式呢?這就是this指標的作用,每次物件呼叫成員函式時,將this指標(物件首地址)傳遞給成員函式,然後在函式體內對類的資料成員訪問時,就會被轉換為“this->資料成員”的形式
如果成員函式內部沒有訪問物件的任何資料成員,那麼傳進來的this指標實際沒有任何用處,這樣的函式與全域性函式並沒有太大區別
演示案例
#include <iostream> using namespace std; class MyClass { public: int data; MyClass(int data) { this->data = data; } void print() { //cout<< data << endl; cout << "hello!" << endl; } }; int main() { MyClass *pMyClass; pMyClass = new MyClass(1); pMyClass->print(); pMyClass[0].print(); pMyClass[1].print(); pMyClass[10000000].print(); return 0; }
執行效果如下所示:
結果分析:
此處我們建立了一個物件,但是訪問後面越界之後仍然可以訪問成功
上面我們說過了,如果一個成員函式沒有操作任何類的資料成員,因此這個成員函式與全域性函式型別,呼叫之後都會列印“hello!”
但是如果把14行的程式碼取消註釋會怎麼樣呢?見下面演示案例
程式碼改進
#include <iostream> using namespace std; class MyClass { public: int data; MyClass(int data) { this->data = data; } void print() { //cout<< data << endl; cout << "hello!" << endl; } }; int main() { MyClass *pMyClass; pMyClass = new MyClass(1); pMyClass->print(); pMyClass[0].print(); pMyClass[1].print(); pMyClass[10000000].print(); return 0; }
執行效果如下所示:
結果分析:
此處我們的成員函式訪問了類的資料成員,那麼每次列印資料時都會通過this指標呼叫
但是此處我們只建立了一個物件,所以當呼叫pMyClass[1]和pMyClass[10000000]越界了,找不到物件,從而報錯