C++特殊類設計 單例模式

在C++編程中,特殊類設計和單例模式是兩個非常重要的高級主題。特殊類設計涉及到一些特定功能類的實現,如不可拷貝類、不可移動類等。而單例模式是一種創建型設計模式,保證一個類只有一個實例,并提供全局訪問點。本文將詳細介紹這兩個主題,并給出具體的實現示例。

一、特殊類設計

1. 不可拷貝類

有時候我們希望一個類的對象不能被拷貝,例如文件操作類、網絡連接類等。實現不可拷貝類的方法是將拷貝構造函數和拷貝賦值運算符聲明為私有或刪除。

class NonCopyable {
public:NonCopyable() = default;~NonCopyable() = default;// 刪除拷貝構造函數和拷貝賦值運算符NonCopyable(const NonCopyable&) = delete;NonCopyable& operator=(const NonCopyable&) = delete;
};
?
2. 不可移動類

不可移動類是指對象不能被移動。實現方法是將移動構造函數和移動賦值運算符聲明為私有或刪除。

class NonMovable {
public:NonMovable() = default;~NonMovable() = default;// 刪除移動構造函數和移動賦值運算符NonMovable(NonMovable&&) = delete;NonMovable& operator=(NonMovable&&) = delete;
};
?
3. 靜態多態類

通過CRTP(Curiously Recurring Template Pattern)實現靜態多態類,可以在編譯期實現多態,提高運行時性能。

template <typename Derived>
class Base {
public:void interface() {static_cast<Derived*>(this)->implementation();}// 可以定義一些默認行為void implementation() {// 默認實現}
};class Derived : public Base<Derived> {
public:void implementation() {// 自定義實現}
};
?

二、單例模式

單例模式確保一個類只有一個實例,并提供一個全局訪問點。常見的實現方法有懶漢式、餓漢式和線程安全的單例。

1. 懶漢式單例

懶漢式單例在第一次使用時創建實例,適用于不需要線程安全的場景。

class Singleton {
public:static Singleton& getInstance() {static Singleton instance;return instance;}private:Singleton() = default;~Singleton() = default;// 禁止拷貝和賦值Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;
};
?
2. 餓漢式單例

餓漢式單例在程序啟動時創建實例,適用于需要線程安全的場景,但會在未使用時也創建實例。

class Singleton {
public:static Singleton& getInstance() {return instance;}private:Singleton() = default;~Singleton() = default;static Singleton instance;// 禁止拷貝和賦值Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;
};// 靜態成員初始化
Singleton Singleton::instance;
?
3. 線程安全的單例

使用C++11中的?std::call_once和?std::once_flag實現線程安全的懶漢式單例。

#include <mutex>class Singleton {
public:static Singleton& getInstance() {std::call_once(initInstanceFlag, &Singleton::initSingleton);return *instance;}private:Singleton() = default;~Singleton() = default;static void initSingleton() {instance = new Singleton();}static Singleton* instance;static std::once_flag initInstanceFlag;// 禁止拷貝和賦值Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;
};// 靜態成員初始化
Singleton* Singleton::instance = nullptr;
std::once_flag Singleton::initInstanceFlag;

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

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

相關文章

springboot集成達夢數據庫,取消MySQL數據庫,解決問題和沖突

一、驅動與連接配置 更換JDBC驅動 在pom.xml中移除MySQL驅動&#xff0c;添加達夢驅動&#xff08;版本根據DM數據庫選擇&#xff09;&#xff1a; <dependency><groupId>com.dameng</groupId><artifactId>DmJdbcDriver</artifactId><versi…

Git 使用快速入門:從基礎命令到倉庫管理全解析

Git 使用快速入門&#xff1a;從基礎命令到倉庫管理全解析 在軟件開發和團隊協作的世界里&#xff0c;版本控制系統是不可或缺的工具。而 Git&#xff0c;憑借其強大的功能、高效的性能以及分布式的特性&#xff0c;已然成為當下最受歡迎的版本控制系統。無論是個人開發者管理項…

Go語言項目工程化 —— 日志、配置、錯誤處理規范

在Go語言中&#xff0c;項目工程化的日志、配置、錯誤處理規范是保障項目可維護性、可觀測性與健壯性的核心實踐之一。本章將從三個方面進行詳解&#xff1a; 一、日志規范 1. 日志的重要性 ? 問題排查的唯一“現場還原”? 性能瓶頸的定位手段? 安全審計的依據 2. 日志庫…

day58python打卡

知識點回顧&#xff1a; 時序建模的流程時序任務經典單變量數據集ARIMA&#xff08;p&#xff0c;d&#xff0c;q&#xff09;模型實戰SARIMA摘要圖的理解處理不平穩的2種差分 n階差分---處理趨勢季節性差分---處理季節性 建立一個ARIMA模型&#xff0c;通常遵循以下步驟&…

centos9安裝

centos-stream-9-stream-BaseOS-x86_64-iso安裝包下載_開源鏡像站-阿里云 用NAT 默認root用戶不能登錄 vim /etc/ssh/sshd_config PermitRootLogin yes 去掉注釋,改為yes 這樣root用戶可以登錄 因為用的NAT模式 這樣可以通過宿主機的50022端口訪問虛擬機 宿主機 ipconfig…

60天python訓練營打卡day‘47

學習目標&#xff1a; 60天python訓練營打卡 學習內容&#xff1a; DAY 47 注意力熱圖可視化 昨天代碼中注意力熱圖的部分順移至今天 知識點回顧&#xff1a; 熱力圖 學習時間&#xff1a; 2025.06.30 浙大疏錦行

GO字符串處理面試題及參考答案(精選60道題)

如何將一個字符串反轉?實現 Reverse("abc") => "cba" 在Go語言中實現字符串反轉需要考慮字符串的編碼方式。Go語言的字符串是基于UTF-8編碼的,而UTF-8是一種變長編碼,每個Unicode碼點(rune)可能由1到4個字節表示。因此,簡單地按字節反轉會破壞多字…

在線swagger 導出 PDF文檔

1.獲取swagger文檔json 點擊左上角的url&#xff0c;下載json文件 2.apifox轉換JSON到Markdown json文件導入 MD文件導出 3.用Mark Text 導入后轉換成PDF

【Linux基礎知識系列】第四十篇 - 定制彩色終端與 Prompt

在使用Linux終端時&#xff0c;一個清晰、易讀且個性化的命令提示符&#xff08;Prompt&#xff09;可以顯著提升工作效率和用戶體驗。通過定制終端的顏色和提示符&#xff0c;用戶可以更直觀地獲取系統信息&#xff0c;同時也能讓終端界面更具個性化。本文將介紹如何通過PS1變…

Spark從入門到熟悉(篇二)

本文介紹Spark的RDD編程&#xff0c;并進行實戰演練&#xff0c;加強對編程的理解&#xff0c;實現快速入手 知識脈絡 包含如下8部分內容&#xff1a; 創建RDD 常用Action操作 常用Transformation操作 針對PairRDD的常用操作 緩存操作 共享變量 分區操作 編程實戰 創…

ADSP-CM408CSWZ-BF高精度ADI雙核精密控制神器 賦能工業4.0核心系統!

ADSP-CM408CSWZ-BF&#xff08;ADI&#xff09;產品解析與推廣文案 1. 產品概述 ADSP-CM408CSWZ-BF 是 Analog Devices Inc.&#xff08;ADI&#xff09; 推出的一款 混合信號控制處理器&#xff0c;屬于 ADSP-CM40x系列&#xff0c;集成了 雙核ARM Cortex-M4 高精度ADC&…

Unity GPU Timeline性能熱點分析與優化指南

一、GPU Timeline技術背景與性能挑戰 1. GPU Timeline核心架構 層級組件性能影響應用層PlayableGraph指令生成效率驅動層CommandBuffer提交開銷硬件層GPU管線并行利用率 2. 典型性能瓶頸 圖表 代碼 下載 性能問題 過度繪制 資源切換 同步等待 FillRate受限 狀態切換…

CAN轉Modbus TCP網關賦能食品攪拌機智能協同控制

在食品攪拌機的自動化控制系統中&#xff0c;設備通信協議的多樣性給系統集成帶來挑戰。JH-CAN-TCP疆鴻智能CAN主站轉Modbus TCP從站的網關&#xff0c;成為連接西門子PLC與伺服系統的關鍵橋梁。 西門子PLC常采用Modbus TCP協議&#xff0c;用于實現與上位機、人機界面等設備的…

30套精品論文答辯開題報告PPT模版

畢業論文答辯開題報告PPT模版&#xff0c;會議報告&#xff0c;座談交流&#xff0c;工作總結&#xff0c;工作匯報&#xff0c;開題報告PPT模版&#xff0c;開題報告論文答辯PPT模版&#xff0c;扁平論文開題報告PPT模版&#xff0c;畢業論文答辯開題報告PPT模版&#xff0c;極…

IDA系列--插件開發-Python版

IDA系列–插件開發-Python版 1. 概述 本文章詳細介紹了基于Python語言的IDA Pro插件開發技術。IDA Pro作為業界領先的反匯編器和逆向工程平臺,其插件架構允許開發者通過Python腳本擴展核心功能。本文涵蓋開發環境配置、核心API使用、典型開發流程及最佳實踐。 2. 開發環境配…

?? 深度學習模型編譯器實戰:解鎖工業級部署新范式??—— 基于PyTorch-MLIR的全流程優化指南(開源工具鏈集成)??

? ??權威實驗數據??&#xff08;來源&#xff1a;MLIR官方GitHub&#xff09; ResNet-50推理時延&#xff1a; ? PyTorch原生&#xff1a;32ms → MLIR優化后&#xff1a;6.3ms &#xff08;加速比??5.1??&#xff09; 峰值顯存占用下降&#xff1a;??1.8GB → 420…

Kafka日常運維命令總結

一、集群管理 前臺啟動Broker bin/kafka-server-start.sh <path>/server.properties關閉方式&#xff1a;Ctrl C 后臺啟動Broker bin/kafka-server-start.sh -daemon <path>/server.properties關閉Broker bin/kafka-server-stop.sh二、Topic管理 操作命令創建To…

如何訓練一個 Reward Model:RLHF 的核心組件詳解

Reward Model&#xff08;獎勵模型&#xff09;是 RLHF 的核心&#xff0c;決定了模型“覺得人類偏好什么”的依據。本文將系統介紹如何從零開始訓練一個 reward model&#xff0c;包括數據準備、模型結構、損失函數、訓練方法與注意事項。 什么是 Reward Model&#xff1f; …

FrozenBatchNorm2d 詳解

FrozenBatchNorm2d 詳解 基本概念 FrozenBatchNorm2d 是 BatchNorm2d 的一種特殊變體,主要用于在模型訓練或推理過程中固定批量統計量(running mean 和 running variance)以及仿射參數(weight 和 bias)。這種凍結操作在以下場景中特別有用: 模型微調(Fine-tuning):當…

Helix Toolkit 在 WPF 中加載帶貼圖素材的模型

引言 在現代應用程序開發中,將 3D 模型集成到桌面應用中變得越來越普遍。無論是建筑可視化、產品設計還是游戲開發,WPF(Windows Presentation Foundation)結合 Helix Toolkit 提供了一個強大的解決方案來展示和操作 3D 內容。本文將指導你如何使用 Helix Toolkit 加載 .ob…