程式設計拾遺 C 的static成員函式與單例模式

2021-09-08 13:21:09 字數 3206 閱讀 5084

static 是c++中非經常常使用的修飾符,它被用來控制變數的儲存方式和可見性。

函式內部定義的變數,在程式執行到它的定義處時,編譯器為它在棧上分配空間,函式在棧上分配的空間在此函式執行結束時會釋放掉,這樣就產生了乙個問題:假設想將函式中此變數的值儲存至下一次呼叫時。怎樣實現? 最easy想到的方法是定義乙個全域性的變數。但定義為乙個全域性變數有很多缺點,最明顯的缺點是破壞了此變數的訪問範圍(使得在此函式中定義的變數。不只受此函式控制)。而static變數能夠保持該變數的值,使得函式在下次呼叫時還保持上次函式退出時的值。

static被引入以告知編譯器。將變數儲存在程式的靜態儲存區而非棧上空間,靜態資料成員按定義出現的先後順序依次初始化。注意靜態成員巢狀時,要保證所巢狀的成員已經初始化了。

能夠節省記憶體。由於它是全部物件所公有的,因此,對多個物件來說。靜態資料成員僅僅儲存一處,供全部物件共用。靜態資料成員的值對每乙個物件都是一樣,但它的值是能夠更新的。僅僅要對靜態資料成員的值更新一次,保證全部物件訪問更新後的同樣的值,這樣能夠提高時間效率。

類的物件構建過程不會動到static變數和函式,由於它存在靜態記憶體。程式載入進記憶體的時候它就存在。而物件生命週期不同。

static資料成員

static資料成員要在程式一開始執行時就必須存在。由於函式在程式執行中被呼叫,所以靜態資料成員不能在不論什麼函式內分配空間和初始化。

static資料成員要實際地分配空間。故不能在類的宣告中定義(僅僅能宣告資料成員),也不能在標頭檔案裡類宣告的外部定義,由於那會造成在多個使用該類的原始檔裡,對其反覆定義。

static資料成員必須在類定義體的外部定義(正好一次)。

不像普通資料成員,static成員不是通過類建構函式進行初始化。而是應該在定義時進行初始化。

static成員函式
單例(singleton)模式是保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。

有非常多地方須要這種功能模組。如系統的日誌輸出,gui應用必須是單滑鼠,modem的聯接須要一條且僅僅須要一條**線,作業系統僅僅能有乙個窗體管理器,一台pc連乙個鍵盤。

singleton模式讓類自身負責儲存它的唯一例項。這個類能夠保證沒有其它例項能夠被建立(通過擷取建立新物件的請求)。而且它能夠提供乙個訪問該例項的方法。

singleton

保證乙個唯一的例項

將建立唯一例項的操作隱藏在乙個類操作(即乙個靜態成員函式)後面,由它保證僅僅有乙個例項被建立。

這個操作能夠訪問儲存唯一例項的變數。並且它能夠保證這個變數在返回值之前用這個唯一例項初始化。

在c++中,你能夠用singleton類的靜態成員函式instance來定義這個類操作。singleton還定義乙個靜態成員變數_instance,它包括了乙個指向它的唯一例項的指標。

singleton類定義:

class singleton;

singleton* singleton::_instance = 0;

singleton* singleton::instance()

return _instance;

}

釋放singleton物件
單例類singleton有下面特徵:

它有乙個指向唯一例項的靜態指標_pinstance,而且是私有的;

它有乙個公有的函式。能夠獲取這個唯一的例項。而且在須要的時候建立該例項;

它的建構函式是私有的,這樣就不能從別處建立該類的例項。

我們須要一種方法,正常的刪除該例項

乙個妥善的方法是讓這個類自己知道在合適的時候把自己刪除,或者說把刪除自己的操作掛在作業系統中的某個合適的點上,使其在恰當的時候被自己主動執行。

程式在結束的時候,系統會自己主動析構全部的全域性變數。其實,系統也會析構全部的類的靜態成員變數,就像這些靜態成員也是全域性變數一樣。利用這個特徵。我們能夠在單例類中定義乙個這種靜態成員變數,而它的唯一工作就是在析構函式中刪除單例類的例項。

class csingleton  

static csingleton *m_pinstance;

class cgarbo //它的唯一工作就是在析構函式中刪除csingleton的例項

};

static cgarbo garbo; //定義乙個靜態成員變數,程式結束時。系統會自己主動呼叫它的析構函式

public:

static csingleton * getinstance()

};

類cgarbo被定義為csingleton的私有內嵌類,以防該類被在其它地方濫用。

程式執行結束時,系統會呼叫csingleton的靜態成員garbo的析構函式,該析構函式會刪除單例的唯一例項。

使用這樣的方法釋放單例物件有下面特徵:

在單例類內部定義專有的巢狀類;

在單例類內定義私有的專門用於釋放的靜態成員。

利用程式在結束時析構全域性變數的特性,選擇終於的釋放時機。

使用單例的**不須要不論什麼操作,不必關心物件的釋放。

建立singleton類的子類(單件登錄檔方法)

使用單件登錄檔(registry of singleton),使得singleton類能夠依據名字在乙個眾所周知的登錄檔中註冊它們的單件例項。

這個登錄檔在字串名字和單件之間建立對映。當instance須要乙個單件時,它參考登錄檔,依據名字請求單件。

class singleton;
register以給定的名字註冊singleton例項。為保證註冊簡單。我們將它儲存一列namesingletonpair物件。 每乙個namesingletonpair將乙個名字對映到乙個單件。lookup操作依據給定單件的名字進行查詢。

singleton* singleton::instance()   

return _instance;

}

singleton類能夠在建構函式中來註冊自己。

mysingleton::mysingleton()
由此。singleton類不再負責建立單件。它的主要職責是使得供選擇的單件物件在系統中能夠被訪問。

C語言拾遺 static

c程式一直由下列部分組成 正文段 cpu執行的機器指令部分 乙個程式只有乙個副本 唯讀,防止程式由於意外事故而修改自身指令 初始化資料段 資料段 在程式中所有賦了初值的全域性變數,存放在這裡。非初始化資料段 bss段 在程式中沒有初始化的全域性變數 核心將此段初始化為0。棧 增長方向 自頂向下增長 ...

C 拾遺 類成員指標

c 拾遺 類成員指標 類成員的型別與一般型別不同,那麼類成員的指標型別自然與一般型別的指標有所區別。我們有必要來 下類成員指標的使用。類成員指標是指可以指向類的非靜態成員的指標。它的型別包括了類型別和所指向的成員型別。一般而言,指標指向的是物件,而類成員指標指向的是類成員而非類物件。需要指出,類成員...

《程式設計基礎(C語言)》拾遺

書名 程式設計基礎 c語言 第二版 編著者 張先偉 馬新娟 張立紅 王雲 田愛奎 學院的老師們 版次 2016 年 9 月 第2版 isbn 978 7 302 44086 4 出版社 清華大學出版社 這是我們程設課參考書 教材 自己突然興起想複習,溫故而知新嘛,並且總結總結,更深入的理解c語言吧。...