静态数据成员 和 静态成员函数

Posted conanpeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了静态数据成员 和 静态成员函数相关的知识,希望对你有一定的参考价值。

静态数据成员

  有时候需要为某个类的所有对象分配一个单一的存储空间。使用全局变量的缺点显而易见,它可以被任意修改,而且很容易发生名字冲突。我们希望的是把数据当成全局变量那样去存储,但又隐藏在类的内部,而且又与这个类相联系。这个其实可以用静态数据成员来实现。

  类的静态数据成员拥有一块单独的存储区,不管该类创建了多少对象,所有这些对象的静态数据成员都共享这一块静态存储空间,这其实是为这些同一个类的对象提供了一种相互通信的方法。静态数据成员是属于类的,它只在类的范围内有效。对静态数据成员的定义必须出现在类的外部而且只能定义一次。因此我们通常在类内声明静态成员,在类外定义静态成员。如果不这样的话,可能会引起重复定义的错误,比如包含类声明的头文件被多个cpp文件包含的时候。

  C++的静态成员被类的所有对象共享,包括该类的派生类对象。如果改变静态成员的值,那么所有对象中的该静态对象的值都会相应改变,这样可以提高效率,节省空间。如果只是声明了类而没有实例化它,那它的一般成员就不会占用内存空间,只有实例化对象时才会为一般成员分配内存空间。但是静态成员不是这样,它不属于任何一个类,而是在所有对象之外再开辟一个专门的内存空间。只要在类内声明了静态成员,那么即使类不实例化任何对象,编译器也会为静态成员分配空间。静态成员在编译期就被分配空间,直到程序结束才释放空间,不随对象的建立而分配,不随对象的释放而销毁

静态成员函数

静态成员函数也是属于类而不属于类的对象。静态成员函数的作用就是为了处理静态数据成员。由于静态成员函数不属于任何对象,所以它的内部没有this指针,而且它不能对一个对象里的非静态数据成员进行默认访问(默认访问就是在引用数据成员时不指定对象名)。尽管加了对象名和成员访问运算符.可以访问非静态成员,我们也不推荐这样做,因为我们定义静态成员函数就是希望它有自己专门的作用,这样思路清晰,代码可读性更强。

 

以上是关于静态数据成员 和 静态成员函数的主要内容,如果未能解决你的问题,请参考以下文章

学习:类和对象——静态成员变量和函数

关于类中静态成员函数和静态成员变量的知识点

C++派生类是不是可以从基类继承静态数据成员和静态成员函数?

静态数据成员 和 静态成员函数

C++面向对象:静态成员和静态成员函数

类函数、成员函数、静态函数、抽象函数、方法伪装属性