類和物件(6)--this指標
阿新 • • 發佈:2021-01-10
類和物件--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