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