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;
}
相关推荐
泡海椒13 分钟前
PDF 表格样式优化:jquick-pdf 边框、圆角、背景色
java·开发语言·pdf
Beyond_System|系统之外1 小时前
【学编程】Python基础编程题100道(21-60)
开发语言·python·算法
景熙55231 小时前
15.Java 8 Stream 流入门到实战
java·开发语言·数据结构
汉克老师2 小时前
GESP2026年9月认证C++六级( 第三部分编程题(1、数组划分))精讲
c++·gesp·小学生·学c++编程
千里码aicood2 小时前
基于PLC与机器视觉的智能分拣控制系统设计
c++·自动化·plc
漂流瓶jz3 小时前
UVA-1442 洞穴 题解答案代码 算法竞赛入门经典第二版
c++·算法·题解·aoapc·算法竞赛入门经典·uva
朽棘不雕3 小时前
进一步了解模板
c++
Bruce_Liuxiaowei4 小时前
Python 实例赋值遮蔽类属性:一个从不报错的静默陷阱
开发语言·python·语法糖
aramae5 小时前
MySQL内置函数(7)
开发语言·笔记·后端·mysql·其他
汉克老师6 小时前
CSP-J 2026 初赛试题解析(第一部分:选择题(8-15))精讲
c++·csp-j·小学生·学c++编程