说明,这里静态成员变量不能使用初始化列表去初始化,这里要明白上面说的那句话:静态成员变量需要在类外单独分配空间,换句话说,就是只有在类的外部重新定义静态成员变量才可以存储到静态存储区。报错如下:
root@txp-virtual-machine:/home/txp# g++ test4.cpptest4.cpp: In constructor ‘Test::Test()’:test4.cpp:7:10: error: ‘int Test::mCount’ is a static data member; it can only be initialized at its definition Test():mCount(0)
4、小结:
类中可以通过static关键字定义静态成员变量
静态成员变量隶属于类所有
每个对象都可以访问静态成员变量
静态成员变量在全局数据区分配空间
静态成员变量的生命期是在程序运行期间
二、静态成员函数:
刚刚程序版本二里面其实我们还有一个功能没实现完:随时可以获取当前对象的数目。所以我们还要想办法来实现,下面是代码版本三:
#include <stdio.h>class Test{public: static int mCount;public: Test() { mCount++; } ~Test() { --mCount; } int getCount() { return mCount; }};int Test::mCount = 0;int main(){ printf("mCount = %dn", Test::mCount); Test::mCount = 1000; printf("mCount = %dn", Test::mCount); return 0;}
运行结果:
mCount = 0mCount = 1000
这里用类名来访问静态成员变量,但是不安全,比如说这里给mCount赋值1000,你能说有一千个对象嘛,再说我们也没有去手动创建对象,所以还是不符合要求;为此这里我们又要引出一个新的概念——静态成员函数。
1、在C++中可以定义静态成员函数:
静态成员函数是类中特殊的成员函数
静态成员函数属于整个类所有
可以通过类名直接访问公有静态成员函数
可以通过对象名访问公有静态成员函数
2、静态成员函数的定义:
直接通过static关键字修饰成员函数:
class Test{public: static void Func1() {} static int Func2();}
静态成员函数代码演示:
#include <stdio.h>class Demo{private: int i;public: int getI(); static void StaticFunc(const char* s); static void StaticSetI(Demo& d, int v);};int Demo::getI(){ return i;}void Demo::StaticFunc(const char* s){ printf("StaticFunc: %sn", s);}void Demo::StaticSetI(Demo& d, int v){ d.i = v;}int main(){ Demo::StaticFunc("main Begin..."); Demo d; Demo::StaticSetI(d, 10); printf("d.i = %dn", d.getI()); Demo::StaticFunc("main End..."); return 0;}
结果输出:
root@txp-virtual-machine:/home/txp# ./a.outStaticFunc: main Begin...d.i = 10StaticFunc: main End...