日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ 特殊类设计:只能在堆、栈上创建的类、无法继承的类、无法拷贝的类、只能创建一个对象的类

發布時間:2024/4/11 c/c++ 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 {};

請設計一個類,只能在堆上創建對象

首先要做的就是將構造函數私有化,并且防拷貝,防止其他人在棧上生成對象。
接著提供一個接口,在堆中創建對象后將指向對象的指針返回。這個接口必須要是靜態的,因為要調用成員函數必須要通過一個對象, 而因為我們禁用了構造函數和拷貝,無法創建對象,所以只能聲明為靜態函數讓其通過類域來調用這個接口。

namespace lee {class HeapOnly{public:static HeapOnly* CreateObject(){return new HeapOnly();}private:HeapOnly(){}//c++11,防拷貝HeapOnly(const HeapOnly&) = delete;HeapOnly& operator=(const HeapOnly&) = delete;/*c++98寫法HeapOnly(const HeapOnly&);HeapOnly& operator=(const HeapOnly&);*/}; };

請設計一個類,只能在棧上創建對象

思路同上, 直接提供一個創建對象的接口即可

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++ 特殊类设计:只能在堆、栈上创建的类、无法继承的类、无法拷贝的类、只能创建一个对象的类的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。