1. 程式人生 > 其它 >C++:07---this指標

C++:07---this指標

技術標籤:指標pythonjava程式語言

一、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]越界了,找不到物件,從而報錯