【C++ 单例模式】static MyLog * getInstance()详解
static MyLog * getInstance();
是一个典型的单例模式(Singleton Pattern)中的成员函数声明。单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。
1、语法分析
static MyLog * getInstance();
1.1 实例地址
其中,使用 MyLog * getInstance()
返回 MyLog
类实例的地址(即指针),主要有以下几个原因,同时地址本身并不需要符合类的规则,但指针指向的对象需要符合该类的定义和规则:
1. 延迟初始化
单例模式中,有时候并不希望在程序启动时就创建实例,而是在第一次调用 getInstance()
时才进行创建,这就是延迟初始化。使用指针可以方便地实现这一点,因为可以先将指针初始化为 nullptr
,在需要时再动态分配内存创建实例:
class MyLog {
private:
static MyLog* instance;
MyLog() {}
public:
static MyLog* getInstance() {
if (instance == nullptr) {
instance = new MyLog();
}
return instance;
}
};
MyLog* MyLog::instance = nullptr;
在上述代码中,通过判断 instance
是否为 nullptr
来决定是否创建新的实例,实现了延迟初始化
2、跨作用域访问
指针允许在不同的作用域中访问同一个对象。在单例模式中,全局访问点 getInstance()
可以在程序的任何地方被调用,返回的指针可以被传递到不同的函数或类中,方便在不同的地方使用同一个单例对象:
void someFunction() {
MyLog* log = MyLog::getInstance();
log->log("Message from someFunction");
}
在 someFunction
函数中,通过 getInstance()
获取单例对象的指针并使用它。
3. 多态性支持
如果 MyLog
类是一个基类,并且有派生类,使用指针可以支持多态性。可以返回指向派生类对象的基类指针,从而实现不同的行为:
1 class MyLog {
2 public:
3 virtual void log(const std::string& msg) {
4 // 基类的日志记录实现
5 }
6 static MyLog* getInstance();
7 };
8
9 class DebugLog : public MyLog {
10 public:
11 void log(const std::string& msg) override {
12 // 派生类的日志记录实现
13 }
14 };
15
16 MyLog* MyLog::getInstance() {
17 static MyLog* instance = new DebugLog();
18 return instance;
19 }
在这个例子中,getInstance()
返回的是指向 DebugLog
对象的 MyLog
指针,通过虚函数实现了多态调用。
4、关于地址和类的关系地址本身:
- 地址只是一个内存中的位置标识,它本身并没有类型信息,也不需要符合类的规则。地址只是一个整数,代表了内存中的一个特定位置。指针指向的对象:虽然地址本身没有类型,但指针是有类型的。
MyLog *
类型的指针意味着它指向的内存位置存储的是一个MyLog
类的对象。这个对象必须符合MyLog
类的定义和规则,包括拥有MyLog
类的成员变量和成员函数,并且遵循MyLog
类的访问控制规则(如私有成员只能在类内部访问)。
分类:
C++
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律