肿抢
2025-9-21 16:02:55
C++单例实践
在日常开发中,虽然太多的单例调用会让代码的耦合度变高,但是例如日志类这种,单例模式就变得非常有。所以这篇文章为大家介绍static 关键字相关知识以及如何实现自己的C++单例类。
static关键字
首先让我们请出今天的主角: static。C++中有一个关键字——static,用static修饰的变量或者函数,都会变得不同。根据cpp reference中关于static的描述,static主要有几个作用:
- 使全局变量变为内部链接性。
- 修饰块作用域变量,其静态存储时间跟随程序并且只会初始化一次。
- 修饰类成员,使其与类相关,而非对象。
修饰全局变量
首先补充一下全局变量相关的基础:
假设你在头文件中定义了一个变量,此时你在多个文件里都包含了这个头文件,因为你想在这些地方都共用这个变量。然后你编译代码,发现编译器报错并提示你“xxx重定义”。- // 1.h
- int GlobalVar = 1;
- // 1.cpp
- #include "1.h"
- int LocalVar = GlobalVar;
- // main.cpp
- #include "1.h"
- int main()
- {
- int var = GlobalVar;
- return 0;
- }
复制代码 问题出在哪呢?让我们回顾一下预处理相关的知识,包含一个头文件,编译器在预处理阶段就会将头文件中的内容展开。回到刚刚的问题,你在多个文件中都包含这个头文件,此时编译器发现有多个地方都声明并且定义了一个GlobalVar,所以就会报错。那么怎样能够在别的文件中使用这个变量呢?别担心,C++提供了extern关键字,来帮助你使用全局变量:- // 1.h
- extern int GlobalVar;
- // 1.cpp
- #include "1.h"
- int GlobalVar = 1;
- int LocalVar = GlobalVar;
- // main.cpp
- #include "1.h"
- int main()
- {
- int var = GlobalVar;
- return 0;
- }
复制代码 你需要在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 |
|
|
|
相关推荐
|
|