1. 程式人生 > >C++中static關鍵字作用

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指標。