關于C++的特殊類定制

特殊類定制

在C++中,一些特殊性質的類如何設計

類禁止拷貝的對象

  • C++11 使用delete關鍵字賦值給拷貝構造和賦值
  • C++98將拷貝構造和賦值聲明在私有里

類只能在堆上創建的對象

  • 將構造函數私有化, 提供一個獲取對象堆上創建對象的公有函數
  • 將析構函數私有化, 提供一個釋放資源公有函數

類只能在棧上創建的對象

  • 將構造函數私有化, 并提供一個獲取棧上創建的對象的公有函數
    然后將operator new函數禁用掉, 但是無法防拷貝(有一定缺陷)

不能被繼承的類

  • C++98將父類構造函數私有化
  • C++11使用final關鍵字修飾父類

單例模式

一個類只能創建一個對象的類(singleton)

即只有唯一的實例對象

  • 餓漢模式: 無論是否使用, 程序創建之前(main函數之前)就構造一個唯一的對象

    1. 先將構造函數私有化
    2. 使用私有的一個靜態的、對應類型的實例化對象成員, 在類內聲明, 類外初始化
    3. 提供一個靜態成員函數獲取到該對象
    • 優點: 簡單, 無線程安全問題
    • 缺點
      1. 單例模式多可能會導致進程的啟動慢
      2. 一個程序中, 有多個單例時, 無法控制其初始化的順序
  • 懶漢模式: 第一次使用對象時再創建實例對象

    • 設計方式同餓漢基本相同, 但調用靜態成員函數時(需要獲取實例對象時)再創建實例對象(new 實例對象)

    • 優點對應著餓漢的缺點

      • 可以控制多個單例的初始化順序
      • 不影響啟動順序
    • 缺點

      • 線程安全問題

        • 需要通過對應加鎖, 以及雙重判斷進行保護
        static ThreadPool<T> *getIntance(int num = g_thread_num){// 雙重判斷, 減少反復的加鎖和解鎖操作(因為只有第一次調用該方法時才會有線程安全問題, 之后都不會)// 加多一個判斷, 后續再來的線程時, 則不需要再進行加解鎖, 只用做一次判斷即可(攔截了大量的無用的訪問鎖的行為->只有第一次訪問鎖有意義)if (pool == nullptr){LockGuard lock(&_smtx);if (pool == nullptr){pool = new ThreadPool<T>(num);}}return pool;
        }
        
  • 單例對象的釋放問題

    • 一般情況下, 單例對象在整個程序運行期間都需要使用, 所以一般都是不釋放的
      單例對象在進程結束后也會進行資源釋放
    • 一些特殊場景需要釋放, 如單例對象析構時, 需要進行一些持久化操作(往文件或者數據庫寫)
      構建一個內嵌的垃圾回收類, 然后聲明一個全局的垃圾回收對象, 當單例對象生命周期到時, 則會自動析構該垃圾對象, 同時釋放單例對象資源

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

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

相關文章

JavaScript面向對象編程入門:從0到1的奇幻之旅【含代碼示例】

JavaScript面向對象編程入門&#xff1a;從零到英雄的奇幻之旅【含代碼示例】 一、OOP&#xff1a;編程界的哈利波特基本概念類與實例 二、揮舞魔杖&#xff1a;創建類與實例基本語法 三、繼承與封裝&#xff1a;家族的力量繼承封裝 四、實戰與技巧&#xff1a;打造堅固的魔法城…

IT行業的現狀與未來發展趨勢:從云計算到量子計算的技術變革

隨著技術的不斷進步&#xff0c;IT行業已經成為推動全球經濟和社會發展的關鍵力量。從云計算、大數據、人工智能到物聯網、5G通信和區塊鏈&#xff0c;這些技術正在重塑我們的生活和工作方式。本文將深入探討當前IT行業的現狀&#xff0c;并展望未來發展趨勢&#xff0c;旨在為…

vscode當前分支有未提交的修改,但是暫時不想提交,想要切換到另一個分支該怎么辦

當前分支有未提交的修改,但是暫時不想提交,想要切換到另一個分支該怎么辦? 首先,可以將當前修改暫存起來,以便之后恢復 git stash 然后切換到目標分支,例如需求A所在分支 git checkout feat-a-jie 修改完A需求后,需要先切換回之前的分支,例如需求B所在分支 git checkout feat…

免費插件集-illustrator插件-Ai插件-文本對象分行

文章目錄 1.介紹2.安裝3.通過窗口>擴展>知了插件4.功能解釋5.總結 1.介紹 本文介紹一款免費插件&#xff0c;加強illustrator使用人員工作效率&#xff0c;進行文本對象分行。首先從下載網址下載這款插件 https://download.csdn.net/download/m0_67316550/87890501&…

通過安全的云開發環境重新發現 DevOps 的心跳

云開發平臺如何“提升” DevOps 首先&#xff0c;我來簡單介紹一下什么是云開發環境&#xff1a;它通常運行帶有應用程序的 Linux 操作系統&#xff0c;提供預配置的環境&#xff0c;允許進行編碼、編譯和其他類似于本地環境的操作。從實現的角度來看&#xff0c;這樣的環境類…

前端 JS 經典:讀取文件原始內容

前言&#xff1a;有些時候在工程化開發中&#xff0c;我們需要讀取文件里面的原始內容&#xff0c;比如&#xff0c;你有一個文件&#xff0c;后綴名為 .myfile&#xff0c;你需要拿到這個文件里的內容&#xff0c;該怎么處理呢。 在 vue2 中&#xff0c;因為 vue2 使用 vue-c…

【算法】前綴和——尋找數組的中心下標

本節博客是用前綴和算法圖解“尋找數組的中心下標”&#xff0c;有需要借鑒即可。 目錄 1.題目2.題意3.前綴和求解4.示例代碼5.細節6.總結 1.題目 題目鏈接&#xff1a;LINK 2.題意 我們以示例1為例來圖解一下題意&#xff1a; 3.前綴和求解 根據已有經驗&#xff0c;我…

Java 讀取 xml 文件的五種方式

在編寫與 XML 數據交互的現代軟件應用時&#xff0c;有效地讀取和解析 XML 文件是至關重要的。XML&#xff08;可擴展標記語言&#xff09;因其靈活性和自我描述性&#xff0c;已成為數據存儲和傳輸的一種普遍格式。對于 Java 開發者來說&#xff0c;Java 提供了多種工具和庫來…

數據庫索引相關的知識點總結

目錄 1. 索引的概念 2. 索引的作用 3. 索引的類型 4. 索引的缺點 5. 索引的使用場景 6. 索引的設計原則 7. 索引的實現技術 8. 索引的優化技巧&#xff1a; 數據庫表的索引是一個非常重要的概念&#xff0c;它類似于一本書的目錄&#xff0c;可以幫助我們快速找到所需的…

Idea工具的使用技巧與常見問題解決方案

一、使用技巧 1、啟動微服務配置 如上圖&#xff0c;在編輯配置選項&#xff0c;將對應的啟動入口類加進去&#xff0c; 增加jvm啟動參數&#xff0c; 比如&#xff1a; -Denvuat 或者 -Denvuat -Dfile.encodingUTF-8 啟動配置可能不是-Denvuat&#xff0c;這個自己看代…

Android 11 Audio音頻系統配置文件解析

在AudioPolicyService的啟動過程中&#xff0c;會去創建AudioPolicyManager對象&#xff0c;進而去解析配置文件 //frameworks/av/services/audiopolicy/managerdefault/AudioPolicyManager.cpp AudioPolicyManager::AudioPolicyManager(AudioPolicyClientInterface *clientIn…

MySQL目錄和文件

MySQL目錄和文件 bin目錄 存儲一些mysql腳本比如mysqld、mysqld-self等等&#xff0c;用于執行mysql一些操作 數據目錄 show variables like datadir;--查看數據目錄位置每一個數據庫都有一個和數據庫名相同的文件夾&#xff1b;MySQL5.7開始每創建一個表&#xff0c;在Innod…

Python機器學習 Tensorflow + keras 實現CNN

一、實驗目的 1. 了解SkLearn Tensorlow使用方法 2. 了解SkLearn keras使用方法 二、實驗工具&#xff1a; 1. SkLearn 三、實驗內容 &#xff08;貼上源碼及結果&#xff09; 使用Tensorflow對半環形數據集分 #encoding:utf-8import numpy as npfrom sklearn.datasets i…

Dynadot API調整一覽

關于Dynadot Dynadot是通過ICANN認證的域名注冊商&#xff0c;自2002年成立以來&#xff0c;服務于全球108個國家和地區的客戶&#xff0c;為數以萬計的客戶提供簡潔&#xff0c;優惠&#xff0c;安全的域名注冊以及管理服務。 Dynadot平臺操作教程索引&#xff08;包括域名郵…

AI Agent教育行業落地案例

【AI賦能教育】揭秘Duolingo背后的AI Agent&#xff0c;讓學習更高效、更有趣&#xff01; ©作者|Blaze 來源|神州問學 引言 隨著科技的迅猛發展&#xff0c;人工智能技術已經逐步滲透到我們生活的各個方面。而隨著AI技術的廣泛應用&#xff0c;教育培訓正引領著一場新的…

149.二叉樹:二叉樹的前序遍歷(力扣)

代碼解決 這段代碼實現了二叉樹的前序遍歷&#xff0c;前序遍歷的順序是&#xff1a;訪問根節點 -> 遞歸遍歷左子樹 -> 遞歸遍歷右子樹。以下是詳細解釋&#xff0c;包括各個部分的注釋&#xff1a; // 二叉樹節點的定義 struct TreeNode {int val; // 節…

php -v在cmd中正常顯示 在vscode中卻報錯

效果展示 原因 在vscode中 終端是 PowerShell PowerShell 默認情況下它不會繼承系統的PATH環境變量 解決方案 使用CMD作為終端 打開VSCode設置&#xff08;File > Preferences > Settings 或 Ctrl,&#xff09;。搜索 terminal.integrated.shell.windows。更改其值…

springboot集成nacos

springboot集成nacos 1.版本2. POM依賴3. nacos服務3.1 下載nacos壓縮包3.2 啟動nacos 4. yaml配置5.Demo5.1 配置中心簡單格式獲取方式普通方式還可以再啟動類上添加注解完成5.2 獲取json格式的demo5.2 自動注冊根據yaml配置 1.版本 nacos版本:2.3.2 springboot版本&#xff…

【已解決】使用StringUtils.hasLength參數輸入空格仍然添加成功定價為負數仍然添加成功

Bug情景 今天在做功能測試時&#xff0c;發現使用使用StringUtils.hasLength&#xff08;&#xff09;方法以及定價為負數時&#xff0c;添加圖書仍然成功 思考過程 0.1 當時在做參數檢驗時用了spring提供的StringUtils工具包&#xff0c;百度/大數據模型說&#xff1a; 0.2…

Redis:redis基礎

Redis Remote Dictionary Service即遠程字典服務 一個基于內存的key-value結構數據庫,在開發中常常作為緩存存儲不經常被改變的數據 基于內存存儲,讀寫性能高 在企業中應用廣泛 Redis介紹 用C語言開發的開源高性能鍵值對數據庫,可以達到10w的qps,可以存儲豐富的value類型…