假如說我如今有一個類,我建立了不少類對象。而我想知道我到底建立了多少個類對象,我該怎麼作呢?
ide
class Person { private: char* name; int age; char* work; public: Person(){ } Person(char* name, int age, char* work = "none") { this->name = name; this->age = age; this->work = work; } void printInfo() { cout << "name = " << name << " age = " << age << " work = " << work << endl; } ~Person() { delete this->name; delete this->work; } };
如今,我開始建立類對象,
函數
int main() { Person per1; Person per2; Person per3; Person per5; Person per[100]; Person* per4 = new Person("chentong", 20, "student"); system("pause"); return 0; }
很明顯,我總共建立了105個類對象。我想要統計我有多少個類對象,很明顯,我得有一個統計用的變量。
this
private: int cnt;
若是我直接像這樣在類中放一個變量cnt,那麼我每建立一個對象,它都會有一個cnt出現,而這樣並不能解決統計對象個數的問題。爲此,C++中引入了靜態成員變量這樣一個概念來解決這個問題。這個靜態成員變量它是屬於一個類,而不屬於某一個具體的對象。因此,在類中,我使用關鍵字static來申請一個靜態成員變量。
對象
private: static int cnt;
由於,這個變量是類的私有變量,外部沒法直接對其進行操做,因此,須要一個函數來解決操做問題。操做靜態成員變量的函數,被稱做是靜態成員函數。
內存
static int getCnt() { //第一種寫法 return cnt; }
由於每建立一個對象都會調用構造函數,因此我只須要在構造函數內對cnt進行自增就能夠了。可是如今,還有一個問題,我只是在類中聲明瞭一個靜態成員變量,它只是從邏輯上存在了,並無實際佔用內存空間,因此,我得對cnt進行賦初值操做。怎麼作呢?首先,必須確定的是,對靜態變量初始化的操做必定要在對象被建立以前,因此,靜態變量的初始化必定要在類外實現,get
所以,
it
int Person::cnt = 0; //放在類外,就不須要加static了
固然,類內能夠只寫靜態成員函數的定義,實現,放在類外,寫法以下:
class
int Person::getCnt() { return cnt; }
一樣的,函數的功能實現,放在類外就不須要加static了。
變量
而後就是,完整代碼,代碼以下:構造函數
class Person { private: static int cnt; char* name; int age; char* work; public: Person() { cnt++; } Person(char* name, int age, char* work = "none") { this->name = name; this->age = age; this->work = work; cnt++; } void printInfo() { cout << "name = " << name << " age = " << age << " work = " << work << endl; } /*static int getCnt() { //第一種寫法 return cnt; }*/ static int getCnt(); //第二種寫法 ~Person() { delete this->name; delete this->work; } }; int Person::cnt = 0; //定義和初始化靜態數據成員 int Person::getCnt() { return cnt; } int main() { Person per1; Person per2; Person per3; Person per5; Person per[100]; Person* per4 = new Person("chentong", 20, "student"); cout << "cnt = " << Person::getCnt() << endl; cout << "per[1].cnt = " << per[1].getCnt() << endl; cout << "per[2].cnt = " << per[2].getCnt() << endl; system("pause"); return 0; }