天天看點

C++ primer ----static總結(轉載)

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

一、不在類中的static的使用

1.作用

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

2.外部變量被申明為static表明它是一個本地全局變量。改變量隻能在該檔案内被通路,不能被其它檔案通路。

2.Static與非static的差別

  • static全局變量與普通的全局變量有什麼差別:static全局變量隻初使化一次,防止在其他檔案單元中被引用;
  • static局部變量和普通局部變量有什麼差別:static局部變量隻被初始化一次,下一次依據上一次結果值;
  • static函數與普通函數有什麼差別:static函數在記憶體中隻有一份,普通函數在每個被調用中維持一份拷貝

二、類中的static的使用

1.static成員函數

(1)關鍵字static隻在類的定義體内部出現(與const不同,與friend相同),在類外部定義函數、資料成員的時候不能再出現static關鍵字。**

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

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

2.static成員變量

  • 靜态資料成員相關的操作有三個分别是聲明、定義與初始化
    • 聲明:說明這個類中有這樣一個成員,但是不配置設定空間(1)
    • 定義:分成員開辟記憶體空間,靜态成員的空間在靜态成員區,和類的其它成員不在一起(2)
    • 初始化化:為它定義一個初值(4)
  • 對于static資料成員:聲明在函數體内,定義和初始化要在函數體外,定義和初始化常常放在一句話裡(3)。(2)和(3)不能同時出現
  • 要想通路靜态資料成員可以通過對象或指針,也可以使用類作用域(4)。參照《12.6 static成員》
例:/*靜态資料成員相關的操作有三個分别是聲明、定義與初始化
聲明:說明這個類中有這樣一個成員,但是不配置設定空間(1)
定義:分成員開辟記憶體空間,靜态成員的空間在靜态成員區,和類的其它成員不在一起(2)
初始化化:為它定義一個初值(4)
對于static資料成員:
聲明在函數體内,定義和初始化要在函數體外,定義和初始化常常放在一句話裡(3)
(2)和(3)不能同時出現*/
class A
{
public:
    static int x;//(1)
};
int A::x;//(2)
int A::x = ;//(3)
int main()
{
    A::x = ;//(4) //使用類作用域通路靜态資料成員。問:如果這裡的x是私有的,我們還可以通路嗎?
    return ;
}
           

3.static成員常量

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

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

  • 少了聲明,會出現連結錯誤(聲明在類内)
  • 少了定義,會沒有配置設定空間(定義都在類外面)
  • 少了初始化,預設初始化為0(有時候定義和初始化會在一起)

5.非static資料成員不能用作預設實參

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

6.靜态資料成員在沒有對象之前就存在

7.靜态成員函數不能被說明為虛函數