巧用建構函式與析構函式對資料進行設定和恢復

2021-09-05 23:51:00 字數 1249 閱讀 7717

在開發的時候會遇到這種情況,就是在執行某些功能的時候要對一些環境變數或配置資訊進行修改,功能執行完畢之後再把這些變數或配置資訊設定恢復回去。舉個例子:有些遊戲只能在解析度為800*600的環境下執行,如果要在解析度1024*768的電腦上玩,就要在執行遊戲的時候把解析度改為800*600,退出遊戲的時候再把解析度改回1024*768。

其實處理這樣的情況也不是很難,我們可以寫乙個設定環境變數或配置資訊的函式和恢復環境變數或配置資訊的函式,在呼叫某項功能函式之前呼叫設定函式,之後呼叫恢復函式。可能會有如下的偽碼片斷:

......

set();

dosomething();

resume();

......

如果有很多地方都有類似上面的偽碼,那麼就得要求程式設計師牢記在呼叫功能函式之前和之後分別呼叫設定和恢復環境變數或配置資訊的函式。那有沒有更好的辦法來解決這種問題呢?

答案是,有!

我們知道建構函式的主要作用是完成對類物件的初始化工作,而析構函式的作用與建構函式相反,在物件的生命期結束的時候,由系統自動呼叫。那麼我們就可以把設定環境變數或配置資訊的功能在建構函式裡面實現,而在析構函式中實現對環境變數或配置資訊的恢復。那樣我們只要在呼叫功能函式之前宣告乙個區域性變數,建構函式會對環境變數或配置資訊進行設定,而在作用域結束的時候,系統會自動呼叫析構函式來恢復環境變數或配置資訊。下面以乙個簡單的例子來說明:

class clxbeginend ;

// 這裡以輸出一句話來代替對環境變數的設定和恢復

clxbeginend::clxbeginend()

clxbeginend::~clxbeginend()

void lxtest()

輸出結果很明顯:

output from constructor of clss clxbeginend!

do something in function lxtest!

output from destructor of clss clxbeginend!

這樣,就可以用一行宣告變數的**實現對環境變數或配置資訊的設定和恢復。省去了在實現功能之前和之後分別呼叫兩個函式的麻煩。為了幫助記憶,可以給這個類起乙個更好記、更能表明含義的名字。下面就是乙個例子:

typedef struct configsetresume_

configsetresume;

之所以用結構體,是因為這樣寫起來比較簡單。我們知道,在c++中,類和結構體本質上是一樣的。它們的區別就在於,類的成員預設是私有的,而結構體的成員預設是公有的。

巧用建構函式與析構函式對資料進行設定和恢復

在開發的時候會遇到這種情況,就是在執行某些功能的時候要對一些環境變數或配置資訊進行修改,功能執行完畢之後再把這些變數或配置資訊設定恢復回去。舉個例子 有些遊戲只能在解析度為800 600的環境下執行,如果要在解析度1024 768的電腦上玩,就要在執行遊戲的時候把解析度改為800 600,退出遊戲的...

建構函式與析構函式

建構函式 主要作用就是為物件初始化。有一點要說的是,在繼承體系彙總,如果在建構函式中,如果沒有指定基類的建構函式,那麼編譯器會在建構函式開頭加入,基類的預設建構函式,這樣就可以初始化基類物件部分 析構函式 對於析構函式,要說的多點,實際也不太複雜,就是加入了virtual 使其具有了多型性質 inc...

建構函式與析構函式

建構函式 先看看建構函式的呼叫順序規則,只要我們在平時程式設計的時候遵守這種約定,任何關於建構函式的呼叫問題都能解決 建構函式的呼叫順序總是如下 1.基類建構函式。如果有多個基類,則建構函式的呼叫順序是某類在類派生表中出現的順序,而不是它們在成員初始化表中的順序。2.成員類物件建構函式。如果有多個成...