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 分钟前
java字符串
java·开发语言
Hi2024021725 分钟前
Qt+Qml客户端和Python服务端的网络通信原型
开发语言·python·qt·ui·网络通信·qml
chxii27 分钟前
ISO 8601日期时间标准及其在JavaScript、SQLite与MySQL中的应用解析
开发语言·javascript·数据库
Teable任意门互动36 分钟前
主流多维表格产品深度解析:飞书、Teable、简道云、明道云、WPS
开发语言·网络·开源·钉钉·飞书·开源软件·wps
程序员大雄学编程1 小时前
「用Python来学微积分」16. 导数问题举例
开发语言·python·数学·微积分
Dreams_l2 小时前
redis中的数据类型
java·开发语言
梵得儿SHI2 小时前
Java IO 流详解:字符流(Reader/Writer)与字符编码那些事
java·开发语言·字符编码·工作原理·字符流·处理文本
太过平凡的小蚂蚁2 小时前
Kotlin 协程中常见的异步返回与控制方式(速览)
开发语言·前端·kotlin
007php0072 小时前
京东面试题解析:同步方法、线程池、Spring、Dubbo、消息队列、Redis等
开发语言·后端·百度·面试·职场和发展·架构·1024程序员节
想唱rap3 小时前
C++ list 类的使用
c语言·开发语言·数据结构·c++·笔记·算法·list