C this指標原理

2021-10-08 05:17:36 字數 2622 閱讀 1260

概念引出c++的資料和操作也是分開儲存,並且每乙個非內聯成員函式(non-inline member function)只會誕生乙份函式例項,也就是說多個同型別的物件會共用一塊**,c++通過提供特殊的物件指標(this指標)區分呼叫的物件,this指標指向被呼叫的成員函式所屬的物件

this指標概念c++規定,this指標是隱含在物件成員函式內(實際存放於形參中)的一種指標

當乙個物件被建立後,它的每乙個成員函式都含有乙個系統自動生成的隱含指標this,用以儲存這個物件的位址,也就是說雖然我們沒有寫上this指標,編譯器在編譯的時候也是會加上的。

因此this也稱為「指向本物件的指標」,this指標並不是物件的一部分,不會影響sizeof(物件)的結果。

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

this指標本質:

當乙個物件呼叫某成員函式時編譯器會隱式傳入乙個引數, 這個引數就是this指標

this指標中存放的就是這個物件的首位址。

成員函式的其它引數正常都是存放在棧中,而this指標引數則是存放在暫存器中。

this指標永遠指向當前物件成員函式通過this指標即可知道操作的是那個物件的資料。

this指標是一種隱含指標,它隱含於每個類的非靜態成員函式中。

this指標無需定義,直接使用即可。

靜態成員函式內部沒有this指標,靜態成員函式不能操作非靜態成員變數。類的靜態成員函式因為沒有this指標這個引數,所以類的靜態成員函式也就無法呼叫類的非靜態成員變數。

類中定義的非靜態成員函式,編譯器會隱式的新增乙個形參this,在呼叫非靜態成員函式時編譯器會對this傳遞當前物件的位址,所以在函式中就可以使用this指代當前物件

當形參和成員變數同名時為避免命名衝突,可用this指標來區分

當兩個名字相同的變數,其中乙個有確切的**(非本物件)時,另乙個未標註**的同名成員變數,或只有乙個成員變數時,編譯器會隱式的為其新增this指標

在類的非靜態成員函式中可使用return *this返回物件本身(鏈式程式設計)

this是指向物件的指標(*this)則是物件本身,函式中使用return返回(*this)即返回該物件本身,可以繼續呼叫該物件方法或成員屬性

注意,當以值的方式(函式返回物件型別而不是物件引用型別)時,將會觸發拷貝構造,函式將會返回乙個重新開闢的物件,該物件與返回的物件成員相同

類中定義的非靜態成員函式,編譯器會隱式的新增乙個形參this,在呼叫非靜態成員函式時編譯器會對this傳遞當前物件的位址,所以在函式中就可以使用this指代當前物件

當宣告乙個為空(null)的物件指標,雖然該指標沒有指向任何空間,但是編譯器還是會為其新增this指標,只是該this指標也為空,當使用該空指標呼叫成員函式時,若函式中並沒有使用到this指標(沒有用到物件成員屬性和this指標),該函式呼叫將可以實現

mutable關鍵字mutalbe的中文意思是「可變的,易變的」,跟constant(既c++中的const)是反義詞。

在c++中,mutable也是為了突破const的限制而設定的,被mutable修飾的變數,將永遠處於可變的狀態,即使在乙個const函式中。

當成員變數型別符前用mutable修飾時,成員屬性在常函式中將可以進行修改操作

常函式( const修飾成員函式)當使用const修飾的成員函式時,const關鍵字會修飾函式中this指標指向的記憶體區域,此時成員函式體內將不可以修改本類中的任何普通成員變數

this在函式中是無法改變的,他被宣告為const型別,如person * const this;,但雖然this無法修改(即物件無法被修改)物件的屬性還是可以被修改,所以還需要使用const修飾this將其指向的成員也無法被修改

語法:將const關鍵字放置在函式定義形參的()後函式體{}前即可

常物件(const修飾物件)宣告時使用const關鍵字修飾的物件被稱為常物件

被const修飾的物件(常物件)將無法修改其內部未被mutable修飾的成員屬性,且無法呼叫非const函式(常函式)(不確定函式中是否對屬性進行修改)

常物件只能呼叫const的成員函式

常物件可訪問 const 或非 const 資料成員,而不能對資料成員進行修改,除非成員用mutable修飾

this指標 C this指標

this 是 c 中的乙個關鍵字,也是乙個 const 指標,不可以更改指向。指向當前物件,通過它可以訪問當前物件的所有成員。include includeusing namespace std class girlfriend void introduce introduce函式在編譯器看來是這個...

c this 指標詳解

首先來觀察一段 class myclass int data const void tmyclass 我們知道類的成員函式在記憶體只有乙份拷貝,而類的資料成員 不考慮靜態成員 是每個物件都有自己的乙份,所以上述 中obj1和obj2呼叫data函式是同乙個函式,但它們擁有各自的資料,所以輸出結果為0...

c this指標總結

1 限定被相似的名稱隱藏的成員 public class thisname public void getthisname string name,int num 2 將物件作為引數傳遞到別的方法中 public class thisff public string shuju public voi...