概念:类的每个实例都有自己的实例变量副本。 但是,如果将成员变量声明为静态,则该类的所有实例都可以访问该变量。 如果成员函数声明为静态,则可以在不定义该类的任何实例的情况下调用它。
首先来看实例变量,一个对象的成员变量都是与类中其它对象的成员变量区别独立出来的。举个例子来说,我们之前的Rectangle类里面有两个成员变量:width和length。假设我们定义两个在Rectangle类里面的对象并且如下操作
Rectangle box1;
Rectangle box2;
box1.setWidth(5);
box1.setLength(10);
box2.setWidth(500);
box2.setLength(1000);
box1和box2在内存中的样子看起来是这样的
当getWidth()函数被调用的时候,其返回存贮在对象中width的成员变量中的数据。比如下面这个语句最后输出就会是5 500
cout << box1.getWidth() << " " << box2.getWidth() << endl;
当一个成员变量用static关键字声明的时候,成员函数在内存中就会只有一个副本,不管实例变量和类的多少或者是否存在。其静态成员变量受所有的实例变量和类共享。看下面头文件
// Tree class
class Tree
{
private:
static int objectCount; // Static member variable.
public:
// Constructor
Tree()
{ objectCount++; }
// Accessor function for objectCount
int getObjectCount() const
{ return objectCount; }
};
// Definition of the static member variable, written
// outside the class.
int Tree::objectCount = 0;
以及主程序
// This program demonstrates a static member variable.
#include <iostream>
#include "Tree.h"
using namespace std;
int main()
{
// Define three Tree objects.
Tree oak;
Tree elm;
Tree pine;
// Display the number of Tree objects we have.
cout << "We have " << pine.getObjectCount()
<< " trees in our program!n";
return 0;
}
这个程序创建了三个实例类,存储在变量oak, elm和pine。尽管这里有单个实例对象,但是只有一个静态变量objectCount。看下面这个图