C++语法 | static静态|单例模式

这里写目录标题

  • [static 关键字](#static 关键字)
      • [静态局部变量 vs 局部变量](#静态局部变量 vs 局部变量)
      • [静态全局变量 vs 全局变量](#静态全局变量 vs 全局变量)
      • [静态成员变量 vs 成员变量](#静态成员变量 vs 成员变量)
      • 静态成员函数
  • 单例模式

static 关键字

在此之前, 先了解一下 static 关键字

静态局部变量 vs 局部变量

在静态局部变量中,变量不会在函数调用结束后销毁,值会保留

变量在函数调用结束后依然存在。

所以每个函数访问的都是同一个 count 。但如果该函数是int count = 0; counter()将都是"函数已被调用1次"

cpp 复制代码
#include <iostream>
using namespace std;

void counter() {
    // 静态局部变量 - 在函数调用之间保持值
    static int count = 0;
    
    count++; // 每次调用增加计数
    cout << "函数已被调用 " << count << " 次" << endl;
}

int main() {
    counter(); // 输出: 函数已被调用 1 次
    counter(); // 输出: 函数已被调用 2 次
    counter(); // 输出: 函数已被调用 3 次
    return 0;
}

.

.

.

静态全局变量 vs 全局变量

静态全局变量 - 只能在当前文件访问

而全局变量 是任何文件都可以访问的

cpp 复制代码
#include <iostream>
using namespace std;

// 静态全局变量 - 只能在当前文件访问
static int counter = 0;

void increment() {
    counter++;
    cout << "计数器值: " << counter << endl;
}

int main() {
    increment(); // 输出: 计数器值: 1
    increment(); // 输出: 计数器值: 2
    increment(); // 输出: 计数器值: 3
    
    return 0;
}

.

.

.

.

静态成员变量 vs 成员变量

基本上等同与静态局部变量 与 局部变量:)

cpp 复制代码
#include <iostream>
using namespace std;

class Counter {
public:
    // 静态成员变量声明
    static int count;
    
    Counter() {
        count++; // 每次创建对象时增加计数
    }
};

// 静态成员变量定义和初始化(必须在类外)
int Counter::count = 0;

int main() {
    cout << "初始计数: " << Counter::count << endl; // 0
    
    Counter obj1;
    cout << "创建obj1后: " << Counter::count << endl; // 1
    
    Counter obj2;
    cout << "创建obj2后: " << Counter::count << endl; // 2
    }

.

.

.

.

静态成员函数

就是专门用来操作静态成员变量的,函数的返回值就是静态局部变量

静态局部变量的作用你懂吧?

只用打出一个商标,后面的都是用同一个商标,这就是单例模式最重要的一点

cpp 复制代码
static Singleton* getInstance()
 { 
	return &instance;
 }

.

.

.

.

单例模式

这里只讨论线程安全下的懒汉模式

cpp 复制代码
class Singleton
{
public:
	
	static Singleton* getInstance()    // 静态成员方法  #2
	{
		static Singleton instance;					// 静态局部变量    #3
		return &instance; 									//返回一个静态局部变量的地址   #4
	}


private:
		
	Singleton() { cout << "Singleton()" << endl; }	  //私有的构造函数  #1
	~Singleton() { cout << "~Singleton()" << endl; }


	Singleton(const Singleton&) = delete;
	Singleton& operator=(const Singleton&) = delete;
};


int main()
{
	Singleton* p1 = Singleton::getInstance(); 
	Singleton* p2 = Singleton::getInstance(); 
	Singleton* p3 = Singleton::getInstance();


	cout << p1 << endl;
	cout << p2 << endl;
	cout << p3 << endl;


	return 0;
}
相关推荐
君义_noip17 小时前
信息学奥赛一本通 1661:有趣的数列 | 洛谷 P3200 [HNOI2009] 有趣的数列
c++·算法·组合数学·信息学奥赛·csp-s
leaves falling17 小时前
C语言内存函数-
c语言·开发语言
至为芯19 小时前
IP6537至为芯支持双C口快充输出的45W降压SOC芯片
c语言·开发语言
hele_two19 小时前
快速幂算法
c++·python·算法
OopspoO19 小时前
C++杂记——Name Mangling
c++
yuanmenghao19 小时前
车载Linux 系统问题定位方法论与实战系列 - 车载 Linux 平台问题定位规范
linux·运维·服务器·网络·c++
小羊羊Python19 小时前
SoundMaze v1.0.1正式发布!
开发语言·c++
浩瀚地学19 小时前
【Java】JDK8的一些新特性
java·开发语言·经验分享·笔记·学习
l1t19 小时前
利用DeepSeek将python DLX求解数独程序格式化并改成3.x版本
开发语言·python·算法·数独
yugi98783821 小时前
基于遗传算法优化主动悬架模糊控制的Matlab实现
开发语言·matlab