類的靜態成員(static)
有時候,類需要它的一些成員與類本身直接相關,而不是與類的各個物件保持關聯。
宣告靜態成員
可以使public/private的,型別可以使常量、引用、指標、類型別等。
classaccount
/*靜態成員函式
*/static
double rate()
static
void rate(double
);private
: std::
string
owner;
double
amount;
/*靜態資料成員
*/static
double
interestrate;
static
double
initrate();
};
物件中不包含任何與靜態資料成員有關的資料。因此,每個account物件將包含兩個資料成員:owner和amount。只存在乙個interestrate成員,而且它被所有account物件共享。
類似的,靜態成員函式也不與任何物件繫結在一起,他們不包含this指標。作為結果,靜態成員函式不能宣告成const的,而且我們不能再static函式體內使用this指標。
使用類的靜態成員
doubler;r=account::rate(); //
使用作用域運算子訪問靜態成員
/*******************************************
*/account ac1;
account *ac2=&ac1;
r=ac1.rate(); //
通過accountd 的物件或引用訪問
r=ac2->rate(); //
通過指向account 物件的指標訪問
雖然靜態成員不屬於類的某個物件,但仍然可以使用類的物件、引用或者指標來訪問靜態成員。
成員函式不用通過作用域運算子就能直接使用靜態成員(把靜態成員看做類內成員就行)。
定義類靜態成員(static關鍵字只出現在類內部宣告)
靜態成員函式:定義可內可外,外部不寫static,外部必須有作用域運算子(和定義在外部的普通成員函式一樣)
靜態資料成員:定義在外,外部不寫static,外部必須有作用域運算子
/*靜態成員函式定義
*/void acount::rate(double
newrate)
/*靜態資料成員定義並初始化
*/double account::interestrate=initrate(); //
注意作用域運算子不能忘
類似全域性變數,靜態資料成員定義在任何函式之外。一旦定義,就一直存在於程式的整個生命週期中。
靜態成員的類內初始化??
通常,類的靜態成員不應該在類的內部初始化。然而,可以為靜態成員提供const整數型別的類內初始值,不過要求靜態成員必須是字面值常量型別的constexpr.
classaccount;//
乙個不帶初始值的靜態成員的定義
constexpr int account::period; //
初始值在類的定義內提供
即使乙個常量靜態成員在類內部被初始哈了,通常情況下也應該在類的外部定義一下該成員。
靜態成員能用於某些場景,而普通成員不能
1.靜態資料成員可以使不完全型別。特別的,靜態資料成員的型別可以使它所屬的類型別。
2.可以使用靜態資料成員作為預設實參。
classscreen
;
C 類靜態成員與類靜態成員函式
當將類的某個資料成員宣告為static時,該靜態資料成員只能被定義一次,而且要被同類的所有物件共享。各個物件都擁有類中每乙個普通資料成員的副本,但靜態資料成員只有乙個例項存在,與定義了多少類物件無關。靜態方法就是與該類相關的,是類的一種行為,而不是與該類的例項物件相關。靜態資料成員的用途之一是統計有...
C 類靜態成員與類靜態成員函式
當將類的某個資料成員宣告為static時,該靜態資料成員只能被定義一次,而且要被同類的所有物件共享。各個物件都擁有類中每乙個普通資料成員的副本,但靜態資料成員只有乙個例項存在,與定義了多少類物件無關。靜態方法就是與該類相關的,是類的一種行為,而不是與該類的例項物件相關。靜態資料成員的用途之一是統計有...
C 類靜態成員與類靜態成員函式
當將類的某個資料成員宣告為static時,該靜態資料成員只能被定義一次,而且要被同類的所有物件共享。各個物件都擁有類中每乙個普通資料成員的副本,但靜態資料成員只有乙個例項存在,與定義了多少類物件無關。靜態方法就是與該類相關的,是類的一種行為,而不是與該類的例項物件相關。靜態資料成員的用途之一是統計有...