C語言:
-
1筹陵、靜態(tài)全局變量:
1、在全局變量前加上 static 關鍵字镊尺,即為靜態(tài)全局變量
2朦佩、靜態(tài)全局變量在程序的數(shù)據(jù)區(qū)分配內存,若未初始化則默認初始化為0庐氮,直到程序結束才銷毀
3语稠、靜態(tài)全局變量在該文件內可見,從變量定義處開始直到文件結束(普通全局變量在同一程序的其他文件中可見弄砍,默認是 external 屬性仙畦,而靜態(tài)全局變量是 internal 屬性), 而在其他文件中不可見
-
2慨畸、靜態(tài)局部變量:
1、在局部變量前加上 static 關鍵字衣式,即為靜態(tài)局部變量
2寸士、靜態(tài)局部變量也存儲在數(shù)據(jù)區(qū)(不在棧區(qū)),程序執(zhí)行之前就已分配內存碴卧,程序執(zhí)行結束后才銷毀
3弱卡、靜態(tài)局部變量只在首次執(zhí)行到聲明處初始化一次,之后再執(zhí)行該語句時不在初始化住册,若沒有初始化則編譯器會將其初始化為0
4婶博、其作用域與局部變量的作用域一樣,從定義處到所處語句塊結束 -
3荧飞、靜態(tài)函數(shù):
1凡人、在普通函數(shù)的返回類型前加上 static 關鍵字,即為靜態(tài)函數(shù)
2垢箕、只能在本文件中使用
C++:
-
1划栓、靜態(tài)數(shù)據(jù)成員
1、在類內數(shù)據(jù)成員前加上 static 關鍵字条获,即為靜態(tài)數(shù)據(jù)成員
2忠荞、對于類靜態(tài)數(shù)據(jù)成員,無論有多少個該類的對象帅掘,該靜態(tài)數(shù)據(jù)成員在內存中只有一份拷貝(其他普通數(shù)據(jù)成員委煤,每個類對象都有自己的內存拷貝),該靜態(tài)數(shù)據(jù)成員由所有該類對象共享
3修档、靜態(tài)數(shù)據(jù)成員存儲在全局數(shù)據(jù)區(qū)碧绞,在定義時分配存儲空間,程序運行結束時銷毀
4吱窝、靜態(tài)數(shù)據(jù)成員不能再類中定義和初始化讥邻,只能在類中聲明迫靖,在類外進行定義和初始化,默認初始化為0
5兴使、靜態(tài)數(shù)據(jù)成員的初始化為 <類型名> <類名>::<變量名> = <值>
6系宜、靜態(tài)數(shù)據(jù)成員遵從 public private protected 訪問規(guī)則
7、靜態(tài)數(shù)據(jù)成員可以直接使用類名加作用域運算符(::)直接訪問 <類名>::<變量名>(訪問規(guī)則允許的情況下) -
2发魄、靜態(tài)成員函數(shù)
1盹牧、在普通類成員函數(shù)前加上 static 關鍵字,即為靜態(tài)成員函數(shù)
2励幼、在類外定義靜態(tài)成員函數(shù)時汰寓,不用再加 static 關鍵字,只要在類中聲明時加上即可
3苹粟、靜態(tài)成員函數(shù)只能訪問靜態(tài)數(shù)據(jù)成員和靜態(tài)成員函數(shù)有滑,普通成員函數(shù)可以訪問靜態(tài)成員函數(shù)和靜態(tài)數(shù)據(jù)成員
4、靜態(tài)成員函數(shù)屬于類嵌削,不屬于任意一個類對象
5俺孙、靜態(tài)成員函數(shù)沒有 this 指針
6、可以使用 <類名>::<函數(shù)名> 訪問掷贾,也可由類對象使用(./->)訪問
示例:
class A{
public:
static int x; // 聲明一個靜態(tài)成員變量
// static int x = 10; // error 聲明一個靜態(tài)成員變量
static void fun(); // 聲明一個靜態(tài)成員函數(shù)
int y1 = 10;
int y2;
};
// int A::x = 10; // 定義靜態(tài)成員變量并初始化
int A::x; // 默認初始化為0睛榄,必須定義靜態(tài)數(shù)據(jù)成員,不然會報錯想帅,在類內只能是聲明
void A::fun(){
cout<<x<<endl;
// cout<<y1<<endl; error 不能訪問非靜態(tài)成員函數(shù)
// cout<<y2<<endl;
}
int main()
{
A a; // 創(chuàng)建一個 類 A 對象
A *b = &a;
cout<<A::x<<'\t'<<a.x<<'\t'<<b->x<<endl; // 訪問靜態(tài)數(shù)據(jù)成員的方式 A::x / a.x / b->x
A::fun(); // 訪問靜態(tài)成員函數(shù)的方式 A::fun() / a.fun()
a.fun();
b->fun(); // b->fun()
return 0;
}
以上內容參考以下幾篇文章: