1. 程式人生 > 其它 >c++關於this指標

c++關於this指標

技術標籤:c++指標

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的本質將很清楚。