写在头头儿
简单成员函数是指声明中不含const、voatile、static关键字的函数。静态成员使用static关键字来修饰的。静态成员分静态数据成员和静态成员函数。
静态成员函数与一般成员函数的不同
1、可以不指向某个具体的对象,只与类名连用。
2、在没有建立对象之前,静态成员就已经存在。
3、静态成员是类的成员,不是对象的成员。
4、静态成员为该类的所有对象共享,它们被存储于一个公用内存中。
5、没有this指针,所以除非显示的把指针传给它们,否则不能存取类的数据成员。
6、静态成员函数不能被说明为虚函数。
7、静态成员函数不能直接访问非静态函数。
好好体会这7点,体会到了才能说我们会用,学会了。
来个例子更好的理解静态成员
#include <iostream>
using namespace std;
class Box
{
public:
static int objectCount;
// 构造函数定义
Box(double l=2.0, double b=2.0, double h=2.0)
{
cout <<"Constructor called." << endl;
length = l;
breadth = b;
height = h;
// 每次创建对象时增加 1
objectCount++;
}
double Volume()
{
return length * breadth * height;
}
static int getCount()
{
return objectCount;
}
private:
double length; // 长度
double breadth; // 宽度
double height; // 高度
};
// 初始化类 Box 的静态成员
int Box::objectCount = 0;
int main(void)
{
// 在创建对象之前输出对象的总数
cout << "Inital Stage Count: " << Box::getCount() << endl;
Box Box1(3.3, 1.2, 1.5); // 声明 box1
Box Box2(8.5, 6.0, 2.0); // 声明 box2
// 在创建对象之后输出对象的总数
cout << "Final Stage Count: " << Box::getCount() << endl;
return 0;
}
当上面的代码被编译和执行时,它会产生下列结果:
Inital Stage Count: 0
Constructor called.
Constructor called.
Final Stage Count: 2
写在最后的注意
静态数据成员只能声明一次,如果在类中仅对静态数据成员进行声明,则必须在文件作用域的某个地方进行定义。也可以直接在构造函数中使用类成员限定符初始化。除了注意初始化还要注意,静态成员遵循列的其他成员遵循的访问限制,虽然还没有建立对象,但静态成员已经存在。由于数据隐藏的需要,静态数据成员通常被说明为私有的,通过定义公有的静态成员函数来访问静态数据成员。