1 静态成员变量
- 静态成员变量属于整个类,所有对象共享类的静态成员变量
- 可直接通过对象名、类名访问
- 静态成员变量的生命期不依赖于任何对象
特性:
- 静态成员变量需要在类外单独分配空间,位于全局数据区
我们现在有这样一个需求,不使用全局变量的情况下,统计某个类的对象数目。
// 16-1.cpp
#include<stdio.h>
class Test
{
public:
Test()
{
count++;
}
~Test()
{
count--;
}
int getCount()
{
return count;
}
private:
static int count; // 静态成员
};
int Test::count = 0; // 类外分配空间
Test gTest;
int main()
{
Test t1;
Test t2;
printf("count = %d\n", gTest.getCount());
printf("count = %d\n", t1.getCount());
printf("count = %d\n", t2.getCount());
return 0;
}
静态成员函数不属于对象,属于整个类,每生成一个对象,构造函数对 count 加 1,每析构一个对象,析构函数对 count 减 1。
编译运行:
$ g++ 16-1.cpp -o 16-1
$ ./16-1
count = 3
count = 3
count = 3
2 静态成员函数
- 静态成员函数属于整个类所有
- 可以通过类名、对象名访问公有静态成员函数
静态成员函数直接通过 static 关键字修饰
静态成员函数和普通成员函数对比
静态成员函数 | 普通成员函数 | |
---|---|---|
所有对象共享 | Yes | Yes |
隐含this指针 | No | Yes |
访问普通成员变量(函数) | No | Yes |
访问静态成员变量(函数) | Yes | Yes |
通过类名直接调用 | Yes | No |
通过对象名直接调用 | Yes | Yes |
静态成员函数不属于对象,属于整个类所有,所以自然没有 this 指针,普通成员变量属于某个对象,所以静态成员函数也不能访问普通成员函数。
上面的代码 16-1.cpp 当对象数量为 0 时,就不让统计对象数目。下面用静态成员函数就行修改。
// 16-1.cpp
#include<stdio.h>
class Test
{
public:
Test()
{
count++;
}
~Test()
{
count--;
}
static int getCount()
{
return count;
}
private:
static int count;
};
int Test::count = 0;
int main()
{
printf("count = %d\n", Test::getCount()); // 可用类名直接访问
Test t1;
Test* pt = new Test();
printf("count = %d\n", pt->getCount());
delete pt;
return 0;
}
这样即便是没有创建对象的时候也可以通过类名调用静态成员函数,得到对象数量为 0。
$ g++ 16-2.cpp -o 16-2
$ ./16-2
count = 0
count = 2
3 小结
1、静态成员变量属于类所有,在全局数据区分配空间,生命期为程序运行期
1、静态成员函数没有 this 指针,只能访问静态成员变量
2、静态成员函数可通过类名、对象名访问