static總結(jié)(轉(zhuǎn)載)

地址:http://blog.csdn.net/mishifangxiangdefeng/article/details/7192809

一、不在類中的static的使用

1.作用

1.局部變量被申明為static,表示這個函數(shù)結(jié)束的時候這個的值不變。

2.外部變量被申明為static表明它是一個本地全局變量。該變量只能在該文件內(nèi)被訪問,不能被其它文件訪問。

2.Static與非static的區(qū)別

  • static全局變量與普通的全局變量有什么區(qū)別:static全局變量只初使化一次,防止在其他文件單元中被引用;

  • static局部變量和普通局部變量有什么區(qū)別:static局部變量只被初始化一次,下一次依據(jù)上一次結(jié)果值;

  • static函數(shù)與普通函數(shù)有什么區(qū)別:static函數(shù)在內(nèi)存中只有一份,普通函數(shù)在每個被調(diào)用中維持一份拷貝

二、類中的static的使用

1.static成員函數(shù)

(1)關(guān)鍵字static只在類的定義體內(nèi)部出現(xiàn)(與const不同,與friend相同),在類外部定義函數(shù)、數(shù)據(jù)成員的時候不能再出現(xiàn)static關(guān)鍵字。**

(2)沒有this指針,成員函數(shù)都有,static成員函數(shù)沒有this指針**

(3)不能被聲明為const或virtual 。static成員函數(shù)不能被聲明為const**

2.static成員變量

靜態(tài)數(shù)據(jù)成員相關(guān)的操作有三個分別是聲明、定義與初始化

聲明:說明這個類中有這樣一個成員,但是不分配空間(1)

定義:分成員開辟內(nèi)存空間,靜態(tài)成員的空間在靜態(tài)成員區(qū),和類的其它成員不在一起(2)

初始化:為它定義一個初值(4)

對于static數(shù)據(jù)成員:聲明在函數(shù)體內(nèi),定義和初始化要在函數(shù)體外,定義和初始化常常放在一句話里(3)。(2)和(3)不能同時出現(xiàn)

要想訪問靜態(tài)數(shù)據(jù)成員可以通過對象或指針,也可以使用類作用域(4)。參照《12.6 static成員》

例1:/*靜態(tài)數(shù)據(jù)成員相關(guān)的操作有三個分別是聲明、定義與初始化
聲明:說明這個類中有這樣一個成員,但是不分配空間(1)
定義:分成員開辟內(nèi)存空間,靜態(tài)成員的空間在靜態(tài)成員區(qū),和類的其它成員不在一起(2)
初始化化:為它定義一個初值(4)
對于static數(shù)據(jù)成員:
聲明在函數(shù)體內(nèi),定義和初始化要在函數(shù)體外,定義和初始化常常放在一句話里(3)
(2)和(3)不能同時出現(xiàn)*/
class A
{
public:
    static int x;//(1)
};
int A::x;//(2)
int A::x = 2;//(3)
int main()
{
    A::x = 2;//(4) //使用類作用域訪問靜態(tài)數(shù)據(jù)成員。問:如果這里的x是私有的,我們還可以訪問嗎?
    return 0;
}

3.static成員常量

例2:/*對于const static數(shù)據(jù)成員,情況比較特殊 
聲明在函數(shù)體內(nèi),定義在函數(shù)體外,但是初始化可以在函數(shù)體內(nèi)或外都可以 
注意(1),const在聲明和定義時都要出現(xiàn),而static只在聲明的時候出現(xiàn) 
如果在函數(shù)體外初始化,和前一個例子相同,下面程序是在函數(shù)體內(nèi)定義的情況 
注意(2)千萬不在把定義少了*/  
class A  
{  
public:  
    const static int x = 2;//聲明和初始化在一起  
};  
const int A::x;//定義,之前已經(jīng)初始化過了,這里就不用再初始化了。
int main()  
{  
//  A::x = 2;//(4)  
    return 0;  
}  

4.不管是2還是3,聲明、定義不可少

  • 少了聲明,會出現(xiàn)鏈接錯誤(聲明在類內(nèi))

  • 少了定義,會沒有分配空間(定義都在類外面)

  • 少了初始化,默認(rèn)初始化為0(有時候定義和初始化會在一起)

5.非static數(shù)據(jù)成員不能用作默認(rèn)實參

例3:
[cpp] view plaincopy
class A  
{  
public:  
    static int x;  
    int y;  
    void Test1(int para = x){}//正確  
    void Test2(int para = y){}//錯誤  
};  
int A::x = 2;//定義  

6.靜態(tài)數(shù)據(jù)成員在沒有對象之前就存在

7.靜態(tài)成員函數(shù)不能被說明為虛函數(shù)

8.靜態(tài)成員函數(shù)不能含有普通成員,因為普通成員是屬于對象的一部分

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容