C++中static關鍵字的作用

@著作權歸作者所有:來自CSDN博客作者大鬍子的艾娃的原創作品,如需轉載,請註明出處,否則將追究法律責任。
如有錯誤的地方歡迎指正,謝謝!

一、 static聲明全局靜態變量和局部靜態變量
1、static聲明全局靜態變量
該全局變量只能供本模塊使用,不能被其他模塊再聲明extern變量。

2、static聲明局部靜態變量
靜態局部變量可以理解爲是一個供函數局部存取的全局變量
a、生存期爲整個源程序,但是其作用域仍與自動變量相同,只能在定義該局部靜態變量的函數中存取。
b、函數多次進入,變量的值只能在第一次進入初始化,也是唯一的一次初始化。

注意:static聲明的靜態的默認初始化爲0(整形和浮點型都是)

二、static聲明的普通函數
普通函數不能嵌套定義,所以沒有局部函數和全局函數一說。

全局變量默認是非extern的,而普通的函數,默認是extern的,也就是說它用不用extern聲明都可以被其他模塊調用(前提其他模塊中也有該函數的聲明)。用static修飾的函數,限定在本本模塊中,不能被本模塊以外的模塊調用。所以不會導致不同模塊中聲明、定義的同名函數發生衝突。

三、C++中的靜態數據成員和靜態函數成員
不管這個類創建了多少個對象,其靜態成員在內存中只保留一份拷貝,這個拷貝爲該類的所有對象所共享。

1、靜態成員數據
a、靜態數據成員的訪問屬性同普通數據成員一樣,可以爲public、private和protected。
b、靜態數據成員脫離具體對象而獨立存在,其存儲空間是獨立分配的,不是任何對象存儲空間的一部分,但邏輯上所有的對象都共享這一存儲單元,所以對靜態數據成員的任何操作都將影響共享這一存儲單元的所有對象。
c、靜態數據成員是一種特殊的數據成員,它表示類屬性,而不是某個對象單獨的屬性,它在程序開始產生,在程序結束時消失。靜態數據成員具有靜態生存期。
d、由於在類的定義中僅僅是對靜態數據成員進行了引用性聲明,因此必須在文件作用域的某個地方對靜態數據成員進行定義並初始化,即應在類體外對靜態數據成員進行初始化(靜態數據成員的初始化與它的訪問控制權限無關),對象的初始化應不需要再對靜態數據初始化。
e、靜態數據成員初始化時前面不加static關鍵字,以免與一般靜態變量或對象混淆。
f、由於靜態數據成員是類的成員,因此在初始化時必須使用類作用域運算
符::限定它所屬的類。

#include<iostream>
using namespace std;
class Student {
public:
	char *Name;
	int No;
	static int sc;
};
//在類外對靜態成員初始化如下:
int Student::sc;//默認初始化的值爲0,一般初始化爲:int Student::sc=數值
int main()
{
	Student a = { "dahuzideaiwa",2 };//Student a = { "dahuzideaiwa",2,90 };錯誤
	cout << a.sc << endl;
	a.sc = 90;cout << a.sc << endl;
	return 0;
}
/*運行結果:
0
90
*/

2、靜態成員數據
a、通過對象訪問靜態成員函數的前提條件爲對象已經建立。
b、靜態成員函數的訪問權限同普通成員函數一樣。
c、靜態成員函數也可以省略參數、使用默認形參值、以及進行重載。
d、不能將靜態成員函數定義爲虛函數。
e、static並沒有增加程序的時空間開銷,相反在子類對父類靜態成員的訪問時縮短了時間開銷,節省了子類的內存空間。
f、靜態成員函數與普通成員函數在使用還有如下區別:
由於靜態成員函數在類中只有一個拷貝(副本),因此它訪問對象的成員時要受到一些限制:靜態成員函數可以直接訪問類中說明的靜態成員,但不能直接訪問類中的非靜態成員;若要訪問非靜態成員,必須通過參數傳遞的方式得到相應的對象,再通過對象來訪問。
由於靜態成員是獨立於類對象而存在的,因此靜態成員沒有this指針。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章