C this指標與靜態屬性的關係

2021-10-09 13:48:34 字數 3465 閱讀 2469

關於靜態的說明:

1.類中的靜態成員是所有物件共享的,所以不能在靜態方法裡面訪問非靜態元素

2.類中的非靜態成員,可以訪問類的靜態成員和類的非靜態成員

要想理解this指標和靜態屬性的關係,需要先了解c++記憶體的分配方式

乙個由c/c++編譯程式占用記憶體分為以下幾個部分:

棧區(stack): 由編譯器自動分配和釋放,存放函式引數值,區域性變數值,返回位址等。操作方式類似於資料結構中的 棧 。棧記憶體分配時的運算 內置於處理器指令集中,效率很高但分配記憶體的容量有限(vc6下,預設的棧空間大小為1m)

堆區(heap): 一般由程式設計師進行分配和釋放 ,亦稱動態的記憶體分配,如果程式設計師不進行釋放,程式結束時可能由os**,程式在執行時用mallocnew申請任意多少的記憶體,程式設計師自己負責在何時用freedelete釋放記憶體。動態記憶體生存週期由我們決定,使用非常靈活但問題繁多 ,與資料結構中的 堆 是兩個概念,分配方式類似於鍊錶(32位系統下,堆記憶體空間可以達到4g)

全域性區(靜態區)(static): 全域性變數和靜態變數儲存是存放在一塊的,初始化過的全域性變數和靜態變數為乙個區域,未進行初始化的全域性變數和靜態變數在另一塊相鄰的區域.全域性區的內存在程式結束後由系統釋放(初始化過的變數釋放到data區,未初始化的變數分配到bbs區)

文字常量區: 常量字串就是放在這裡,程式結束後由系統釋放到coment區

程式**區: 存放函式體二進位制**,存放在code區

回顧一下什麼是this指標:

this指標是類的乙個自動生成的並自動隱藏私有成員(privite),它存在於類的非靜態成員函式中,this指標指向被呼叫函式所在的物件的位址

也就是說,當乙個物件被建立,該物件內便會自動生成乙個this指標成員,其為私有成員且自動隱藏,生成後便自動指向物件資料的首位址

#include

#include

using

namespace std;

class

point

void

movepoint

(int a,

int b)

void

print()

};//?類外宣告靜態變數 (要使用靜態變數和靜態成員函式 必須分配記憶體和初始化)

int point::count =0;

int point::staticnum=0;

intmain()

//todo即可知道,point1呼叫該函式後,也就是point1的資料成員被呼叫並更新了值

point1.

print()

;//todo在任何乙個方法裡都可以使用this指標。c++物件是一種特殊的結構 是除了變數還包含一些函式的特殊結構

//todo這些位址都可以通過指標來進行訪問,而this指標一定儲存著物件本身的位址,每呼叫乙個方法,this指標都會隨著提供的輸入引數被秘密的傳遞給那個方法

//正是因為如此,我們才能在方法裡像使用乙個布局變數那樣使用this指標

//todo因為靜態成員和靜態方法不是屬於某個特定的物件,而是由全體物件共享的,這就意味著它們無法訪問this指標,所以,我們才無法在靜態方法裡訪問非靜態的類成員(變數和方法)

//如果需要訪問非靜態的類成員 則需要this指標來訪問

//todo在使用靜態屬性時,必須為它們分配記憶體。具體做法很簡單,只要在類宣告的外部對靜態屬性進行宣告即可(類似於宣告乙個變數)

point point2(20

,20);

point2.

print()

;return0;

}

當物件point1呼叫movepoint(2,2)函式時,此時point物件的位址也傳遞給你了this這個指標,movepoint函式的原型事實上應是:

void movepoint(point *

this

,int a,

int b);

引數列表中的第乙個引數是指向該類物件的乙個指標,我們在定義成員函式時沒看見是因為這個引數在類中是隱含的,此時,point1的位址傳遞給了this,所以在movepoint函式中便可以顯式的寫成:

void

movepoint

(int a,

int b)

即可以知道,point1呼叫該函式後,也就是point1的資料成員被呼叫(呼叫值-類成員x,y) 並 更新了值(更新值-movepoint函式中的a,b)

程式結果:

總結和注意:?

任何乙個方法(包括構造器函式)都可以使用this指標獲取物件的位址

,從本質上講,c++中的物件其實是一種特殊的結構(是一種除了變數還包含函式的特殊的結構)

在程式正在執行時,物件的屬性(變數)和方法(函式)都是儲存在記憶體中,且各自都有與之相關聯的位址,這些位址都可以通過指標來進行訪問,而最重要的this指標儲存著物件本身的位址

每呼叫乙個方法的時候,this指標都會隨著你提供的輸入引數被秘密的傳遞給這個方法,正因為如此,我們才能在方法(成員函式)裡像使用乙個區域性變數那樣使用this指標

由於靜態方法不是屬於某個特定的物件,而是由全體物件共享,這就意味靜態方法不可能有個固定的位址來索引某個物件,也就是說靜態方法無法訪問this指標,而非靜態成員需要用this指標來訪問自己屬於的物件,這就是為什麼我們無法在靜態方法裡訪問非靜態成員的原因

靜態屬性和靜態方法2以及this指標的又一些說明?

C this指標的理解

先要理解class的意思。class應該理解為一種型別,象int,char一樣,是使用者自定義的型別。雖然比int char這樣build in型別複雜的多,但首先要理解它們一樣是型別 用這個型別可以來宣告乙個變數,比如int x,myclass my等等。這樣就像變數x具有int型別一樣,變數my...

C this指標的理解

先要理解class的意思。class應該理解為一種型別,象int,char一樣,是使用者自定義的型別。雖然比int char這樣build in型別複雜的多,但首先要理解它們一樣是型別 用這個型別可以來宣告乙個變數,比如int x,myclass my等等。這樣就像變數x具有int型別一樣,變數my...

C this指標的理解

本文引自 feiyond的文章 先要理解class的意思。class應該理解為一種型別,象int,char一樣,是使用者自定義的型別。雖然比int char這樣build in型別複雜的多,但首先要理解它們一樣是型別 用這個型別可以來宣告乙個變數,比如int x,myclass my等等。這樣就像變...