外貿(mào)自己做網(wǎng)站杭州seo首頁優(yōu)化軟件
特殊類定制
在C++中,一些特殊性質(zhì)的類如何設(shè)計(jì)
類禁止拷貝的對(duì)象
- C++11 使用delete關(guān)鍵字賦值給拷貝構(gòu)造和賦值
- C++98將拷貝構(gòu)造和賦值聲明在私有里
類只能在堆上創(chuàng)建的對(duì)象
- 將構(gòu)造函數(shù)私有化, 提供一個(gè)獲取對(duì)象堆上創(chuàng)建對(duì)象的公有函數(shù)
- 將析構(gòu)函數(shù)私有化, 提供一個(gè)釋放資源公有函數(shù)
類只能在棧上創(chuàng)建的對(duì)象
- 將構(gòu)造函數(shù)私有化, 并提供一個(gè)獲取棧上創(chuàng)建的對(duì)象的公有函數(shù)
然后將operator new函數(shù)禁用掉, 但是無法防拷貝(有一定缺陷)
不能被繼承的類
- C++98將父類構(gòu)造函數(shù)私有化
- C++11使用final關(guān)鍵字修飾父類
單例模式
一個(gè)類只能創(chuàng)建一個(gè)對(duì)象的類(singleton)
即只有唯一的實(shí)例對(duì)象
-
餓漢模式: 無論是否使用, 程序創(chuàng)建之前(main函數(shù)之前)就構(gòu)造一個(gè)唯一的對(duì)象
- 先將構(gòu)造函數(shù)私有化
- 使用私有的一個(gè)靜態(tài)的、對(duì)應(yīng)類型的實(shí)例化對(duì)象成員, 在類內(nèi)聲明, 類外初始化
- 提供一個(gè)靜態(tài)成員函數(shù)獲取到該對(duì)象
- 優(yōu)點(diǎn): 簡(jiǎn)單, 無線程安全問題
- 缺點(diǎn)
- 單例模式多可能會(huì)導(dǎo)致進(jìn)程的啟動(dòng)慢
- 一個(gè)程序中, 有多個(gè)單例時(shí), 無法控制其初始化的順序
-
懶漢模式: 第一次使用對(duì)象時(shí)再創(chuàng)建實(shí)例對(duì)象
-
設(shè)計(jì)方式同餓漢基本相同, 但調(diào)用靜態(tài)成員函數(shù)時(shí)(需要獲取實(shí)例對(duì)象時(shí))再創(chuàng)建實(shí)例對(duì)象(new 實(shí)例對(duì)象)
-
優(yōu)點(diǎn)對(duì)應(yīng)著餓漢的缺點(diǎn)
- 可以控制多個(gè)單例的初始化順序
- 不影響啟動(dòng)順序
-
缺點(diǎn)
-
線程安全問題
- 需要通過對(duì)應(yīng)加鎖, 以及雙重判斷進(jìn)行保護(hù)
static ThreadPool<T> *getIntance(int num = g_thread_num){// 雙重判斷, 減少反復(fù)的加鎖和解鎖操作(因?yàn)橹挥械谝淮握{(diào)用該方法時(shí)才會(huì)有線程安全問題, 之后都不會(huì))// 加多一個(gè)判斷, 后續(xù)再來的線程時(shí), 則不需要再進(jìn)行加解鎖, 只用做一次判斷即可(攔截了大量的無用的訪問鎖的行為->只有第一次訪問鎖有意義)if (pool == nullptr){LockGuard lock(&_smtx);if (pool == nullptr){pool = new ThreadPool<T>(num);}}return pool; }
-
-
-
單例對(duì)象的釋放問題
- 一般情況下, 單例對(duì)象在整個(gè)程序運(yùn)行期間都需要使用, 所以一般都是不釋放的
單例對(duì)象在進(jìn)程結(jié)束后也會(huì)進(jìn)行資源釋放 - 一些特殊場(chǎng)景需要釋放, 如單例對(duì)象析構(gòu)時(shí), 需要進(jìn)行一些持久化操作(往文件或者數(shù)據(jù)庫(kù)寫)
構(gòu)建一個(gè)內(nèi)嵌的垃圾回收類, 然后聲明一個(gè)全局的垃圾回收對(duì)象, 當(dāng)單例對(duì)象生命周期到時(shí), 則會(huì)自動(dòng)析構(gòu)該垃圾對(duì)象, 同時(shí)釋放單例對(duì)象資源
- 一般情況下, 單例對(duì)象在整個(gè)程序運(yùn)行期間都需要使用, 所以一般都是不釋放的