C static關鍵字作用講解

2021-09-25 03:59:15 字數 3320 閱讀 4961

分別建立兩個cpp檔案。乙個是main函式所處的cpp 乙個是自己定義的demo.cpp

demo.cpp**如下:裡面主要是定義了乙個char型別字元a和msg函式

#include "stdafx.h"

char a ='a';

void msg()

main.cpp**如下:主要是通過extern 來引用這兩個方法 並執行

#include "stdafx.h"

#include "demo.h"

using namespace std;

int _tmain(int argc, _tchar* ar**)

此時是未加入static關鍵字執行結果:

#include "stdafx.h"

static char a ='a';

static void msg()

執行結果如下:

可以很容易看出 它無法被引用,說明在c++中 變數加上static 有隱藏的作用

一種是加了static的**:

// test.cpp : 定義控制台應用程式的入口點。

//#include "stdafx.h"

#include "demo.h"

using namespace std;

int func()

int _tmain(int argc, _tchar* ar**)

int _tmain(int argc, _tchar* ar**)

首先是輸出沒加static的變數i 我們看結果:

明顯可以看到without being initialized 可以看到未被初始化,

接下來我們來看一下輸出加static之後的i 會發生什麼呢。

可以看到i輸出了,說明加上static 會先預設初始化為0。

在類中宣告static變數或者函式時,初始化時使用作用域運算子來標明它所屬類,因此,靜態資料成員是類的成員,而不是物件的成員,這樣就出現以下作用:

(1)類的靜態成員函式是屬於整個類而非類的物件,所以它沒有this指標,這就導致 了它僅能訪問類的靜態資料和靜態成員函式。

示例**:

//標頭檔案.h

#include "stdafx.h"

using namespace std;

class demo;

//.cpp

#include "stdafx.h"

#include "demo.h"

using namespace std;

//extern int var_str;

demo::demo()

//static demo::var_str = 2;

demo::~demo()

int demo::d = 1;

void demo::demod()

void demo::msg()

這裡可以看出 d 屬於靜態成員變數 cb_str屬於非靜態成員變數 接下來靜態成員函式demod 引用非靜態成員變數 cb_str 執行 檢視效果如下:

實際操作可知:它僅能訪問類的靜態資料和靜態成員函式。

(2)不能將靜態成員函式定義為虛函式。

(3)由於靜態成員宣告於類中,操作於其外,所以對其取位址操作,就多少有些特殊 ,變數位址是指向其資料型別的指標 ,函式位址型別是乙個「nonmember函式指標」。

(4)由於靜態成員函式沒有this指標,所以就差不多等同於nonmember函式,結果就 產生了乙個意想不到的好處:成為乙個callback函式,使得我們得以將c++和c-based x w indow系統結合,同時也成功的應用於執行緒函式身上。 (這條沒遇見過)

(5)static並沒有增加程式的時空開銷,相反她還縮短了子類對父類靜態成員的訪問 時間,節省了子類的記憶體空間。

(6)靜態資料成員在《定義或說明》時前面加關鍵字static。

(7)靜態資料成員是靜態儲存的,所以必須對它進行初始化。 (程式設計師手動初始化,否則編譯時一般不會報錯,但是在link時會報錯誤)

(8)靜態成員初始化與一般資料成員初始化不同:

初始化在類體外進行,而前面不加static,以免與一般靜態變數或物件相混淆;

初始化時不加該成員的訪問許可權控制符private,public等;        

初始化時使用作用域運算子來標明它所屬類;

所以我們得出靜態資料成員初始化的格式:

《資料型別》《類名》::《靜態資料成員名》=《值》

(9)為了防止父類的影響,可以在子類定義乙個與父類相同的靜態變數,以遮蔽父類的影響。這裡有一點需要注意:我們說靜態成員為父類和子類共享,但我們有重複定義了靜態成員,這會不會引起錯誤呢?不會,我們的編譯器採用了一種絕妙的手法:name-mangling 用以生成唯一的標誌。

希望對大家有幫助吧 這個概念還是很基礎的 但是最終還是實際上用出來比較好。

接下來後面寫const關鍵字的作用,這兩個比較面試常考

C static關鍵字作用

1.static修飾全域性變數 當同時編譯多個檔案時,所有未加static字首的全域性變數和函式都具有全域性可見性,其它的原始檔也能訪問。未加static的全域性變數,在符號表中是global符號,其他目標檔案可見,這樣的符號是要參與符號解析的。加了static之後,是local符號,其他目標檔案不...

C static 關鍵字作用

在全域性變數前加上static關鍵字,全域性變數就定義成了乙個全域性靜態變數。在區域性靜態變數之前加上static,區域性變數就成為乙個區域性靜態變數。在函式返回型別前加static,函式就定義為靜態函式。在類中,靜態成員可以實現多個物件之間的資料共享,並且使用靜態資料成員還不會破壞隱藏的原則,即保...

C static關鍵字的作用

在 c語言中,static 的字面意思很容易把我們匯入歧途,其實它的作用有三條。1 先來介紹它的第一條也是最重要的一條 隱藏。當我們同時編譯多個檔案時,所有未加 static 字首的全域性變數和函式都具有全域性可見性。為理解這句話,我舉例來說明。我們要同時編譯兩個原始檔,乙個是 a.c,另乙個是 m...