c++单例实践
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修饰也不行。
// 1.hstatic int StaticGlobalVar = 2;void funct();// 1.cpp#include "1.h"int GlobalVar = StaticGlobalVar;void funct(){ std::cout 前排留名,哈哈哈
页:
[1]