1. 程式人生 > >C++技術——static、單例模型

C++技術——static、單例模型

一 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;該方式不合理
}