面试手搓单例模式C++

《C++设计模式》单例模式 介绍了C++的单例模式 阅读详情
1.想要实现一个单例设计模式,必须遵循以下规则:
  • 私有的构造函数:防止外部代码直接创建类的实例
  • 私有的静态实例变量:保存该类的唯一实例
  • 公有的静态方法:通过公有的静态方法来获取类的实例
2.单例模式主要分为饿汉式和懒汉式:

饿汉式:在类被加载时就会创建该类的实例对象。
懒汉式:在类被加载时不回创建该类的实例对象,在首次要使用该实例时才会创建。

3.C++代码如下:
#include <iostream>
using std::cout;
using std::endl;
//懒汉式
class SingletonLazy{
public:
    static SingletonLazy& getinstance(){
        static SingletonLazy m_instance;
        return m_instance;
    }
public:
    SingletonLazy(const SingletonLazy&) = delete;//禁止拷贝构造函数的调用
    SingletonLazy(SingletonLazy&&) = delete;//禁止移动构造函数的调用
    SingletonLazy& operator=(const SingletonLazy&) = delete;//禁止拷贝赋值操作符的调用
    SingletonLazy& operator=(SingletonLazy&&) = delete;//禁止移动赋值操作符的调用
private:
    SingletonLazy(){
        cout<<"ConstructorLazy called"<<endl;
    }
    ~SingletonLazy(){
        cout<<"DestructorLazy called"<<endl;
    }
};
//饿汉式
class SingletonHungry{
public:
    static SingletonHungry& getinstance(){
        return m_instance;
    }
public:
    SingletonHungry(const SingletonHungry&) = delete;
    SingletonHungry(SingletonHungry&&) = delete;
    SingletonHungry& operator=(const SingletonHungry&) = delete;
    SingletonHungry& operator=(SingletonHungry&&) = delete;
private:
    static SingletonHungry m_instance;
    SingletonHungry(){
        cout<<"ConstructorHungry called"<<endl;
    }
    ~SingletonHungry(){
        cout<<"DestructorHungry called"<<endl;
    }
};
SingletonHungry SingletonHungry::m_instance;
int main(){
    SingletonLazy& instance_1=SingletonLazy::getinstance();
    SingletonHungry& instance_2=SingletonHungry::getinstance();
    return 0;
}
4.代码解释:

由于在main函数之前初始化,所以没有线程安全的问题。但是潜在问题在于no-local static对象(函数外的static对象)在不同编译单元中的初始化顺序是未定义的。也即,static Singleton m_instance;和static Singleton& getInstance()⼆者的初始化顺序不确定,如果在初始化完成之前调⽤ getInstance() ⽅法会返回⼀个未定义的实例。
这是最推荐的一种单例实现方式:
1.静态内部类的特性完全符合懒汉式单例模式的特点,在加载外部类时不会创建静态内部类,在静态内部类中的属性被调用时才会创建,如果静态内部类的属性被static修饰,只会实例化一次。
2.通过局部静态变量的特性保证了线程安全,不需要使用共享指针,代码简洁,不需要使用互斥锁,没有双重检查锁定模式的风险。
3.注意在使用的时候需要声明单例的引用 SingletonPattern_V3& 才能获取对象。

运行结果:

ConstructorHungry called
ConstructorLazy called
DestructorLazy called
DestructorHungry called

分析运行结果:

1.ConstructorHungry called:饿汉式单例在类加载时初始化。
2.ConstructorLazy called:懒汉式单例在第一次调用 getinstance() 时初始化。
3.DestructorLazy called 和 DestructorHungry called:析构函数按照与构造函数相反的顺序被调用。

C++经典面试题--单例模式 class Lock { private: CCriticalSection m_cs; public: Lock(CCriticalSection cs) : m_cs(cs) { m_cs.Lock(); } ~Lock() { m_cs.Unlock(); } }; class Singleton { private: Singleton(); S 阅读详情

相关推荐

25届秋招大厂C++面试八股文总结(含腾讯、字节、米哈游、百度等等)持续更新中

hello,大家好,我是B站UP主:码农Mark。新一届秋季招聘即将开启,以下是我总结了24年秋季招聘各个大厂常问的考题(有视频讲解),希望对研二大三即将秋招的同学有一点帮助。

资料qun832218493 2002

单例模式——C++版本

懒汉模式的缺点是在创建实例对象的时候有安全问题,但这样可以减少内存的浪费(如果用不到就不去申请内存了)。饿汉模式则相反,在我们不需要这个实例对象的时候,它已经被创建出来,占用了一块内存。

感觉画质不如...原神的博客 667

【面试百战-30】手撕单例模式

指令重排(Instruction Reordering)确实是双重检查锁模式中需要特别注意的问题,特别是在C++11之前的版本中。让我详细解释这个问题及其解决方案。

m0_69378371的博客 384

C++八股(面试题、手撕题)自用版

所谓虚函数就是在基类定义一个未实现的函数名,为了提高程序的可读性,建议后代中虚函数都加上。

weixin_48703074的博客 1970

划重点:面试中单例模式的考点!(C++版本)

在Jungle的上一篇文章《设计模式那么多!面试官会怎么问》中,总结了在面试过程中经常考察的设计模式及相关考点。文中提到,单例模式几乎是必考点。这并不是危言耸听或者夸大其词。面试中“设计模式三剑客”(单例模式、工厂模式和观察者模式)里单例模式首当其冲!(用词不当?)设计模式那么多!面试官会怎么问?https://blog.youkuaiyun.com/sinat_21107433/article/details/120557373 1. 单例模式的概念 单例模式: 确保一个类只有一个实例,并提供一个全局访问点.

冯Jungle的个人博客 1794

YOLOV8主干改进方法:C2f-Dual——DualConv轻量化双卷积设计(附改进代码)

DualConv是一种创新的卷积网络结构,旨在构建轻量级的深度神经网络。它通过结合3×3和1×1的卷积核处理相同的输入特征映射通道,优化了信息处理和特征提取。DualConv利用组卷积技术高效排列卷积滤波器,大大降低了计算成本和参数数量。

m0_74890428的博客 4700

C++面试宝典设计模式之单例模式

软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。设计模式是面试热门考点,掌握设计模式可以让你深入理解面向对象思想,使设计方案更加灵活,方便后期维护修改。单例模式属于创建型模式,这种模式涉及到一种单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一对象的方式。单例类的特征: 1.单例类最多只能有一个实例。

wyhplus的博客 1133

Matlab/simulink频率响应分析方法

Matlab/Simulink仿真系列问题一.电气模块与信号模块 一.电气模块与信号模块

virtuoso~晓晓 3万+

单例模式 C++

懒汉,饿汉,解决内存泄漏,双检锁,原子,C++11 magic static,模板类

IT OR 考公? 2204

更新3ds时和用读卡器读取传输文件操作不当导致的tf卡损坏无法读取需要格式化时出现的问题以及不想丢失文件并且修复的详细解决方法

前言: 不小心按了同意更新而且tf/sd卡损坏导致了3ds打开后都是出现 Anerror has occurred:(红色的) Failed to apply 1 FIRM patch(es). Press any button to shotdown 这样的画面,按了任意键后就关机,我找了很多资料和大佬的回答解决了这些问题,现在记录一下。 一.不小心按了更新导致上述的画面 原因:是因为系统升级了,但是里面的Luma3DS还没有更新,属于是更新了但没有完全更新的状态。 **修复方法** 1.首先请按

give_me_fish的博客 1万+

树莓派介绍与可安装的操作系统

树莓派是一款由英国树莓派基金会开发的信用卡大小的微型计算机。处理器(CPU)内存(RAM)图形处理器(GPU)USB 接口网络接口(以太网和 Wi-Fi)视频输出(HDMI)音频输出用户只需添加电源、存储卡、显示器和输入设备(键盘、鼠标),就可以将其当作一台功能齐全的电脑使用。主要特点:低成本:价格亲民,适合教育和个人项目。小巧便携:体积小,便于携带和部署。功能强大:支持多种编程语言和操作系统,功能不逊于传统电脑。树莓派从最初的教育工具发展成为功能强大的多用途平台。最新的树莓派 5。

像风一样自由的博客 2198

C++八股 —— 单例模式

网络编程的设计模式

m0_46329175的博客 1928

【测绘程序设计】——潮汐调和分析

最小二乘潮汐调和分析源码、使用示例及数据

C_xxy's blog 2653

c++中的单例模式面试

单例模式核心是控制对象唯一性,在多线程环境下需要保证线程安全。实际开发中我更倾向于使用 C++11 的局部静态变量懒汉模式实现,简洁、安全、高效。

JC的博客 487

MVSNet (pytorch版) 搭建环境 运行dtu数据集重建 实操教程(图文并茂、超详细)

MVSNet (pytorch版) 代码注释版 下载 (注释非常详细,代码结构有所调整,使用起来更方便) 深度学习三维重建 MVSNet-ECCV-2018 (源码、pytorch版、原文+注释、译文+批注)Meshlab查看三维点云时 ,使用技巧总结。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 2938

社区版 ABAP MCP 能不能读取 SAP S/4HANA 公有云开发对象,我的判断是能试,但不能当成已被 SAP 背书的标准通道

文章摘要:当前存在多个社区项目(如mcp-abap-adt、mcp-abap-abap-adt-api等)通过包装ABAP ADT能力为MCP Server,使AI开发工具能读取ABAP对象。这些项目技术上依赖ADT HTTP API或SAP官方ADT language server,但针对SAP S/4HANA Cloud Public Edition的完整适配仍存在挑战。SAP官方已通过VS Code扩展提供ADT MCP能力,而社区方案在云环境下需遵循ABAP Cloud的严格限制,仅能访问已授权的开

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 87

cpp单例模式的实现

单例模式的意义 保证全局只会创建一个对象,比如 日志模块全局只有一个,windows的任务管理器等,这样可以避免频繁的创建销毁对象,还可以避免对共享资源的多重占用,具体例子和好处坏处看参考资料[9],不赘述 几种考虑 几个要考虑的问题:懒加载;;线程安全生存周期的考虑;;反序列化;;反射单例;;克隆单例 首先是一个唯一性,保证全部成员只能访问到一个共同的对象 为了防止对象被创建多次,要把构造函数设为private,以防止被他人调用重复建立,而自己单独实现一个接口用来获取实例(可以把构造函数当作这个

ptgood的博客 1865

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【CPP面经】CPP后台开发面试经历

指针本身是常量,不可修改指向的地址,但可修改指向的值。

Ape's IT Blog 1374

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【CPP】CPP经典面试题

多重继承可能导致菱形继承问题(Diamond Problem),即一个类从两个基类继承,而这两个基类又共同继承自同一个基类,导致派生类中包含多个相同的基类子对象。虚函数是用于实现多态的机制。显式特化是为特定类型提供完全不同的实现,而部分特化是为特定类型的一部分提供不同的实现。显式特化是为特定类型提供完全不同的实现,而部分特化是为特定类型的一部分提供不同的实现。RAII 原则是指将资源的生命周期与对象的生命周期绑定,通过对象的构造函数获取资源,通过析构函数释放资源,确保资源在对象销毁时自动释放。

Ape's IT Blog 1886

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C++手撕代码

内存管理(智能指针、动态数组)、设计模式(单例)、数据结构操作(链表、队列)、算法实现(排序、反转)、多线程同步(线程安全队列)。代码需兼顾正确性(边界条件、异常安全)和可读性(命名规范、注释),面试时需边写边解释思路,体现对底层原理的理解。

weixin_59005084的博客 610

【手撕代码】单例模式

面试过程中,经常被遇到手写单例模式的代码,本文就常用的几种单例模式的写法进行总结。 单例模式,就是一个应用程序中,某个类的实例对象只有一个,你没有办法去 new,因为构造器是被 private 修饰的,一般通过 getInstance() 的方法来获取它们的实例。 一、懒汉式 用到时再去创建 public class Singleton { private static Sin...

Java学习 1236

C++从面试常考实现特殊类到单例模式的实现

C++从面试常考实现特殊类到单例模式的实现

小杰312的博客 1300

【面试】c++单例模式

【面试】c++单例模式 1. 单例模式 #include <iostream> using namespace std; class CSingleton { private: CSingleton() {} // 构造是私有的 ...

豆子 327

面试官:小伙子手撕个单例模式来看看?

如何短时间内快速手撕一个单例模式?

m0_68872612的博客 906
上一篇: 原码,反码,补码,移码的表示范围以及数据溢出
下一篇: 计算机简历投递,面试总结,技术分享,实习感悟
CodeCheers
博客等级 码龄5年 154粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值