靜態成員變數 1. static成員變數是類級變數(用來處理這中類型的對象,共用的數據,屬於整個類型,記憶體中只有一份)。和全局變數以及靜態局部變數一樣,存放在進程的靜態存儲區(數據區+BSS區)。 2. 靜態成員變數必須在類外進行初始化, 不能在構造函數中初始化 例子 include using n ...
靜態成員變數
class A{
public:
static int count; //靜態成員變數
static void get(){}; //靜態成員函數
}
int A::count=5;
- static成員變數是類級變數(用來處理這中類型的對象,共用的數據,屬於整個類型,記憶體中只有一份)。和全局變數以及靜態局部變數一樣,存放在進程的靜態存儲區(數據區+BSS區)。
靜態成員變數必須在類外進行初始化, 不能在構造函數中初始化
靜態成員變數類型 類型::靜態成員變數名; //基本類型初始化為零 類類型調用無參構造 靜態成員變數類型 類名::靜態成員變數名=值; 靜態成員變數類型 類名::靜態成員變數名(值);
例子
#include<iostream>
using namespace std;
class Person{
string name;
int age;
static int pcount; //靜態成員變數是類型級的變數
public:
Person(string name="",int age=1){
this->name=name;
this->age=age;
cout<<name<<" is coming"<<endl;
pcount++;
}
void show(){
cout<<"I am "<<name<<",age:"<<age<<endl;
cout<<"current pcout:"<<pcount<<endl;
}
~Person(){
pcount--;
cout<<"after "<< name <<" leave,"<<"Current pcount: "<<pcount<<endl;
}
};
int Person::pcount;
void foo(){
Person persona("PuJing",50);
persona.show();
Person personb("AoBaMa",45);
personb.show();
}
int main(){
foo(); //這句執行完裡面的對象就被自動析構了
Person personc("XiJinPing",55);
personc.show();
return 0;
}
靜態成員函數
只能訪問該類的靜態成員
class A{
public:
static int count; //靜態成員變數
static void get(){}; //靜態成員函數
}
int A::count=5;
- Static Member Function沒有this指針,只能訪問該類Static Member Variable,不能訪問普通成員變數。
- NonStatic Member Function非靜態成員函數都可以訪問。
單例模式
Singleton使用私有構造函數的方法禁止在類外部創建實例,而類自己使用靜態成員變數的方法來維護其唯一實例,並提供訪問該實例的方法。
餓漢式
餓漢式單例模式的優點是載入進程時靜態創建單例對象,線程安全;缺點是無論使用與否,總要創建一個實例。
//餓漢式,程式一啟動就創建好了對象
class Singleton{
Singleton(){} //構造函數私有化, 保證不能從外部創建對象
static Singleton sig; //static的成員變數, 在進程載入的時候就創建好對象,線程安全
public:
static Singleton& getInstance(){ //得到對象的介面, 也是static的, 用來返回唯一的一份sig
return sig;
}
};
Singleton Singleton::sig;
懶漢式
懶漢式單例模式的優點是用則創建,不用不創建,什麼時候用什麼時候創建;缺點是首次訪問時動態創建單例對象,在多線程應用中,存線上程不安全的問題。
//懶漢式,需要時候才創建對象
class Singleton{
Singleton(){} //構造函數私有化
static Singleton* instance;
public:
static Singleton getInstance(){
if(instance==NULL)
instance=new Singleton();
return instance
};
}
Singleton* Singleton::instance=NULL;
int main(){
Singleton& siga=Singleton::getInstance(); //得到已經在記憶體中的sig
Singleton& sigb=Singleton::getInstance();
cout<<&siga<<":"<<&sigb<<endl; //這兩個的地址時一樣的, 因為是同一個對象
return 0;
}