C++ 特殊类设计:只能在堆、栈上创建的类、无法继承的类、无法拷贝的类、只能创建一个对象的类
生活随笔
收集整理的這篇文章主要介紹了
C++ 特殊类设计:只能在堆、栈上创建的类、无法继承的类、无法拷贝的类、只能创建一个对象的类
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 請設計一個類,不能被拷貝
- 請設計一個類,不能被繼承
- 請設計一個類,只能在堆上創建對象
- 請設計一個類,只能在棧上創建對象
- 請設計一個類,只能創建一個對象
- 餓漢模式
- 懶漢模式
請設計一個類,不能被拷貝
拷貝只會通過拷貝構造函數和賦值運算符重載來實現,所以只需要讓該類無法調用這兩樣東西即可
class CopyBan { public: private:/*c++98寫法,私有化后外界就無法調用CopyBan(const CopyBan&);CopyBan& operator=(const CopyBan&);*///c++11寫法CopyBan(const CopyBan&) = delete;CopyBan& operator=(const CopyBan&) = delete; };請設計一個類,不能被繼承
要想讓一個類不能被繼承,則只需要讓子類無法調用他的構造函數即可
class NonInherit { public:static NonInherit CreateObject(){return NonInherit();} private://構造函數私有化,子類無法調用構造函數,所以無法繼承NonInherit(){} };在C++11中引入了關鍵字final,也可以直接使用final來禁止繼承
class NonInherit final {};請設計一個類,只能在堆上創建對象
首先要做的就是將構造函數私有化,并且防拷貝,防止其他人在棧上生成對象。
接著提供一個接口,在堆中創建對象后將指向對象的指針返回。這個接口必須要是靜態的,因為要調用成員函數必須要通過一個對象, 而因為我們禁用了構造函數和拷貝,無法創建對象,所以只能聲明為靜態函數讓其通過類域來調用這個接口。
請設計一個類,只能在棧上創建對象
思路同上, 直接提供一個創建對象的接口即可。
class StackOnly { public:static StackOnly CreateObject(){return StackOnly();} private:StackOnly(){} };還有一種做法,就是屏蔽new,因為new在底層會調用operator new,所以只需要將他禁用即可。
但是這種方法是有缺陷的,雖然禁用了在堆上創建對象,但是還可以在靜態區創建對象,所以并不是只能在棧上創建對象的類。
class StackOnly { public:StackOnly(){} private:void* operator new(size_t size) = delete;void operator delete(void* p) = delete;};請設計一個類,只能創建一個對象
一個類只能創建一個對象,也就是單例模式。
在上一篇中介紹過單例模式的思路,這里就不贅述了
設計模式 單例模式 :懶漢、餓漢模式實現線程安全的單例模式(C++)
餓漢模式
class EagerSingleton { public://提供給外界一個唯一的對象static EagerSingleton* GetInstance(){return &_inst;}EagerSingleton& operator=(const EagerSingleton&) = delete; //c++11寫法,為了防止拷貝,直接把拷貝構造和賦值運算符刪除EagerSingleton(const EagerSingleton&) = delete; private://構造函數私有化,此時只能創建靜態對象。EagerSingleton(){};/*c++98寫法,將成員函數私有化,使得外界無法調用EagerSingleton& operator=(const EagerSingleton&);EagerSingleton(const EagerSingleton&);*/static EagerSingleton _inst;//使用靜態的成員,因為靜態成員屬于整個類域,是唯一的一份。在程序開始階段創建之后,其他人獲取時只需要返回指向這個對象的指針即可 };EagerSingleton EagerSingleton::_inst; //程序啟動時則創建對象懶漢模式
class LazySingleton { public://獲取對象static LazySingleton* GetInstance(){//雙重檢查,第一重檢驗是否創建對象,防止不必要的加鎖if (_inst == nullptr){//第二重檢驗保證線程安全//_mtx.lock();std::unique_lock<std::mutex> lock(_mtx);//RAII保證因異常拋出導致的安全問題if (_inst == nullptr){_inst = new LazySingleton;}//_mtx.unlock();}return _inst;}//刪除對象static void DelInstance(){std::unique_lock<std::mutex> lock(_mtx);delete _inst;_inst = nullptr;}//運用RAII的思想內嵌一個GC類,程序結束時自動調用析構函數來釋放單例對象class GC{public:~GC(){LazySingleton::DelInstance();}};static GC gc;LazySingleton& operator=(const LazySingleton&) = delete; //c++11寫法,為了防止拷貝,直接把拷貝構造和賦值運算符刪除LazySingleton(const LazySingleton&) = delete; private:LazySingleton(){};/*c++98寫法,將成員函數私有化,使得外界無法調用LazySingleton& operator=(const LazySingleton&);LazySingleton(const LazySingleton&);*/static LazySingleton* _inst;static std::mutex _mtx; };LazySingleton::GC gc; LazySingleton* LazySingleton::_inst = nullptr; std::mutex LazySingleton::_mtx;總結
以上是生活随笔為你收集整理的C++ 特殊类设计:只能在堆、栈上创建的类、无法继承的类、无法拷贝的类、只能创建一个对象的类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 趣谈设计模式 | 单例模式(Single
- 下一篇: C++ 智能指针 :内存泄漏、 RAII