【C++】单例模式

【C++】单例模式


文章目录


前言

本篇文章将讲到,静态成员变量,静态函数,以及单例模式案例。


一、静态成员变量

静态成员变量

静态成员变量 :编译阶段就分配了内存

类内声明 、类外初始化

静态成员变量 所有对象都共享同一份数据

静态成员变量也有访问权限, 私有权限类外访问不到

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


class Person
{
public:
	//1、静态成员变量
	//静态成员变量 :编译阶段就分配了内存
	//类内声明 、类外初始化
	//静态成员变量 所有对象都共享同一份数据
	static int m_A;
private:

	static int m_B;
};
int Person::m_A = 100;
int Person::m_B = 100;

void test01()
{
	//1.通过对象进行访问
	Person p1;
	cout << p1.m_A << endl;

	Person p2;
	p2.m_A = 0;

	cout << p1.m_A << endl;

	//2.通过类名进行访问
	cout << Person::m_A << endl;

	//静态成员变量也有访问权限, 私有权限类外访问不到
	//cout << Person::m_B << endl;


}


int main()
{
	test01();

	system("pause");
	return EXIT_SUCCESS;
}

二、静态函数

所有对象都共享同一份函数

静态成员函数 只可以访问 静态成员变量,不可以访问非静态成员变量

静态成员函数 也是有访问权限的

静态成员函数 有两种访问方式:通过对象 、通过类名

静态成员函数也是有访问权限的

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


class Person
{
public:
	static int m_A;
	int m_c;
	static void func()
	{
		//m_c = 100;//静态成员函数 不能访问非静态成员变量
		m_A = 100;//静态成员函数 能访问静态成员变量
		cout << "func的调用" << endl;
	}

private:
	static int m_B;//私有静态成员变量

	static void func2()
	{

	}
};

int Person::m_A = 0;
int Person::m_B = 0;


void test02()
{
	//通过对象
	Person p1;
	p1.func();
	cout << p1.m_A << endl;
	//通过类名
	Person::func();


	//Person::func2();//静态成员函数也是有访问权限的
}

int main()
{
	test02();
	system("pause");
	return EXIT_SUCCESS;
}

三、单例模式案例 ------ 打印机案例

通过一个类 只能实例化唯一的一个对象

私有化

默认构造

拷贝构造

唯一实例指针

cpp 复制代码
#define  _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
#include<string>

class Printer
{
public:
	int m_Count;

	static Printer* getInstance()
	{
		return printer;
	}
	void printText(string text)
	{
		m_Count++;
		cout << text << endl;
	}
private:
	Printer()
	{
		m_Count = 0;
	}
	Printer(const Printer& p) {}

	static Printer* printer;

};

Printer* Printer::printer = new Printer;


void test01()
{
	Printer* p1 = Printer::getInstance();
	p1->printText("入职证明");
	p1->printText("离职证明");
	p1->printText("加薪申请");
	p1->printText("旅游申请");

	cout << "打印机使用次数: " << p1->m_Count << endl;

	Printer* p2 = Printer::getInstance();
	p2->printText("调休申请");

	cout << "打印机使用次数: " << p1->m_Count << endl;
}

int main() {
	//	cout << "mian函数调用" << endl;

	test01();

	system("pause");
	return EXIT_SUCCESS;
}

总结

到这里这篇文章的内容就结束了,谢谢大家的观看,如果有好的建议可以留言喔,谢谢大家啦!

相关推荐
艾莉丝努力练剑36 分钟前
【LeetCode&数据结构】单链表的应用——反转链表问题、链表的中间节点问题详解
c语言·开发语言·数据结构·学习·算法·leetcode·链表
还债大湿兄2 小时前
《C++内存泄漏8大战场:Qt/MFC实战详解 + 面试高频陷阱破解》
c++·qt·mfc
倔强青铜35 小时前
苦练Python第18天:Python异常处理锦囊
开发语言·python
u_topian5 小时前
【个人笔记】Qt使用的一些易错问题
开发语言·笔记·qt
珊瑚里的鱼6 小时前
LeetCode 692题解 | 前K个高频单词
开发语言·c++·算法·leetcode·职场和发展·学习方法
AI+程序员在路上6 小时前
QTextCodec的功能及其在Qt5及Qt6中的演变
开发语言·c++·qt
xingshanchang6 小时前
Matlab的命令行窗口内容的记录-利用diary记录日志/保存命令窗口输出
开发语言·matlab
Risehuxyc6 小时前
C++卸载了会影响电脑正常使用吗?解析C++运行库的作用与卸载后果
开发语言·c++
AI视觉网奇6 小时前
git 访问 github
运维·开发语言·docker
不知道叫什么呀6 小时前
【C】vector和array的区别
java·c语言·开发语言·aigc