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/*靜態數據成員相關的操作有三個分別是聲明、定義與初始化
聲明:說明這個類中有這樣一個成員,但是不分配空間(1)
定義:分成員開闢內存空間,靜態成員的空間在靜態成員區,和類的其它成員不在一起(2)
初始化化:爲它定義一個初值(4)
對於static數據成員:
聲明在函數體內,定義和初始化要在函數體外,定義和初始化常常放在一句話裏(3)
(2)和(3)不能同時出現*/
class A
{
public:
    static int x;//(1)
};
int A::x;//(2)
int A::x = 2;//(3)
int main()
{
    A::x = 2;//(4) //使用類作用域訪問靜態數據成員。問:如果這裏的x是私有的,我們還可以訪問嗎?
    return 0;
}

3.static成員常量

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

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

  • 少了聲明,會出現鏈接錯誤(聲明在類內)

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

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

5.非static數據成員不能用作默認實參

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.靜態數據成員在沒有對象之前就存在

7.靜態成員函數不能被說明爲虛函數

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章