1. 程式人生 > 其它 >類和物件(6)--this指標

類和物件(6)--this指標

技術標籤:# 類和物件c++指標

類和物件--this指標

1 this 指標

this指標指向被呼叫的成員函式所屬的物件

1.1 this 指標的工作原理

c++類中成員物件和成員函式是分開儲存的(資料和操作是分開儲存的),並且每一個非內聯成員函式只會誕生一份函式例項,也就是說多個同類型的物件會共用一塊程式碼。
在這裡插入圖片描述

問題:這一塊程式碼是如何區分那個物件呼叫的,使用那一份資料??


解決辦法:c++通過提供特殊的物件指標–this指標,來解決上述問題。this指標指向被呼叫的成員函式所屬的物件。

c++規定,this指標是隱含在物件成員函式的一中指標。當一個物件被建立後,它的每一個成員函式都含有一個系統自動生成的隱含this指標,用以儲存這個物件的地址,也就是說,雖然我們沒有人為的寫上this指標,編譯器在編譯的時候也是會加上的。因此this指標也稱為“指向本物件的指標”,this指標並不是物件的一部分,不會影響sizeof(物件)的結果。

this指標是c++實現封裝的一種機制,它將物件和呼叫物件的成員連線在一起,在外部看來,每一個物件都擁有自己的函式成員。

一般情況下,並不寫this指標,而是讓系統進行預設設定。

this指標永遠指向當前物件

成員函式通過this指標即可知道操作那個物件的資料。this指標是一種隱含指標,它隱含於每個類的非靜態成員函式中。this指標無需定義,直接使用即可。

注意:靜態成員函式內部沒有this指標,靜態成員函式不能操作非靜態成員變數。

2 this 指標的使用(用途)

解決名稱衝突

#include <iostream>
using namespace std;

class Person
{
public:
    Person(int age)
    {   
        this->age = age;	// this指標解決名稱衝突問題
    						// 如果此處不加this指標結果將不是預期結果,各位可以試一下
    }   					
    int age;
};

int main()
{
    Person p
(10); cout << "p.age = " << p.age << endl; return 0; }

3 this 指標–鏈式程式設計

*this 的本體是物件本身

#include <iostream>
using namespace std;

class Person
{
public:
    Person(int age)
    {   
        this->age = age;
    }   

    // 注意此處返回值是引用
    // 如果此處返回值不是引用,將會呼叫拷貝構造,將會創建出一個臨時的類物件,再操作返回的物件將是對臨時的類物件進行操作,而不是操作原始的類物件(呼叫此函式的物件)。
    Person& addAge(const Person &obj)
    {   
        this->age += obj.age;
        return *this;   // *this 的本體是物件本身
    }   
    int age;
};

int main()
{
    Person p(10);
    Person p1(20);

    // 鏈式程式設計
    p.addAge(p1).addAge(p1).addAge(p1);
    cout << p.age << endl;

    return 0;
}

輸出結果為70