0

0

c++中如何实现单例模式_c++设计模式之单例模式实现方法

裘德小鎮的故事

裘德小鎮的故事

发布时间:2025-10-11 17:19:01

|

568人浏览过

|

来源于php中文网

原创

单例模式通过私有构造函数、禁用拷贝和赋值,确保类唯一实例并提供全局访问点。饿汉式在程序启动时创建实例,线程安全,适用于对启动时间不敏感的场景,通过类外定义静态成员实现。懒汉式在首次调用时初始化,节省资源,但需处理线程安全问题。C++11后推荐使用局部静态变量的Meyer's Singleton,延迟初始化且自动线程安全。对于需精细控制生命周期或兼容旧标准的情况,可采用std::unique_ptr配合std::mutex实现带锁的懒汉式,避免内存泄漏。选择方式应根据项目需求和C++标准支持决定,现代C++中Meyer's Singleton为首选方案。

c++中如何实现单例模式_c++设计模式之单例模式实现方法

单例模式确保一个类只有一个实例,并提供一个全局访问点。在C++中实现单例模式,关键在于控制构造函数的访问权限、禁止拷贝和赋值,并保证线程安全的实例创建。

饿汉式(Eager Initialization)

饿汉式在程序启动时就创建实例,天然线程安全,适用于对启动时间不敏感的场景。

实现方式:静态成员变量在类外定义并初始化,对象在加载时即被构造。

示例代码:

class Singleton {
private:
    static Singleton instance;  // 静态实例
    Singleton() = default;     // 私有构造函数

public: Singleton(const Singleton&) = delete; Singleton& operator=(const Singleton&) = delete;

static Singleton& getInstance() {
    return instance;
}

void doSomething() {
    // 示例方法
}

};

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

// 类外定义静态成员 Singleton Singleton::instance;

懒汉式(Lazy Initialization) + 双重检查锁定

懒汉式在第一次调用时才创建实例,节省资源,但需处理多线程并发问题。

C++11以后,使用局部静态变量可实现“Meyer's Singleton”,简洁且线程安全。

推荐写法(基于C++11局部静态):

迷你天猫商城
迷你天猫商城

迷你天猫商城是一个基于Spring Boot的综合性B2C电商平台,需求设计主要参考天猫商城的购物流程:用户从注册开始,到完成登录,浏览商品,加入购物车,进行下单,确认收货,评价等一系列操作。 作为迷你天猫商城的核心组成部分之一,天猫数据管理后台包含商品管理,订单管理,类别管理,用户管理和交易额统计等模块,实现了对整个商城的一站式管理和维护。所有页面均兼容IE10及以上现代浏览器。部署方式1、项目

下载
class Singleton {
private:
    Singleton() = default;

public: Singleton(const Singleton&) = delete; Singleton& operator=(const Singleton&) = delete;

static Singleton& getInstance() {
    static Singleton instance;  // 局部静态变量,延迟初始化,线程安全
    return instance;
}

void doSomething() {
    // 示例方法
}

};

带智能指针的懒汉式(手动管理)

若需要更精细控制生命周期或兼容旧标准,可用std::unique_ptr配合互斥锁实现。

注意:需确保析构顺序安全,避免静态析构问题。

#include 
#include 

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

Singleton() = default;

public: Singleton(const Singleton&) = delete; Singleton& operator=(const Singleton&) = delete;

static Singleton* getInstance() {
    std::lock_guard lock(mtx);
    if (!instance) {
        instance = std::unique_ptr(new Singleton);
    }
    return instance.get();
}

};

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

// 类外定义 std::unique_ptr Singleton::instance = nullptr; std::mutex Singleton::mtx;

关键要点总结

  • 私有化构造函数、拷贝构造和赋值操作符,防止外部创建多个实例
  • 使用static局部变量是C++11后最简洁安全的方式
  • 饿汉式适合简单场景,懒汉式适合资源敏感型应用
  • 多线程环境下必须保证初始化过程的线程安全
  • 避免动态分配带来的内存泄漏风险,优先使用上静态对象

基本上就这些。选择哪种方式取决于项目需求和C++标准支持情况。Meyer's Singleton 是现代C++中最常用也最推荐的做法。

相关专题

更多
c语言const用法
c语言const用法

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

516

2023.09.20

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

359

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

558

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

462

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

1

2025.12.24

数据库Delete用法
数据库Delete用法

数据库Delete用法:1、删除单条记录;2、删除多条记录;3、删除所有记录;4、删除特定条件的记录。更多关于数据库Delete的内容,大家可以访问下面的文章。

264

2023.11.13

drop和delete的区别
drop和delete的区别

drop和delete的区别:1、功能与用途;2、操作对象;3、可逆性;4、空间释放;5、执行速度与效率;6、与其他命令的交互;7、影响的持久性;8、语法和执行;9、触发器与约束;10、事务处理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

204

2023.12.29

苹果官网入口直接访问
苹果官网入口直接访问

苹果官网直接访问入口是https://www.apple.com/cn/,该页面具备0.8秒首屏渲染、HTTP/3与Brotli加速、WebP+AVIF双格式图片、免登录浏览全参数等特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

115

2025.12.24

拼豆图纸在线生成器
拼豆图纸在线生成器

拼豆图纸生成器有PixelBeads在线版、BeadGen和“豆图快转”;推荐通过pixelbeads.online或搜索“beadgen free online”直达官网,避开需注册的诱导页面。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

84

2025.12.24

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 5.3万人学习

C 教程
C 教程

共75课时 | 3.6万人学习

C++教程
C++教程

共115课时 | 9.8万人学习

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

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