假如说我如今有一个类,我建立了不少类对象。而我想知道我到底建立了多少个类对象,我该怎么作呢?
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; }