靜態公有成員與C++單例模式

1.靜態屬性成員:

class MyCls {

public:

int aa;

int bb;

};


MyCls類型創建對象a,b; 每個對象都有自己aa,bb成員,可以存放自己的屬性值.

但有些場合,如統計MyCls創建出對象的個數,需要所有的類對象共用一個屬性成員纔可以,共用的屬性成員就是靜態的屬性成員


Class MyCls {

public:

static int count; //這裏是聲明靜態屬性成員,創建一個對象時不能對它分配空間.

MyCls() {

count++;

}

};


int MyCls::count =0; //靜態屬性成員需要在函數外部聲明並初始化,相當於聲明一個全局變量,而這個全局變量是屬於MyCls名稱空間的.


int main()

{

MyCls a, b, c;

cout <<&a.count << endl;

cout <<&b.count << endl;

cout <<&b.count << endl;

cout <<a.count << endl;


cout <<MyCls::count << endl; //也可以直接通過類名訪問公有的靜態成員

return 0;

};



2. 靜態的函數成員

靜態公有函數成員可以不用創建對象,直接用”類名::函數名()”來調用.


#include <iostream>


using namespace std;


class MyCls {

private:

int id;

public:

static voidshow()

{

// id = 88;//在靜態函數裏不能直接訪問非靜態的成員

cout <<"MyCls show " << endl;

}

};


int main(void)

{

MyCls a, *p =new MyCls;

a.show();

p->show();//一般情況下,需要創建對象後纔可以調用類對象的函數.


MyCls::show();//靜態的公有函數可以直接通過類名訪問.


return 0;

}


3. 靜態公有成員與C++單例模式

在某些場合,我們需要限制一種類型的對象個數。如我們系統裏只會有一個攝像頭,那我們就可以用classCamera來描述攝像頭的功能,但對象只能有一個.


ClassCamera {

private:

intfd;


Camera(stringdev_file) { //構造函數是私有的權限,只能在類的內部創建對象.這時可以通過靜態的公有函數成員,在類內部創建對象,並讓外部獲取到對象的地址來調用。

}

public:

intgetJpg(char *data){

}

staticCamera *getCameraObject(string dev_file) {

staticCamera cam(dev_file);

return&cam;

}

};


intmain(void)

{

//Cameracam(“/dev/video0”); //創建對象時,在這裏自動調用cam.Camera(string)構造函數.也就是隻有公有的構造函數,纔可以在類的外部創建對象.

Camera*cam;

cam= Camera::getCameraObject(“/dev/video0”);

cam->getJpg(NULL);

return0;

}


本文由廣州尚觀科技發佈,廣州尚觀科技,專業的Linux/Java/嵌入式/HTML5/Python/UI培訓機構。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章