【C++】单例模式

本文深入探讨了单例模式中为何采用静态成员变量实现单例对象,并解析了静态成员变量的初始化时机。通过具体的代码示例介绍了单例模式的实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#单例模式

  • 问题一
    为什么单例模式中的单例对象是用static修饰?为什么单例模式中的单例选择用静态成员的方式去实现?
  • 问题二
    这个静态成员变量什么时候被初始化呢?

##问题一

为什么单例模式中的单例对象是用static修饰?为什么单例模式中的单例选择用静态成员的方式去实现?

单例模式的使用方式是:需要采用一种方法,实现这样的一种工具。即未经实例化的去使用一个类。这个要求决定了需要使用静态成员变量来实现单例对象。类的静态成员变量属于类本身,为类的对象所共用,是c++数据共享的一个体现。而且静态变量的初始化是早于

##问题二

这个静态成员变量什么时候被初始化呢?


All static data is initiald to zero when the first object is created, if no other initialization is present. tutorialspoint.com
如果没有出现其他的初始化过程,静态变量会在第一个对象创建出来是被初始化成0。

要点

  • 私有构造函数
  • 公有静态函数 GetInstance()
  • 私有静态成员 __instance

.h文件


class One{
public:
    static One* GetInstance();
private:
    One(){}
    One(One&);
    One(const One&);
    const One& operator=(One&);
    const One& operator=(const One&);

private:
    static One* __instance;
};

.cpp文件


One* One::__instance = nullptr;

One* One::GetInstance(){
    if (__instance == nullptr)
        __instance = new One();
    return __instance;
}

宏定义版本


//单例模式声明和实现

#define SINGLETON_DEFINE(CLASS_NAME) public:    \
        static CLASS_NAME* GetInstance();       \
    private: CLASS_NAME(){}                     \
    CLASS_NAME(CLASS_NAME&);                    \
    CLASS_NAME(const CLASS_NAME&);              \
    const CLASS_NAME& operator=(CLASS_NAME&);                 \
    const CLASS_NAME& operator=(const CLASS_NAME&);           \
    private:                                    \
    static CLASS_NAME* __instance;              \


#define SINGLETON_IMPLETE(CLASS_NAME) \
    CLASS_NAME* CLASS_NAME::__instance = nullptr; \
    CLASS_NAME* CLASS_NAME::GetInstance(){       \
    if (CLASS_NAME::__instance == nullptr)       \
    {CLASS_NAME::__instance = new One();}        \
    return CLASS_NAME::__instance;}              \
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值