靜态資料成員:
它被編譯器提出于class之外,并被視為一個global變量(但隻在class生命範圍之内可見)
每個靜态資料成員隻有一個實體,存放在程式的資料段之中,
經由’.’運算符,對一個靜态資料成員進行存取操作,隻是文法上的一種便宜行事而已。靜态資料成員其實并不在class object之中,是以存取它并不需要通過class object。
雖然你可以不靠class object 來存取一個靜态成員,但其存取函數卻得綁定于一個class object之上。(若靜态成員的通路控制為protected或private,則必須通過存取函數來通路)
【注意:】類的靜态資料成員,必須要在全局下進行定義,然後才能使用。
無論它的通路控制是什麼,必須在main函數之前,對靜态資料成員定義。
例如:int A::staVal = 0 ;
否則,編譯器會報錯:未定義的引用。
因為編譯器把涉及靜态資料成員的使用,都轉換為直接使用,而靜态成員在class中聲明,外部無法看見。故需要在外部進行定義,使其後的代碼可見。
成員函數的處理:
C++的設計準則之一:非靜态成員函數至少和一般的外部函數有相同的存儲效率。
C++編譯器會把成員函數内化為一般的函數:
①改寫函數原型,安插一個額外的參數this指針。用以提供一個存取管道,使類對象得以調用該函數。
int A::foo (A* const this)
若該成員函數是const,則變成:
int A::foo (const A* const this)
②對函數體中 類對象的非靜态資料成員的存取操作,改為經由this指針來存取。
{ return this->val ; }
③将成員函數重新寫成一個外部函數,對函數名稱進行處理,使它在程式中成為獨一無二的。
以上的轉換操作結束之後,每個調用操作都要轉換。
靜态成員函數:
靜态成員函數的主要特征是它沒有this指針。
故其:
①它不能夠直接存取其class中的非靜态成員
②它不能夠直接被聲明為const、virtual
③它不需要經由class object才被調用——雖然大部分時候它是這樣被調用的。
本文轉自lzwxx 51CTO部落格,原文連結:http://blog.51cto.com/13064681/1943457