找回密码
 立即注册
首页 业界区 业界 c++单例实践

c++单例实践

肿抢 2025-9-21 16:02:55
C++单例实践

在日常开发中,虽然太多的单例调用会让代码的耦合度变高,但是例如日志类这种,单例模式就变得非常有。所以这篇文章为大家介绍static 关键字相关知识以及如何实现自己的C++单例类。
static关键字

首先让我们请出今天的主角: static。C++中有一个关键字——static,用static修饰的变量或者函数,都会变得不同。根据cpp reference中关于static的描述,static主要有几个作用:

  • 使全局变量变为内部链接性。
  • 修饰块作用域变量,其静态存储时间跟随程序并且只会初始化一次。
  • 修饰类成员,使其与类相关,而非对象。
修饰全局变量

首先补充一下全局变量相关的基础:
假设你在头文件中定义了一个变量,此时你在多个文件里都包含了这个头文件,因为你想在这些地方都共用这个变量。然后你编译代码,发现编译器报错并提示你“xxx重定义”。
  1. // 1.h
  2. int GlobalVar = 1;
  3. // 1.cpp
  4. #include "1.h"
  5. int LocalVar = GlobalVar;
  6. // main.cpp
  7. #include "1.h"
  8. int main()
  9. {
  10.     int var = GlobalVar;
  11.     return 0;
  12. }
复制代码
问题出在哪呢?让我们回顾一下预处理相关的知识,包含一个头文件,编译器在预处理阶段就会将头文件中的内容展开。回到刚刚的问题,你在多个文件中都包含这个头文件,此时编译器发现有多个地方都声明并且定义了一个GlobalVar,所以就会报错。那么怎样能够在别的文件中使用这个变量呢?别担心,C++提供了extern关键字,来帮助你使用全局变量:
  1. // 1.h
  2. extern int GlobalVar;
  3. // 1.cpp
  4. #include "1.h"
  5. int GlobalVar = 1;
  6. int LocalVar = GlobalVar;
  7. // main.cpp
  8. #include "1.h"
  9. int main()
  10. {
  11.     int var = GlobalVar;
  12.     return 0;
  13. }
复制代码
你需要在1.h中使用extern声明这个变量,然后在1.cpp中定义这个全局变量。此时任何包含1.h的地方都能够正常使用这个全局变量了。
回到正轨,用static修饰这个全局变量,会有什么效果呢?用static修饰变量,那么这个变量将会变成内部链接性,什么叫内部链接性呢?就是说这个变量只在当前源文件才被可见,即使用extern修饰也不行
[code]// 1.hstatic int StaticGlobalVar = 2;void funct();// 1.cpp#include "1.h"int GlobalVar = StaticGlobalVar;void funct(){    std::cout

相关推荐

3 天前

举报

前排留名,哈哈哈
您需要登录后才可以回帖 登录 | 立即注册