c++關於this指標
阿新 • • 發佈:2021-01-02
this指標可以看出c++底層特性
c++中在例項化物件之後
class Test{};
用sizeof(Test)計算類的大小,可以知道只有資料成員的大小,並沒有方法的咋小,因為資料各自儲存,而成員方法共用一份。
那麼每個物件在呼叫發放是怎麼會知道是否是自己的資料成員呢?
this指標使用時機
this指標是由編譯器所造,真實的隱藏在內部。
#include<iostream>
using namespace std;
class test {
public :
void setData(int x)
{
data = x;
}
int getData()
{
return data;
}
private:
int data;
};
int main()
{
test t1;
int value;
t1.setData(3);
value = t1.getData();
cout << value << endl;
return 0;
}
其實在這個程式裡面,就隱藏了this指標,讓我們把這個setData函式變化一下:
void setData(int data)
{
data=data;
}
此時引數名字和資料型別名字一樣,那麼編譯器只會認為是形參給形參賦值,會報錯!
void setData(int data)
[
this->data =data;
}
這樣this->data指的就是當前的data物件,這樣編譯器就不會報錯。
由此看來,this使用:當引數名字和要賦值的資料成員同名時,使用this;
this指向當前物件的本質
在c++編輯器中對於類的編譯順序:
1.先識別類名;
2.再識別所有的資料成員
3.識別方法,並且重寫方法
void setData(int data)
{
this->data=data;
}
t1.setData(8);
這段程式碼裡面是有一個隱藏的引數傳遞,其編譯器改寫的函式如下:
t1.setData(8) ------------------->setData(&t1,8);
void setData(Test *this,int data){}
等同於函式有一個隱式引數,但是程式如果這樣寫會報錯,必須寫成物件呼叫的形式。
c++中就是通過這個this指向當前物件,從而區分了不同物件的資料成員;
沒有結束,請再看下面程式碼:
void setData(int data)
{
this =NULL;
this->data =x;
}
這段程式碼是有問題的,如果萬一不小心this =NULL;此時編譯器將會報錯,編譯根本無法通過。
這兒對這個this的本質進行剖析:
t1.setData(8)---------------->setData(&t1,8);
void setData(Test *const this,int data){}
這個才是this的本質,其const修飾,是常量的,不可修改!
只要物件帶哦用方法,必然會有隱式的函式改寫,這樣this的本質將很清楚。