如果一个成员变量被声明为static,那么该类的所有对象都可以访问该变量;如果一个成员函数被声明为static,那么它可以在类的任何实例被定义之前被调用。
默认情况下,每个类的对象(类的一个实例)都有它自己的类的成员变量副本。一个对象的成员变量与同一个类的其他对象的成员变量是独立分开并且有区别的。
1.静态成员变量
即由同一个类的所有对象共享的成员变量。要创建这样的成员,只需将static放在变量声明的前面,如下的类所示:
#include <iostream>
using namespace std;
class StatDemo
{
private:
static int x;
int y;
public:
void setx(int a) { x = a; }
void sety(int b) { y = b; }
int getx() const {return x;}
int gety() const {return y;}
};
int StatDemo::x = 0;
int main()
{
StatDemo test;
StatDemo test2;
test.setx(100);
test.sety(100);
cout<<"x : " <<test.getx()<<endl;
cout<<"y : " <<test.gety()<<endl;
cout<<"x : " <<test2.getx()<<endl;
cout<<"y : " <<test2.gety()<<endl;
return 0;
}
结果:
在这个例子中,成员变量x将被statDemo类的所有对象共享。当一个类对象将一个值放入x中时,它将穿在所有其他StatDemo对象中。
注意:静态成员变量对于理解C++声明和C++定义之间的区别提供了一个很好的样板。声明提供了有关变量或函数的存在和类型的信息;而定义则提供了声明中包含的所有信息,另外,还将未被定义的变量或函数分配内存。静态成员变量必须在类中声明并在类外部定义。
一般来说,可以将一个类的成员变量和函数分成两组:实例成员和静态成员。实例成员是其使用必须与类的特定实例关联的成员。特别是,一个类的实例变量必须通过该类的特定实例来访问,并且实例成员函数必须通过该类的特定实例来调用。
相比之下,静态成员变量的使用或静态成员函数的调用就不需要与任何实例关联。只有静态成员的类需要指定。
2. 静态成员函数
通过将关键字static放置在声明语句的前面作为前缀,可以将类的成员函数声明为静态成员函数。以下是其一般形式:
static <return type> <function name> ( <parameter list> )
静态成员函数通常用于处理类的静态成员变量。实际上,对于类的成员函数来说,如果它不能访问类的任何非静态成员,则应该将该函数变成静态成员函数。
对静态成员函数的调用,通常通过使用作用域解析运算符将函数名称连接到类名来完成。如果已经定义了类的对象,那么静态成员函数也可以通过使用点运算符将它们的名称连接到对象来调用。
即: Budget::mianOffice(amount); 或者obj.mainOffice(amount);
this指针不能在静态成员函数中使用,因为静态成员函数不是通过它们所属类的任何实例调用的。而且,静态成员函数除非指定该成员函数属于哪个实例,否则不能访问其类的实例成员。
示例代码:
class StatAccess
{
private:
int x;
public :
static void print(StatAccess a)
{
cout<<a.x;
}
StatAccess(int x) {this->x = x;}
};