0

0

c++怎么实现单例模式_c++单例模式实现与应用解析

下次还敢

下次还敢

发布时间:2025-10-15 16:26:02

|

265人浏览过

|

来源于php中文网

原创

单例模式确保类唯一实例并提供全局访问点。C++中常用懒汉式(线程安全双重检查)、饿汉式(程序启动初始化)和局部静态变量法(C++11推荐,自动线程安全、延迟加载)。适用于日志器、配置管理、数据库连接池等场景,现代C++首选局部静态变量实现。

c++怎么实现单例模式_c++单例模式实现与应用解析

单例模式是一种常用的设计模式,确保一个类只有一个实例,并提供一个全局访问点。在C++中,实现单例模式需要控制构造函数的访问权限、禁止拷贝和赋值操作,并保证线程安全。下面介绍几种常见的C++单例模式实现方式及其应用场景。

懒汉式单例(延迟初始化)

懒汉式在第一次使用时才创建实例,节省资源。但需注意多线程环境下的安全性。

// 线程安全的懒汉式单例

class Singleton {
private:
    static Singleton* instance;
    static std::mutex mtx;

    // 私有构造函数
    Singleton() = default;

    // 禁止拷贝和赋值
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;

public:
    static Singleton* getInstance() {
        if (instance == nullptr) {
            std::lock_guard<:mutex> lock(mtx);
            if (instance == nullptr) {
                instance = new Singleton();
            }
        }
        return instance;
    }
};

// 静态成员定义
Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mtx;

这种方式使用双重检查锁定(Double-Checked Locking)减少锁竞争,适合多线程环境。

饿汉式单例(程序启动时初始化)

饿汉式在程序启动时就创建实例,天然线程安全,适用于对象创建开销小或必须提前初始化的场景。

立即学习C++免费学习笔记(深入)”;

class Singleton {
private:
    static Singleton instance;

    Singleton() = default;
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;

public:
    static Singleton& getInstance() {
        return instance;
    }
};

// 全局静态实例
Singleton Singleton::instance;

由于静态变量在程序加载时初始化,无需加锁,性能更好,但可能浪费资源。

响应式黑色展台设计整站模板1.4.2
响应式黑色展台设计整站模板1.4.2

响应式黑色展台设计整站模板,自带内核安装即用,图片文本实现可视化,方便修改,支持多种内容模型及自定义功能,可根据需要自行添加。模板特点: 1、安装即用,自带人人站CMS内核及企业站展示功能(产品,新闻,案例展示等),并可根据需要增加表单 搜索等功能(自带模板) 2、支持响应式 3、前端banner轮播图文本均已进行可视化配置 4、伪静态页面生成 5、支持内容模型、多语言、自定义表单、筛选、多条件搜

下载

局部静态变量法(推荐写法)

C++11起,局部静态变量的初始化是线程安全的,代码简洁且高效。

class Singleton {
private:
    Singleton() = default;
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;

public:
    static Singleton& getInstance() {
        static Singleton instance;
        return instance;
    }
};

这是最推荐的方式:自动线程安全、延迟初始化、无需手动管理内存,析构也由系统完成。

单例模式的应用场景

单例常用于以下情况:

  • 日志记录器:整个系统共用一个日志对象
  • 配置管理器:统一读取和保存配置信息
  • 数据库连接池:避免频繁创建连接
  • 硬件接口访问:如打印机、串口设备等资源有限的场景

使用单例能避免资源冲突,减少内存开销,提高访问效率。

基本上就这些。选择哪种实现方式取决于是否需要延迟加载、线程安全要求以及C++标准支持程度。现代C++推荐使用局部静态变量法,简洁又可靠。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

757

2023.08.22

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

526

2023.09.20

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

53

2025.08.29

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

99

2025.10.23

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1049

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

86

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

455

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

11

2026.01.19

AO3中文版入口地址大全
AO3中文版入口地址大全

本专题整合了AO3中文版入口地址大全,阅读专题下面的的文章了解更多详细内容。

1

2026.01.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
【web前端】Node.js快速入门
【web前端】Node.js快速入门

共16课时 | 2万人学习

计算机系统从应用层到底层
计算机系统从应用层到底层

共6课时 | 0.3万人学习

Vue.js 微实战--十天技能课堂
Vue.js 微实战--十天技能课堂

共18课时 | 1.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号