開門見山--->本篇部落格我們主要講:類的靜態成員及其相關
由於之前學習c語言的時候大家對static關鍵字想必並不陌生,而本篇部落格我們依舊需要用到static,只不過是更深入的運用。按例,首先還是以一段簡單的**來回顧一下:
#includeusing namespace std;
#includeint a = 0;
static int b = 0;//鏈結屬性
void f()
int main()
這裡定義了3個變數:其中b和c都是靜態成員變數,它們的作用域不一樣(c的作用域只是在f()函式內),但是生命週期一樣。所以在main函式中訪問c就出現了問題。
下來我們再設想這樣一種情況:定義乙個日期類,怎樣才能統計到所建立的物件個數?
這裡要注意:類的靜態成員變數不能在類中進行初始化,而是要在類外面進行初始化,即
int date::_cout = 0;
為什麼不在類的成員函式中初始化呢?這是因為:靜態成員變數不是屬於某個物件所擁有的,因為它的生命週期是全域性都存在的;如果屬於某個物件,則就無法統計個數(因為每一次呼叫建構函式,拷貝構造都在建立物件),它是屬於日期類所有物件所共享的。
這裡證明一下:
cout << sizeof(date) << endl;
得出結果是4,也就驗證了我們的猜想:d是乙個區域性物件,在棧幀裡面,而_cout是在靜態區的。
由於_cout是私有的,那麼要想訪問到它,我們就必須通過成員函式進行訪問:
class date
date(const date&d)
static void printcount()
private:
int _year;
static int _cout;
};int date::_cout = 0;
int main()
可見通過呼叫「物件.成員函式」的方式可以成功訪問到_cout,但是這裡還有乙個問題:前面我們已經分析過,_cout不是某個物件所擁有的,而是所有物件共享的;這樣的話即使不建立物件,它也應該是存在的,可是當我們試驗時,卻出現了問題
int main()
那麼怎麼來成功訪問到_cout呢?這裡就可以把printcout()函式定義成靜態的
//在類中把printcount()定義為靜態成員函式
class date
};
//printcount()的呼叫
int main()
那靜態成員函式和普通成員函式有什麼區別呢?
static void printcount()
會發現編譯不通過,這裡「非靜態成員引用必須與特定物件相對」又是什麼意思?我們知道,之前,訪問類中的私有成員時,我們都會通過成員函式來進行訪問:在main函式中建立乙個物件,再通過物件呼叫成員函式。無論建立幾個物件,我們都可以通過這樣的方法準確輸出各個物件的私有成員不同值;仔細思考,其實物件呼叫成員函式訪問成員變數就是通過this指標進行訪問的,而this指標通過是物件的位址傳過來的。而靜態成員變數是屬於整個類所擁有,是所有物件所共享的,它是全域性的。同理,靜態成員函式也一樣,它是整個類共享的,不是特定地屬於某乙個物件的;以前我們訪問成員變數都是通過成員函式傳遞this指標進行訪問,這裡由於是「靜態成員函式」,所以不存在this指標,所以編譯器就無法確定這裡的_year究竟訪問的是哪個物件的_year
綜上:總結--->靜態成員函式有乙個顯著的特徵
:沒有this指標,所以可以使用型別: : 作用域訪問符直接呼叫靜態成員函式。
問題:
1 . 靜態成員函式可以訪問非靜態的成員嗎?
答:不可以,非靜態的成員一定是屬於某個類的,必須通過this指標才能訪問,而靜態成員函式沒有this指標
2 .非靜態的成員函式可以訪問靜態成員嗎?
答:可以,靜
態成員不僅屬於某個類,也是大家所共享的,沒有this指標都可以訪問,有this指標就更可以了
類靜態成員和類靜態成員函式
當將類的某個資料成員宣告為static時,該靜態資料成員只能被定義一次,而且要被同類的所有物件共享。各個物件都擁有類中每乙個普通資料成員的副本,但靜態資料成員只有乙個例項存在,與定義了多少類物件無關。靜態方法就是與該類相關的,是類的一種行為,而不是與該類的例項物件相關。靜態資料成員的用途之一是統計有...
類的靜態成員
類的靜態成員存在於任何物件之外,物件中不包含任何與靜態資料成員有關的資料。class account 對於account的每乙個物件豆漿包含owner和amount兩個資料成員,而對於靜態成員interestrate只有乙個,且被所有的物件共享。double r r account rate 2.使...
類的靜態成員
1,static靜態成員,靜態成員 變數 or 函式 可以是public or private,訪問許可權與普通 非static 成員一樣,受到限定符限制 2,靜態成員 變數 or 函式 不與任何物件繫結在一起,而是被所有物件共享 特別是靜態成員函式,它不包含this 指標引數 3.public靜態...