需要注意的问题:
1、什么样的数据成员可以被定义为静态的?对该类所有的对象的值都是一样的。
2、如果成员函数被说明为静态的,该成员函数不再具有this指针,即静态成员函数不与某个具体的对象相联系,它是属于类的。
3、静态数据成员和静态成员函数不是每生成一个对象就产生一个拷贝,所有的对象共用一个。
4、由于静态成员函数没有this指针,所以不能对数据成员进行操作,只能通过对象来访问数据成员。
5、静态数据成员还需要在类的外面进行定义。
6、构造函数和析构函数不能定义为静态成员函数。
下面我们举一个例子说明一下上述的6个问题:
#include<iostream>
using namespace std;
class test
{
int x;//数据成员
static int y;//静态数据成员的声明
public:
test()//缺省构造函数
{
x=0;y++;
}
static int count()//静态成员函数
{
return y;
}
void disp()
{
cout<<"x="<<x<<endl;
}
~test()//析构函数
{
y--;
}
static void f1()//静态成员函数f1
{
test a;
cout<<"f1:x="<<a.x<<endl;
cout<<"f1:p.y="<<a.count()<<endl;
}
};
int test::y=0;//静态数据成员的定义
void f2()//全局函数f2
{
test p;
cout<<"f2:p.y="<<p.count()<<endl;
}
int main()
{
test p;
test *q=new test;
p.f1();
f2();
cout<<"p:";p.disp();
delete q;
cout<<"p.y="<<p.count()<<endl;
}
/*result:
f1:x=0
f1:p.y=3
f2:p.y=3
p:x=0
p.y=1
*/
首先,静态数据成员需要在类外部定义:
int test::y=0;
静态成员函数不能访问数据成员,如果想要访问的话,需要通过对象:
static void f1()
{
test a;
cout<<a.x<<endl;
}
我们定义了一个对象p和一个对象指针q,此时y的值为2
调用静态成员函数f1(或者全局函数f2),函数体内再次定义对象,此时y的值为3
静态成员函数f1(或者全局函数f2)调用结束后,由于我们定义了析构函数,此时y的值减1变为2
最后我们删除了对象指针q,y的值再次减1变为1
所以我们最后的结果为:
/*result:
f1:x=0
f1:p.y=3
f2:p.y=3
p:x=0
p.y=1
*/