C++ 静态成员

来源:互联网 发布:mysql数据库汉化版 编辑:程序博客网 时间:2024/05/16 15:00


        静态成员的提出是为了解决数据共享的问题。实现共享的办法有很多,如设置全局性的变量或者对象是一种方法。但是,全局变量或者对象是有局限性的。C++为此提出了静态成员,它包括静态数据成员和静态成员函数。

        1.静态数据成员

        静态数据成员是同一个类中所有对象共享员,而不是某一对象的成员(所以,静态数据成员的初始化必须在类外进行)。使用静态数据成员可以节省内存,因为它是所有对象所共有的,因此,对多个对象来说,静态数据成员只存储一处,供所有对象共用。静态数据成员的值对每个对象都是一样的,但它的值是可以更新的。与静态变量相似,静态数据成员是静态存储的,具有静态生存期。但定义一个静态数据成员与一般静态变量不一样,它是这样定义的:

(1)使用关键字static 声明静态数据成员。

(2)对静态数据成员进行初始化。由于静态数据成员要实际分配空间,因此,不能在类声明中进行初始化。静态数据成员初始化必须在类的外部进行。格式如下:

       <数据类型><类名>::<静态数据成员>  = <值>     比如:int   CPoint::x = 0;

例:静态数据成员的使用

#include <iostream>using namespace std;class CSum{public:        CSum() {}  //无参数构造函数            CSum(int a,int b)     //构造函数{nsum+=a+b;}CSum(const CSum  &tmp)    //复制构造函数(拷贝构造函数){cout<<"调用拷贝构造函数"<<endl;cout<<tmp.nsum<<endl;}~CSum() {}               //析构函数int GetSum();void SetSum(int nsum);private:static int nsum;};int CSum::GetSum(){return nsum;}void CSum::SetSum(int n){nsum = n;}//CSum::CSum()  {}      //无参构造函数的实现//CSum::~CSum()  {}    //析构函数的实现 int CSum::nsum = 0;  //静态数据成员必须在类外进行初始化void main(){CSum two;cout<<"sum="<<two.GetSum()<<endl;CSum one(10,2);cout<<"sum="<<one.GetSum()<<endl;CSum three(one);   //调用拷贝构造函数初始化cout<<"sum(three)="<<three.GetSum()<<endl;one.SetSum(5);cout<<"sum(one)="<<one.GetSum()<<endl;cout<<"sum(two)="<<two.GetSum()<<endl;cout<<"sum(three)="<<three.GetSum()<<endl;}

由显示结果可知,所有的CSum类对象共享静态数据成员 nsum;当一个对象改变了静态数据成员nsum的值后,所有的CSum类的对象的nsum值跟着发生变化。


        2.静态成员函数

        静态成员函数和静态数据成员一样,它们都属于类的静态成员,都不是对象成员。因此,对静态成员的引用不需要用对象名。

        在静态成员函数的实现中不能直接引用类中说明的非静态成员,可以引用类中说明的静态成员。如果静态成员函数要引用非静态成员(包括数据成员和成员函数),可以通过对象来引用。通过下面的例子来说明这一点。

例:静态成员函数的引用。

#include <iostream>using namespace std;class CSum{public:CSum(int a=0,int b=0)  //带参数的构造函数{nsum += a+b;}   CSum()   //重载无参数的构造函数{}int GetSum(){return nsum;}void SetSum(int n){nsum = n;}static void ShowData(CSum one);   //声明静态成员函数(静态成员函数必须在类外实现)~CSum()   //析构函数{}private:static int nsum;};void CSum::ShowData(CSum one)     //静态成员函数的实现(注意:一定要在类外实现){cout<<"静态成员函数直接使用类的静态数据成员"<<endl;cout<<"sum="<<nsum<<endl;cout<<"静态成员函数通过使用类的对象调用类的非静态成员"<<endl;cout<<"sum="<<one.GetSum()<<endl;}int CSum::nsum = 0;   //静态数据成员的初始化(注意:一定要在类外实现)void main(){CSum one(10,2);CSum::ShowData(one);    //通过类名直接访问one.SetSum(8);one.ShowData(one);   //共有的静态成员函数也可以通过相应的对象访问。}


从例中可以发现,共有的静态成员函数既可以通过相应的对象访问(这一点与一般成员函数相同),也可以通过所属的类名来引用。

 




0 0