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;
}
相关推荐
郭涤生24 分钟前
不同主机之间网络通信-以太网连接复习
开发语言·rk3588
山居秋暝LS28 分钟前
【无标题】RTX00安装paddle OCR,win11不能装最新的,也不能用GPU
开发语言·r语言
卢锡荣33 分钟前
单芯通吃,盲插标杆 —— 乐得瑞 LDR6020,Type‑C 全场景互联 “智慧芯”
c语言·开发语言·计算机外设
Xin_ye1008637 分钟前
C# 零基础到精通教程 - 第七章:面向对象编程(入门)——类与对象
开发语言·c#
AI科技星1 小时前
《数学公理体系·第三部·数术几何》(2026 年版)
c语言·开发语言·线性代数·算法·矩阵·量子计算·agi
小小编程路1 小时前
C++ 多线程与并发
java·jvm·c++
审判长烧鸡1 小时前
【Go工具】go-playground是什么组织?官方的?
开发语言·安全·go
kkeeper~2 小时前
0基础C语言积跬步之字符函数与字符串函数(上)
c语言·开发语言
hhb_6182 小时前
Swift核心技术难点与实战案例解析
开发语言·ios·swift
一楼的猫2 小时前
从工具链视角对比:番茄作家助手 vs 第三方写作辅助方案
java·服务器·开发语言·前端·学习·chatgpt·ai写作