位址: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 = ;//定義