static在C和C++裏各代表什麼含義

 C程序中:static用於函數定義時,或用於代碼塊之外的變量聲明時,static關鍵字用於修改標識符的鏈接屬性,從external改爲internal,但標識符的存儲類型和作用域不受影響。用這種方式聲明的函數或變量只能在聲明他們的源文件中訪問。當static用於代碼塊內部的變量聲明時,static關鍵字用於修改變量 存儲類型,從自動變量修改爲靜態變量,但變量的鏈接屬性和作用域不受影響。用這種方式聲明的變量在程序執行之前創建,並在正程序的整個執行期間一直存在,而不是每次在代碼塊開始執行時創建,在代碼塊執行完成之後銷燬。
     C++程序中:
     靜態成員是可以獨立訪問的,無須創建任何對象實例就可以訪問。
     static修飾數據,靜態數據成員: 類體中的數據成員的聲明前加上static關鍵字,該數據成員就成爲了該類的靜態數據成員。和其他數據成員一樣,靜態數據成員也遵守public/protected/private訪問規則
(1)靜態數據成員的定義:
靜態數據成員實際上是類域中的全局變量,所以,靜態數據成員的定義(初始化)不應該放在頭文件中
例:
xxx.h文件
class base
{
private:
static const _i;
};

xxx.cpp文件
const int base::_i = 10;
注:不要試圖在頭文件中定義(初始化)靜態數據成員。在大多數的情況下,這樣做會引起重複定義這樣的錯誤。即使加上#ifndef #define #endif或者#pragma once 也不可以。
(2)靜態數據成員被類的所有對象所共享,包括該類派生類的對象。即派生類對象和基類對象共享基類的靜態數據成員。
例:
class base
{
public:
static int _num;//聲明
};
int base::_num = 0;//靜態數據成員的真正定義
class derived:public base
{};
int main()
{
base a;
derived b;
a._num++;
cout<<"base class static data number _num is"<<a._num<<endl;
b._num++;
cout<<"derived class static data number _num is"<<b._num<<endl;
}

可見基類和派生類共用基類的靜態成員函數
(3)靜態數據成員可以成爲成員函數的可選參數,而普通數據成員不可以

代碼中_staticVar爲靜態數據成員函數,_var 爲普通數據成員函數,在聲明void foo2(int i = _var);函數時,提示有錯誤。編譯結果如下:


所以靜態數據成員可以作爲成員函數的默認參數。

(4)靜態數據成員的類型可以是所屬類的類型,而普通數據成員不可以。普通數據成員只能聲明爲所屬類類型的指針或引用。
class base{ 
public : 
static base _object1;//正確,靜態數據成員 
base _object2;//錯誤 
base *pObject;//正確,指針 
base &mObject;//正確,引用 
}; 

2.靜態成員函數
(1)靜態成員函數的地址可以用普通函數指針存儲,而普通成員函數地址需要用類成員函數指針存儲。由於普通成員函數中含this指針,而靜態成員函數沒有。

(2)靜態成員函數不可以調用類的非靜態成員,因爲靜態成員函數不含this 指針。
(3)靜態成員函數不可以同時聲明爲virtual,const,volatile函數。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章