【hello C++】特殊類設計

目錄

一、設計一個類,不能被拷貝

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

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

四、請設計一個類,不能被繼承

五、請設計一個類,只能創建一個對象(單例模式)



?C++🌷

一、設計一個類,不能被拷貝

拷貝只會發生在兩個場景中:拷貝構造函數以及賦值運算符重載;
因此 想要讓一個類禁止拷貝, 只需讓該類不能調用 拷貝構造函數 以及 賦值運算符重載 即可
  • C++98
將拷貝構造函數與賦值運算符重載只聲明不定義,并且將其訪問權限設置為私有即可。
// C++98
class CopyBan
{private:Person(const CopyBan&);Person& operator=(const CopyBan&);
};
原因:
1. 設置成私有:如果只聲明沒有設置成 private ,用戶自己如果在類外定義了,就可以不能禁止拷貝了;
2. 只聲明不定義:不定義是因為該函數根本不會調用,定義了其實也沒有什么意義,不寫反而還簡單,而且如果定義了就不會防止成員函數內部拷貝了。
  • 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;
};

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

  • 方法一:同上將構造函數私有化,然后設計靜態方法創建對象返回即可。
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 關鍵字, final? 修飾類,表示該類不能被繼承。
class A ?final
{// ....
};

五、請設計一個類,只能創建一個對象(單例模式)

設計模式:
設計模式( Design Pattern )是一套 被反復使用、多數人知曉的、經過分類的、代碼設計經驗
總結 。為什么會產生設計模式這樣的東西呢?就像人類歷史發展會產生兵法。最開始部落
之間打仗時都是人拼人的對砍。后來春秋戰國時期,七國之間經常打仗,就發現打仗也是有
套路 的,后來孫子就總結出了《孫子兵法》。孫子兵法也是類似。使用設計模式的目的:為
了代碼可重用性、讓代碼更容易被他人理解、保證代碼可靠性。 設計模式使代碼編寫真正工
程化;設計模式是軟件工程的基石脈絡,如同大廈的結構一樣。
單例模式:
一個類只能創建一個對象,即單例模式,該模式可以保證系統中該類只有一個實例,并提供
一個 訪問它的全局訪問點,該實例被所有程序模塊共享 。比如在某個服務器程序中,該服務
器的配置信息存放在一個文件中,這些配置數據由一個單例對象統一讀取,然后服務進程中
的其他對象再通過這個單例對象獲取這些配置信息,這種方式簡化了在復雜環境下的配置管
理。
單例模式有兩種實現模式:
  • 餓漢模式
就是說不管你將來用不用,程序啟動時就創建一個唯一的實例對象。
// 餓漢模式
// 優點:簡單
// 缺點:可能會導致進程啟動慢,且如果有多個單例類對象實例啟動順序不確定。
class Singleton
{
public:static Singleton* GetInstance(){return &m_instance;}
private:// 構造函數私有Singleton() {};// C++98 防拷貝Singleton(Singleton const&);Singleton& operator=(Singleton const&);// or// C++11Singleton(Singleton const&) = delete;Singleton& operator=(Singleton const&) = delete;static Singleton m_instance;
};Singleton Singleton::m_instance; ?// 在程序入口之前就完成單例對象的初始化
如果這個單例對象在多線程高并發環境下頻繁使用,性能要求較高,那么顯然使用餓漢模式
來避免資源競爭,提高響應速度更好。
  • 懶漢模式
如果單例對象構造十分耗時或者占用很多資源,比如加載插件啊, 初始化網絡連接啊,讀取
文件啊等等,而有可能該對象程序運行時不會用到,那么也要在程序一開始就進行初始化,
就會導致程序啟動時非常的緩慢。 所以這種情況使用懶漢模式(延遲加載 )更好。
// 懶漢
// 優點:第一次使用實例對象時,創建對象。進程啟動無負載。多個單例實例啟動順序自由控制。
// 缺點:復雜
#include <iostream>
#include <mutex>
#include <thread>
using namespace std;class Singleton
{
public:static Singleton* GetInstance() {// 注意這里一定要使用Double-Check的方式加鎖,才能保證效率和線程安全if (nullptr == m_pInstance) {m_mtx.lock();if (nullptr == m_pInstance) {m_pInstance = new Singleton();}m_mtx.unlock();}return m_pInstance;}// 實現一個內嵌垃圾回收類 ? ?class CGarbo {public:~CGarbo() {if (Singleton::m_pInstance)delete Singleton::m_pInstance;}};// 定義一個靜態成員變量,程序結束時,系統會自動調用它的析構函數從而釋放單例對象static CGarbo Garbo;
private:// 構造函數私有Singleton() {};// 防拷貝Singleton(Singleton const&);Singleton& operator=(Singleton const&);static Singleton* m_pInstance; // 單例對象指針static mutex m_mtx; ? //互斥鎖
};Singleton* Singleton::m_pInstance = nullptr;
Singleton::CGarbo Garbo;
mutex Singleton::m_mtx;int main()
{thread t1([] {cout << &Singleton::GetInstance() << endl; });thread t2([] {cout << &Singleton::GetInstance() << endl; });t1.join();t2.join();cout << &Singleton::GetInstance() << endl;cout << &Singleton::GetInstance() << endl;return 0;
}

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

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

相關文章

Sentinel使用實例

不說了&#xff0c;直接上官方文檔 https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/readme-zh.md Sentinel Example 項目說明 本項目演示如何使用 Sentinel starter 完成 Spring Clo…

【金融量化】對企業進行估值的方法有哪些?

估值的方法有哪些&#xff1f; 如何對企業進行估值&#xff1f;有2個方法估算。 1 絕對估值法 它是一種定價模型&#xff0c;用于計算企業的內在價值。 比如說你可以根據公司近N年的現金流情況。借此去預測未來N年的現金流情況。所有的現金流數據都可以在年報上查詢到。最后…

ios 知識

IOS 類文件.h和.m中interface的區別 大家都知道我們在創建類文件時會發現&#xff1a; #import <UIKit/UIKit.h>interface ViewController : UIViewControllerend和 #import "ViewController.h"interface ViewController ()end那么他們之間有何區別呢&#x…

【Ajax】回調地獄解決方法

回調地獄&#xff08;Callback Hell&#xff09;是指在異步編程中&#xff0c;特別是在嵌套的回調函數中&#xff0c;代碼變得深度嵌套、難以閱讀和維護的現象。這通常發生在處理多個異步操作時&#xff0c;每個操作都依賴于前一個操作的結果。回調地獄使代碼變得難以理解、擴展…

顯卡服務器適用于哪些場景

顯卡&#xff08;GPU&#xff09;服務器&#xff0c;簡單來說&#xff0c;GPU服務器是基于GPU的應用于視頻編解碼、深度學習、科學計算等多種場景的快速、 穩定、彈性的計算服務。那么壹基比小鑫告訴你顯卡服務器主要的用途有哪一些。 一、運行手機模擬器 顯卡服務器可支持…

力扣:62. 不同路徑(Python3)

題目&#xff1a; 一個機器人位于一個 m x n 網格的左上角 &#xff08;起始點在下圖中標記為 “Start” &#xff09;。 機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角&#xff08;在下圖中標記為 “Finish” &#xff09;。 問總共有多少條不同的路徑&…

WebRTC音視頻通話-WebRTC本地視頻通話使用ossrs服務搭建

iOS開發-ossrs服務WebRTC本地視頻通話服務搭建 之前開發中使用到了ossrs&#xff0c;這里記錄一下ossrs支持的WebRTC本地服務搭建。 一、ossrs是什么&#xff1f; ossrs是什么呢&#xff1f; SRS(Simple Realtime Server)是一個簡單高效的實時視頻服務器&#xff0c;支持RTM…

STM32CubeIDE的安裝和黑色主題及自動補全代碼

STM32CubeIDE之前用過一點時間&#xff0c;但后來因為不習慣放棄了最近在新電腦上又用起來了&#xff0c;感覺相對之前好了很多&#xff0c;其實如果在工作中基本使用的是STM32,用意法的生態軟件也挺好的&#xff0c;意法最近在這塊也在大力發展&#xff0c;STM32CubeIDE安裝包…

【BASH】回顧與知識點梳理(十三)

【BASH】回顧與知識點梳理 十三 十三. 文件內容查閱13.1 直接檢視文件內容&#xff1a;cat, tac, nlcat (concatenate)tac (反向列示)nl (添加行號打印) 13.2 可翻頁檢視&#xff1a;more, lessmore (一頁一頁翻動)less (一頁一頁翻動) 13.3 資料擷取&#xff1a;head, tailhea…

【Linux】云服務器自動化部署VuePress博客(Jenkins)

前言 博主此前是將博客部署在 Github Pages&#xff08;基于 Github Action&#xff09;和 Vercel 上的&#xff0c;但是這兩種部署方式對于國內用戶很不友好&#xff0c;訪問速度堪憂。因此將博客遷移到自己的云服務器上&#xff0c;并且基于 Jenkins&#xff08;一款開源持續…

浪涌保護器中SPD防雷模塊的主要應用方案

浪涌保護器&#xff08;Surge Protective Device&#xff0c;SPD&#xff09;是一種用于限制瞬態過電壓和導引泄放電涌電流的非線性防護器件&#xff0c;用以保護耐壓水平低的電器或電子系統免遭雷擊及雷擊電磁脈沖或操作過電壓的損害。SPD可以將過電壓泄放到地線或限制過電壓到…

類與對象(入門)

目錄 1.前言 2.類的引入 3.類的定義 4.類的訪問限定符及封裝 4.1 訪問限定符 4.2 封裝 5.類的作用域 6.類的實例化 7. 結構體內存對齊規則 8.this指針 8.1 this指針的引出 8.2 this指針的特性 1.前言 C 是 基于面向對象 的&#xff0c; 關注 的是 對象 &#xff0c;…

【Spring】核心容器——依賴自動裝配

Spring容器根據bean所依賴的資源在容器中自動查找并注入bean的過程叫做自動裝配自動裝配的方式 1、按類型 2、按名稱&#xff08;耦合性較高&#xff09; 3、按構造方法 自動裝配特點 1、自動裝配用于對引用類型進行依賴注入&#xff0c;不能對簡單類型進行操作 2、自動裝配的…

多元最短路(Floyd)

是一個基于動態規劃的全源最短路算法。它可以高效地求出圖上任意兩點之間的最短路 時間復雜度 O(n^3) 狀態轉移方程 f[i][j]min(f[i][j],f[i][k]f[k][j]) 核心代碼 void floyd(){for(int k1;k<n;k)for(int i1;i<n;i)for(int j1;j<n;j)s[i][j]min(s[i][j],s[i][k…

Vue前端 更具router.js 中的meta的roles實現路由衛士,實現權限判斷。

參考了之篇文章 1、我在登陸時獲取到登錄用戶的角色名roles&#xff0c;并存入sessionStorage中&#xff0c;具體是在login頁面實現&#xff0c;還是在menu頁面實現都可以。在menu頁面實現&#xff0c;可以顯得登陸快一些。 2、編寫router.js&#xff0c;注意&#xff0c;一個…

Spring 事務詳解

目錄 一、概述二、事務的特性&#xff08;ACID&#xff09;三、Spring 的事務管理3.1 編程式事務管理3.2 編程式事務管理 四、Spring 事務管理接口及其定義的屬性4.1 PlatformTransactionManager:事務管理接口4.2 TransactionDefinition:事務屬性4.3 TransactionStatus:事務狀態…

【基礎類】—前后端通信類系統性學習

一、什么是同源策略及限制 同源策略限制從一個源加載的文檔或腳本如何與來自另一個源的資源進行交互。這是一個用于隔離潛在惡意文件的關鍵的安全機制。源&#xff1a;協議、域名和端口&#xff0c; 默認端口是80 三者有一個不同&#xff0c;即源不同&#xff0c;就是跨域 ht…

Stable Diffusion+Temporal-kit 半虛半實應用

1.先下載temporal-kit,重啟webui 2.下載好ffmpeg,配置好環境,下載Ebsynth 3.準備好你需要的視頻,拖到預處理視頻位置 4.填寫參數,點解保存設置,然后并點擊生成,會生成到目標文件夾的input位置 5.然后拉出input文件夾里面你想切換成處理的幀圖片,然后填寫prompt查看效…

中國省級、城市-數字經濟創新創業、分項指數(2010-2020年)

一、數據介紹 數據名稱&#xff1a;中國省級、城市-數字經濟創新創業、分項指數 數據年份&#xff1a;2010-2020年 數據范圍&#xff1a;31省、336個城市 數據來源&#xff1a;北大企業大數據研究中心 二、參考文獻 參考文獻&#xff1a; 戴若塵,王艾昭,陳斌開.中國數字…

Win10使用Guest和空密碼訪問共享的完整步驟

目錄 前言 啟動Guest 給予Guest網絡權限 允許空密碼登陸 啟用不安全的來并登陸 總結 前言 我們經常需要使用空密碼和guest賬戶訪問Windows共享&#xff0c;因為某些設備不支持輸入密碼等&#xff0c;那么該如何設置呢&#xff0c;因為步驟比較固定而且繁瑣&#xff0c;于…