目錄
C語言中靜態變量
C++靜態成員變量
C++靜態成員函數
C語言中靜態變量
1.函數內部用static修飾的變量,只能在此函數使用,但所修飾的變量不隨函數釋放而釋放,下次調用時的值仍為上次結束時的值 |
2.static修飾的全局變量只能在其定義的文件使用 |
3.static修飾的函數只能在其所在的文件中被調用 |
知識點:static修飾的靜態成員變量或成員函數是在編譯鏈接過程中就分配好了內存空間,而普通成員函數是在運行過程中分配空間(根據? 分配空間的時間點? 這個知識點理解下文)
C++靜態成員變量
1.C++類中的成員變量放置在全局靜態變量區 |
2.C++類中的靜態成員變量可以多個類成員之間數據共享 |
3.C++類中的成員變量必須在對應的cpp文件中進行定義(類成員函數只是聲明,可以類比C中extern聲明的int變量) |
4.C++類中靜態成員變量不能在構建函數中以列表方式初始化 |
// a.h文件class A
{
public:// A():i(10){}//錯誤,不能以列表方式初始化靜態成員變量A(){ i = 10; } //正確void set(int ii) { i = ii; }void print(void) { cout << "A::i = " << i << endl; }
private:static int i;
}//main.cpp文件int A::i; //類成員變量必須在對應cpp中進行定義,且不能用static修飾。否則與C標準中static修飾變量只能在本文件使用的規則沖突,從而報錯int main(void)
{A a,b;b.set(20); //成員變量b對i進行賦值a.print(); //最后輸出 A::i = 20, 靜態成員變量可以多個類成員之間數據共享return 0;
}
C++靜態成員函數
1.static成員函數內不能使用this指針 |
2.static修飾的成員函數只能處理static修飾的成員函數或變量 |
3.static修飾的成員函數可以在類沒有實例化時調用 |
class A
{
public:A(){ }void print(void){ cout << "A::print()" << endl;}static void fun(void){cout << "i: " << i << endl; //正確
//下面錯誤寫法的原因都是 類A未實例化,在內存中未分配空間,導致找不到對應變量或函數
// cout << "i: " << this->i << endl; //報錯,“this”: 只能在非靜態成員函數或非靜態數據成員初始值設定項的內部引用
// print(); //報錯,“A::printf”: 非靜態成員函數的非法調用
// cout << "k: " << k << endl; //報錯,對非靜態成員“A::k”的非法引用
//原因,當main函數使用 A::fun()調用此函數時,k并未定義,所以找不到k}
private:static int i;int k;
}int main(void)
{
// A::print(); //錯誤, 非static成員函數只能實例化后調用A::fun(); //正確,在編譯鏈接時期就對static成員函數分配了空間,可以直接調用return 0;
}
static修飾類實例
1.靜態類實例化時,是在編譯鏈接時就已經分配好空間,但在使用時進行初始化 |
2.類實例化用static修飾時,它的析構函數在程序執行完成之后執行,而非對應的函數執行完畢 |
3.多個cpp文件定義static的類實例化時,類的構造函數執行是隨機的 |
//a.h文件
class A
{
public:A() : i(0){ cout << "A() " << endl; }void print(void) { cout << "A::i = " << i << endl; }
private:int i;
};//b.cpp文件
void b_fun()
{static A bFun;
}//c.cpp文件
void c_fun()
{static A cFun;
}//main.cpp文件
int main(void)
{cout << "Main Begin!" << endl;static A a;a.print();cout << "Main end!" << endl;return 0;
}//b.cpp和c.cpp中的 bFun 和 cFun 的分配內存時間不能確定先后順序