C++ 静态成员:对于类中的非静态数据成员,每一个类对象都拥有一个副本,即每个对象的同名数据成员可以分别存储不同的数值,这是保证每个对象都拥有区别于其他对象的特征的需要。而类中的静态成员则是解决同一个类的不同对象之间的数据和函数共享问题的。
静态成员的特性是不管这个类创建了多少个对象,它都只有一个副本,这个副本由所属于这个类的对象共享。这种共享与全局变量或全局函数相比,既没有破坏数据隐藏的原则,又保证了安全性。
静态成员表示整个类范围的信息,其声明以关键字 static 开始,包括静态数据成员和静态成员函数。
》静态数据成员
静态数据成员声明时要使用关键字 static。
示例:
- class myclass {
- private: static a; //私有静态数据成员int b,c;};
其中,a 是静态数据成员,它被 myclass 类的所有对象所共享,但它不属于 myclass 类的任何一个对象,它的作用域是类范围。
静态数据成员在每个类对象中并不占有存储空间,它只是在每个类中分配有存储空间,供所有对象公用。静态数据成员的值对每个对象都是一样的,它的值可以被任何一个对象更新,从而实现了同一类的不同对象之间的数据共享。
静态数据成员的存储与访问:
静态数据成员具有静态生存期,必须对它进行初始化,初始化的一般格式为:
<数据类型><类名>::<静态数据成员名>=<初始值>;
注: #由于在类的声明中仅仅是对静态数据成员进行了引用性声明,因此必须在文件作用域的某个地方对静态数据成员进行定义并初始化,即应在类体外对静态数据成员进行初始化(静态数据成员的初始化与它的访问控制权限无关)。
#静态数据成员初始化前面不加 static 关键字,以免与一般静态变量或对象混淆。
#由于静态数据成员是类的成员,因此在初始化时必须使用作用域运算符(::)限定它所属的类。
》静态成员函数
公有的静态数据成员可以直接访问,但是私有的或保护的静态数据成员却必须通过公有的接口进行访问,一般将这个公有的接口定义为静态成员函数。
使用 static 关键字声明的成员函数就是静态成员函数,静态成员函数也属于整个类而不属于类中的某个对象,它是该类的所有对象共享的成员函数。
静态成员函数可以在类体内定义,也可以在类外定义。在类外定义时,要注意不能使用 static 关键字作为前缀。
由于静态成员函数在类中只有一个副本,因此它访问对象的成员时要受到一些限制:静态成员函数可以直接访问类中说明的静态成员,但不能直接访问类中说明的非静态成员;若要访问非静态成员时,必须通过参数传递的方式得到相应的对象,在通过对象进行访问。一般来说,静态成员函数只访问类中的静态数据成员。
注:公有的静态成员既可以直接使用作用域运算符通过类名进行访问,也可以通过类的任何对象进行访问,但是建议使用前者进行访问:
<类名>::<静态数据成员名> 或 <类名>::<静态成员函数名>(<参数表>)
使用类名和作用域运算符进行访问可以清楚地表示出静态成员是属于这个类的,而不是属于类中的某一个对象的。另外,由于静态成员在该类的任何对象被建立之前就已经存在,因此静态成员可以在程序内部不依赖于任何对象被访问,即使没有建立该类的任何一个对象时也可以使用作用域运算符通过类名访问类的公有静态成员。
就爱阅读 www.92to.com 网友整理上传, 为您提供最全的知识大全, 期待您的分享,转载请注明出处。
来源: http://www.92to.com/bangong/2017/04-22/20698327.html