在成員聲明之前加上 static 使其與類關聯(lián)到一起;和其他的類成員是相同的,靜態(tài)成員可以是 public 或 private 的。并且靜態(tài)成員的類型可以是 常量、引用、指針、類 類型等;
類的靜態(tài)成員存在與任何對象之外,對象也不包含任何與靜態(tài)成員有關的數(shù)據(jù)。
類的靜態(tài)函數(shù)不與任何對象綁定在一起,它們不包含 this 指針。作為結果,靜態(tài)成員不能聲明成 const 的【因為我們在定義一個類對象的時候,實際上只給該對象的非靜態(tài)的數(shù)據(jù)成員分配內存空間(假設沒有虛函數(shù)),而該類的靜態(tài)成員數(shù)據(jù)以及該類的函數(shù)都在編譯的時候分配到一個公共的空間里,所有,在定義一個對象并調用類對象的函數(shù)的時候,函數(shù)根本不知道到底是哪個對象調用了他,怎么解決這個問題呢,C++利用傳遞this指針的方式來實現(xiàn),調用一個類對象里的函數(shù)的時候,將把這個對象的指針傳遞給他,以便函數(shù)對該對象的數(shù)據(jù)進行操作,對于一個定義為const的函數(shù),傳遞的是const的this指針,說明不能更改對象的屬性,而對static成員的函數(shù)不需傳遞this指針,所有就不需要用const來修飾static的成員函數(shù)了!就說const屬性的作用就是對被傳遞的this指針加以限定,而對static成員函數(shù)的調用根本不傳遞this指針,所有不需const來修飾static的成員函數(shù)~~~~ 從對象模型上來說,類的非static成員函數(shù)在編譯的時候都會擴展加上一個this參數(shù),const的成員函數(shù)被要求不能修改this所指向的這個對象;而static函數(shù)編譯的時候并不擴充加上this參數(shù),自然無所謂const。 因為const成員函數(shù)的const是修飾this所指指物的也就是this將會被聲明為const CLASSNAME*。 而static不存在this指針,所以const對static member function的修飾是無效的。 static member怎么看都是活在CLASSNAME NAMESPACE中的普通事物?!?,而且我們也不能在 static 函數(shù)體內使用 this 指針。限制即使用this的顯示使用,也對調用非靜態(tài)成員的隱式使用有效。
靜態(tài)成員的使用
- 通過使用作用域運算符訪問靜態(tài)成員
int a;
a = Account :: rate(); // rate()函數(shù)是 Accout 類中的靜態(tài)函數(shù)
- 即使靜態(tài)成員不屬于類的某個對象,但是仍然能使用類的對象、引用或指針來訪問靜態(tài)成員;
Account ac1;
Account *ac2 = &ac1;
ac1.rate(); /* 通過類的對象 或 類的對象的引用來調用類的靜態(tài)成員 */
ac2->rate(); /* 通過指向對象的指針調用類的靜態(tài)成員 */
- 成員函數(shù)不使用作用域運算符就能直接使用靜態(tài)成員
class Accout{
public:
void test{
count << a << endl;
}
private:
static int a;
}
- 定義靜態(tài)成員
和其他的成員函數(shù)相同,既可以在類內部也可以在類外部定義靜態(tài)成員函數(shù)。但是在類外定義靜態(tài)成員函數(shù)的時候,并且在類外定義時要指定類名,不能重復 static 關鍵字,static 關鍵子只能出現(xiàn)在類的內部聲明語句;
因為靜態(tài)數(shù)據(jù)成員不屬于類的任何一個對象,所以它們并不是在創(chuàng)建類對象的時候被定義,這意味著它們不是由類的構造函數(shù)初始化的;
- 通常我們不能在類內初始化靜態(tài)成員,必須在類外進行定義和初始化每個靜態(tài)成員,和其他對象一樣,一個靜態(tài)數(shù)據(jù)成員只能定義一次;
class A{
private:
static int b; // b是在class A中的聲明,而不是定義
}
- 定義靜態(tài)數(shù)據(jù)成員
靜態(tài)數(shù)據(jù)成員定義在任何函數(shù)之外,類似全局變量,因為一旦被定義將存在與程序的整個生命周期;
定義靜態(tài)數(shù)據(jù)成員和類外定義成員函數(shù)類似:目標對象的類型 、類名、作用域預算符和成員自己的名稱;
/* 定義并初始化一個靜態(tài)成員 */
int Accout::static_value = intRate();
/*
*定義了名為static_value的對象,該對象是 Account的靜態(tài)成員,類型是 int ,從類名開始,語句的剩下的部分就是位于類的作用域之內了,所以能夠直接使用intRate函數(shù):
*/
Note:即使 intRate 函數(shù)是私有的,和其他的函數(shù)一樣,static_value的初始化能夠訪問私有的函數(shù);
-
成員函數(shù)的類內初始化



