C++技术——static、单例模型

本文深入探讨C++中static关键字的使用,包括static成员变量和成员函数的生命周期、存储位置及如何正确初始化。并通过单例模式的实现,展示static在确保类唯一实例中的应用,特别关注LCD设备类的封装,保证程序中LCD操作的一致性和效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 static成员变量:

生命周期:从定义开始到进程结束,与类关联,独立于对象。

存储:静态局部变量,静态全局变量都存储在数据段

static修饰的成员变量---先于类的对象而存在(可以直接通过类名使用--前提成员是公有)

static修饰的成员变量--是被这个类的所有对象共用

static修饰的成员变量要在类外初始化  数据类型  类名::变量名 = 值

二 static成员函数:

static修饰成员函数----先于类的对象而存在(可以直接通过类名使用--前提成员是公有)

static修饰的成员函数---该方法没有this指针,在该函数中不能操作非static修饰的成员。

三 (好资料转载,关于static 修饰变量、函数具体知识点讲解)点击

四  单实例模式--使用静态成员变量+静态成员函数

/* 单实例模型实例:封装LCD设备,无论程序在那访问,
都是通过static LcdDevice* sharedLcdDevice() 来获取LCD,从而操作LCD。
*/
#include <iostream>
using namespace std;
class LcdDevice //LCD类
{	
public:
	static LcdDevice* sharedLcdDevice()//成员方法没有this指针
	{
		if(instance == NULL)//如果为空则调用构造函数,
		//通常整个进程生命周期,因为instance 是静态变量只调用一次。
		{
			instance = new LcdDevice();
		}
		return instance; 
	}

/*把构造函数和拷贝构造函数设置为私有,为了避免下面这两种可以成功调用
LcdDevice mylcd;(声明对象)     LcdDevice mylcd=*lcd;(拷贝对象)
我们希望整个程序调用LCD入口只有LcdDevice* lcd = LcdDevice::sharedLcdDevice():
这样保证了我们整个程序操作的是同一个LCD。
*/
private:   
	LcdDevice()
	{
		//初始化lcd--open, mmap
	}
	LcdDevice(LcdDevice& lcd){}
public:
	~LcdDevice()
	{
		//nmap,close
	}
	void draw_rect()//画矩形模块
	{
		cout<<"draw rect"<<endl;
	}

private:
	int fd;
	int width, height;
	unsigned int *mmp;
	static LcdDevice *instance;//数据段
};
//初始化
LcdDevice *LcdDevice::instance = NULL;//静态数据初始化----在数据段分配空间

void fun()//子函数想操作LCD,通过这样的方式,与main() 操作LCD 可以同步.
{
	//绘图
	LcdDevice* lcd = LcdDevice::sharedLcdDevice();
	lcd->draw_rect();
}

int main(void)
{

	LcdDevice *lcd = LcdDevice::sharedLcdDevice();
	lcd->draw_rect();
	fun();

	//LcdDevice mylcd; 该方式不合适。
	//LcdDevice mylcd=*lcd;该方式不合理
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值