關於靜態的說明:
1.類中的靜態成員是所有物件共享的,所以不能在靜態方法裡面訪問非靜態元素
2.類中的非靜態成員,可以訪問類的靜態成員和類的非靜態成員
要想理解this指標和靜態屬性的關係,需要先了解c++記憶體的分配方式
乙個由c/c++編譯程式占用記憶體分為以下幾個部分:
棧區(stack): 由編譯器自動分配和釋放,存放函式引數值,區域性變數值,返回位址等。操作方式類似於資料結構中的 棧 。棧記憶體分配時的運算 內置於處理器指令集中,效率很高但分配記憶體的容量有限(vc6下,預設的棧空間大小為1m)
堆區(heap): 一般由程式設計師進行分配和釋放 ,亦稱動態的記憶體分配,如果程式設計師不進行釋放,程式結束時可能由os**,程式在執行時用malloc
或new
申請任意多少的記憶體,程式設計師自己負責在何時用free
或delete
釋放記憶體。動態記憶體生存週期由我們決定,使用非常靈活但問題繁多 ,與資料結構中的 堆 是兩個概念,分配方式類似於鍊錶(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等等。這樣就像變...