C++学习笔记--类的静态成员变量和静态成员函数

来源:互联网 发布:企业网络公关 编辑:程序博客网 时间:2024/06/03 18:38

静态成员变量

前面我们知道通过对象名能够访问类的public成员变量,每个对象都有自己专属的一套成员变量,不能在对象之间共享。

当我们想统计在程序运行期间某个类产生的对象数目,并且不能使用全局变量,该怎么办?如何在类里实现这种数据共享的问题?

C++提供了静态成员变量来解决这种问题,静态成员属于整个类所有,并不隶属于单独的某个对象,所有对象共享类的静态成员变量,它的生命周期为整个程序的运行周期,我们可以通过类名直接访问公有静态成员变量或者通过对象名访问公有静态成员变量,不能通过类名访问私有成员变量。静态成员变量不隶属于某个对象,是不占有空间的,所以需要在类外单独分配空间,类外部不用static关键字修饰,静态成员变量在程序内部位于全局数据区,它必须在全局数据区分配空间并初始化,具体形式为:type classname :: varname = val;只在类里面定义时添加static关键字,并且不加成员变量的访问权限控制符,如public、private等。由于只在一处申请了空间,所以静态成员变量也节省了内存。当静态成员变量访问权限是public时可以使用:<类名> :: <静态成员变量>;进行访问静态成员变量(不安全,类似于全局变量的访问),当然也可以通过对象名来访问静态成员变量。

看一个例子,统计类对象的数目:

class Test{private:    static int cCount;public:    Test()    {        cCount++;    }    ~Test()    {        --cCount;    }    int getCount()    {        return cCount;    }};int Test::cCount = 0;int main(){    Test t1;    Test t2;    printf("count = %d\n", t1.getCount());    printf("count = %d\n", t2.getCount());    Test* pt = new Test();    printf("count = %d\n", pt->getCount());    delete pt;    printf("count = %d\n", gTest.getCount());    return 0;}


程序中每创建一个对象就会调用一次构造函数,相应的静态成员变量会进行自增操作,每调用一个析构函数进行一次自减操作,打印相关变量,下面输出结果为:

count = 2

count = 2

count = 3

count = 2

静态成员函数

C++中可以定义静态成员函数,它是类中的特殊成员函数,属于整个类所有,可以通过类名直接访问公有静态成员函数,也可以通过对象名访问公有静态成员函数,不能通过类名和对象名访问私有成员函数。静态成员函数不可以直接访问成员变量,但是可以间接访问,即使用另一个对象的成员变量。静态成员函数没有隐含的this指针也不能访问普通成员函数。静态成员函数中可以直接访问静态成员变量和静态成员函数,静态成员函数可以通过类名来直接调用,但是普通成员函数却不可以依靠类名直接调用。



原创粉丝点击