36 特殊類設計

類,不能被拷貝

拷貝只會放生在兩個場景中:拷貝構造函數以及賦值運算符重載,因此想要讓一個類禁止拷貝。

  • c++98
    將拷貝構造函數與賦值云懸浮重載只聲明不定義,并且將其訪問權限設置為私有
class CopyBan{// ...private:CopyBan(const CopyBan&);CopyBan& operator=(const CopyBan&);//...};

原因:
1.設置為私有:如果只聲明沒有設置成private,用戶自己如果在類外定義了,就不能禁止拷貝了
2.只聲明不定義:不定義是y8inwei該函數根本不會調用,定義了也沒有意義,不寫反而更簡單,如果定義了就不會防止成員函數內部拷貝了

  • c++11
    c++11擴展delete的用法,delete除了釋放new申請的資源外,如果在默認成員函數后跟上delete,表示讓編譯器刪掉該默認成員函數
class CopyBan{// ...CopyBan(const CopyBan&)=delete;CopyBan& operator=(const CopyBan&)=delete;//...};

類,只能在堆上創建對象

實現方式:
1.將類的構造函數私有,拷貝構造函數私有。防止別人調用拷貝在棧上生成對象
2.提供一個靜態的成員函數,在該靜態成員函數中完成堆對象的創建
一種是析構私有,提供函數析構,一種是構造私有,提供函數返回創建對象

class HeapOnly    
{     
public:     
static HeapOnly* CreateObject()  {      
return new HeapOnly;    }private:    
HeapOnly() {}// C++98// 1.只聲明,不實現。因為實現可能會很麻煩,而你本身不需要
// 2.聲明成私有
HeapOnly(const HeapOnly&)// or// C++11    
HeapOnly(const HeapOnly&) = delete;};

類,只能在棧上創建對象

將構造函數私有化,設計靜態方法返回,同時防止拷貝構造,返回對象需要用拷貝,將new重載禁掉

class StackOnly{public:static StackOnly CreateObj(){return StackOnly();}// 禁掉operator new可以把下面用new 調用拷貝構造申請對象給禁掉
// StackOnly obj = StackOnly::CreateObj();// StackOnly* ptr3 = new StackOnly(obj);void* operator new(size_t size) = delete;void operator delete(void* p) = delete;private:StackOnly()  
:_a(0){}private:int _a;}

類,不能被繼承

c++98方式

// C++98中構造函數私有化,派生類中調不到基類的構造函數。則無法繼承
class NonInherit{public:static NonInherit GetInstance(){return NonInherit();}private:NonInherit(){}};

c++11方法:
關鍵字final,類不能被繼承

class A  final{// ....};

類,只能創建一個對象(單例模式)

設計模式(Desgin Pattern)是一套被反復使用、多數人知曉的、經過分類的、代碼設計經驗的總結。為什么會產生設計模式這樣的東西?就像人類歷史經過一次次打仗總結的套路,研究了《孫子兵法》

使用設計模式的目的:為了代碼可重用性、讓代碼更容易被他人理解、保證代碼可靠性。設計模式使代碼編寫工程化,是軟件工程的基本脈絡

單例模式
一個類只能創建一個對象,即單例模式。該模式可以保證系統中該類只有一個實例,并提供一個訪問它的全局訪問點,該實例被所有程序模塊共享。比如在某個服務器程序中,該服務器的配置信息存放在一個文件中,這些配置數據由一個單例對象統一讀取,然后服務器進程中的其他對象再通過這個單例對象獲取這些配置信息,這種方式簡化了在復雜環境的配置管理

單例模式有兩種實現模式:

  • 餓漢模式
    在程序啟動的時候就創建唯一的實例對象,不管用不用
class Singleton
{
public:static Singleton* GetInstance(){return &_instance;}private://防拷貝Singleton() {};Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;static Singleton _instance;
};//入口前初始化
Singleton Singleton::_instance;

優點:簡單
缺點:導致進程啟動慢,如果由多個單例類對象實例啟動順序不確定

如果單例對象再多線程高并發環境下頻繁使用,性能要求較高,那么顯然使用餓漢模式來避免資源競爭,提高響應速度更好

  • 懶漢模式
    如果單例對象構造十分耗時或者占用很多資源,比如加載插件,初始化網絡連接讀取文件等,有可能對象程序運行時不會用到,那么也要在程序一開始就初始化,會導致啟動時很慢,這種情況使用懶漢模式(延遲加載)更好

class Singleton
{
public:static Singleton* GetInstance(){if (_instace == nullptr){_instace = new Singleton();}return _instace;}//資源回收class CGarbo{public:CGarbo(){if (_instace){delete _instace;}}};private:Singleton() {};Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;static Singleton* _instace;static CGarbo _garbo;
};Singleton* Singleton::_instace = nullptr;
Singleton::CGarbo _garbo;  //程序結束自動調用析構釋放單例對象//獲取對象
Singleton::GetInstance();

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/43972.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/43972.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/43972.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Apache中使用SSI設置

先停服務在修改httpd.conf,備份下 Apache\Apache24\conf 設置httpd.conf LoadModule ssl_module modules/mod_ssl.so 取消該命令前的注釋符# AddType text/html .shtml AddOutputFilter INCLUDES .shtml 取消該命令前的注釋符# 加入html AddType text/html .…

在 Kotlin 中,`@JvmOverloads` 注解用于為具有默認參數值的函數生成重載方法

在 Kotlin 中,JvmOverloads 注解用于為具有默認參數值的函數生成重載方法。這個注解在你需要從 Java 代碼調用 Kotlin 函數時特別有用,因為 Java 不支持默認參數值。 下面是一個例子,說明 JvmOverloads 的工作原理: Kotlin 代碼…

前端javascript中的排序算法之插入排序

插入排序(Selection Sort)基本思想: 插入排序每次排一個數組項,以此方式構建最后的排序數組。假定第一項已經排序了,接著, 它和第二項進行比較,第二項是應該待在原位還是插到第一項之前呢&#…

軟件工具網站推薦

1.菜鳥工具 菜鳥工具 - 不止于工具菜鳥工具,為開發設計人員提供在線工具,網址導航,提供在線PHP、Python、 CSS、JS 調試,中文簡繁體轉換,進制轉換等工具。致力于打造國內專業WEB開發工具,集成開發環境&…

詳細談談負載均衡的startupProbe探針、livenessProbe探針、readnessProbe探針如何使用以及使用差異化

文章目錄 startupProbe探針startupProbe說明示例配置參數解釋 使用場景說明實例——要求: 容器在8秒內完成啟動,否則殺死對應容器工作流程說明timeoutSeconds: 和 periodSeconds: 參數順序說明 livenessProbe探針livenessProbe說明示例配置參數解釋 使用…

CSS技巧專欄:一日一例 1.純CSS實現 會討好的熱情按鈕 特效

題外話: 從今天開始,我準備開設一個新的專欄,專門寫 使用CSS實現各種酷炫按鈕的方法,本專欄目前準備寫40篇左右,大概會完成如下按鈕效果: 今天,我來介紹第一個按鈕的實現方法:會討好的熱情按鈕。為什么我給它起這樣的名字呢?你看它像不像一個不停搖尾巴的小黃?當你鼠…

【QML之·基礎語法概述】

系列文章目錄 文章目錄 前言一、QML基礎語法二、屬性三、腳本四、核心元素類型4.1 元素可以分為視覺元素和非視覺元素。4.2 Item4.2.1 幾何屬性(Geometry):4.2.2 布局處理:4.2.3 鍵處理:4.2.4 變換4.2.5 視覺4.2.6 狀態定義 4.3 Rectangle4.3.1 顏色 4.4…

1Panel服務器面板支持哪些Linux操作系統?

1Panel面板支持的Linux操作系統版本有哪些?1Panel支持主流Linux發行版本,包括RedHat、CentOS、Ubuntu、Debian、openEuler及其他國產操作系統。支持多種服務器架構,碼筆記整理詳細1Panel面板支持的服務器系統、架構、內存和瀏覽器支持&#x…

【界面態】霍爾效應表征氮化對SiC/SiO2界面陷阱的影響

引言 引言主要介紹了硅碳化物(SiC)金屬-氧化物-半導體場效應晶體管(MOSFETs)作為新一代高壓、低損耗功率器件的商業化背景。SiC MOSFETs因其優越的電氣特性,在高電壓和高溫應用領域具有巨大的潛力。然而,盡…

綜合安全防護

題目 1,DMZ區內的服務器,辦公區僅能在辦公時間內(9:00-18:00)可以訪問,生產區的設備全天可以訪問. 2,生產區不允許訪問互聯網,辦公區和游客區允許訪問互聯網 3,辦公區設備10.0.2.10不允許訪問DMz區的FTP服務器和HTTP服務器,僅能ping通10.0.3.10 4,辦公區分為市場部和研發部,研…

Redis 數據過期及淘汰策略

Redis 數據過期及淘汰策略 過期策略 定時過期 在設置key?的過期時間的同時,為該key?創建一個定時器,讓定時器在key?的過期時間來臨時,對key進行刪除。到過期時間就會立即清除。該策略可以立即清除過期的數據,對內存很友好&a…

動態數據庫設計

動態數據庫設計是一種靈活的方法,用于構建能夠適應不斷變化的數據需求的數據庫結構。它強調在不頻繁修改數據庫表結構的前提下,有效管理和存儲多樣化的數據。以下是實現動態數據庫設計的一些關鍵技術點和策略: 實體-屬性-值(EAV&a…

Rockchip RK3588 - Rockchip Linux SDK腳本分析

---------------------------------------------------------------------------------------------------------------------------- 開發板 :ArmSoM-Sige7開發板eMMC :64GBLPDDR4 :8GB 顯示屏 :15.6英寸HDMI接口顯示屏u-boot &a…

LeetCode //C - 214. Shortest Palindrome

214. Shortest Palindrome You are given a string s. You can convert s to a palindrome by adding characters in front of it. Return the shortest palindrome you can find by performing this transformation. Example 1: Input: s “aacecaaa” Output: “aaacec…

如何在JetBrains中寫Codeforce?

目錄 前言 正文 leetcode 個人喜好 參考資料 具體操作步驟 尾聲 🔭 Hi,I’m Pleasure1234🌱 I’m currently learning Vue.js,SpringBoot,Computer Security and so on.👯 I’m studying in University of Nottingham Ningbo China&#x1f4…

Python函數 之 模塊和包

1.模塊 1, 在Python 中, 每個以 .py 結尾的 Python 代碼?件 都可以稱為是?個模塊。 2, 在模塊中 別?書寫好的功能(變量, 函數, 類),我們可以拿來直接使?。 3, 我們自己寫的代碼文件, 想要作為模塊讓別?使?, 你的代碼?件名(模塊名) 滿足標識符的規…

物流工業三防平板實時跟蹤貨物位置和狀態

在當今全球化和高度數字化的商業環境中,物流行業的高效運作對于企業的成功和經濟的繁榮至關重要。貨物的準確、實時跟蹤不僅能提高物流效率,還能增強客戶滿意度,降低運營成本。物流工業三防平板的出現,為實現貨物位置和狀態的實時…

全網最適合入門的面向對象編程教程:12 類和對象的 Python 實現-Python 使用 logging 模塊輸出程序運行日志

全網最適合入門的面向對象編程教程:12 類和對象的 Python 實現-Python 使用 logging 模塊輸出程序運行日志 摘要: 本文主要介紹了日志的定義和作用,以及 Python 內置日志處理的 logging 模塊,同時簡單說明了日志等級和 logging …

【人工智能】-- 搜索技術(狀態空間法)

個人主頁:歡迎來到 Papicatch的博客 課設專欄 :學生成績管理系統 專業知識專欄: 專業知識 文章目錄 🍉引言 🍈介紹 🍉狀態空間法 🍈狀態空間的構成 🍍狀態 🍍算符…

搜維爾科技:觸覺反饋數據手套CyberGlove擊鼓測試

觸覺反饋數據手套CyberGlove擊鼓測試 搜維爾科技:觸覺反饋數據手套CyberGlove擊鼓測試