静态类成员(static class member)是由关键词static 修饰说明的类成员。类的静态成员为其所有对象共享,不管有多少对象,静态成员只有一个存于公共内存中。
一、静态数据成员
该类产生的所有对象共享由系统为静态成员分配的一块存储空间,而这块存储空间是在编译时分配的,在定义对象时不再为静态成员分配空间。
(类可以理解为一种数据类型,编译器不会分配内存,而是按照类这种样板在内存中建立一个个同样结构的实例——对象。比如CGoods Car,创建了CGoods类的一个对象Car,同时为它分配了属于它自己的存储空间,用来存放数据和对这些数据实施操作的成员函数。)
而静态数据为该类所有对象共有,更像面向过程设计中的全局变量。正因为静态数据成员不属于类的某一特定对象,而是属于整个类的,所以可用以下格式:
类名::静态数据成员名
说明:对数组进行动态分配和撤销的格式为:指针变量名=new 类型名[下标表达式]
delete []指向该数组的指针变量名
//Ex1:用静态数据成员对同一类建立的对象的数量进行计数。
#include <iostream>
using namespace std;
class Ctest{
private:
static int count; //注意私有
public:
Ctest(){
++count;cout<<"对象数量="<<count<<'\n';
}
~Ctest(){
--count;cout<<"对象数量="<<count<<'\n';
}
};
int Ctest::count=0; //A行 对静态数据定义性说明
int main(void){
Ctest *a;
a=new Ctest[3];
delete []a;
system("pause");
return 0;
}
1、静态数据成员要做定义性说明,必须在文件作用域中做一次且只能做一次说明,只有这时,编译器才为静态数据成员分配存储空间。静态数据成员放在全局变量区,只有静态生命期,但只有通过所属类的对象才可见。静态数据成员虽然具有全局变量的一些特性,但受到访问限制的约束,一般说明为私有的,保证其封装性。如果说明为公有的,那么回带来与全局变量同样的副作用。
2、建议不要在构造函数中为静态数据成员置初值,仅在定义性说明时一次性指定初值即可。
3、静态数据成员对所有类对象只有一个,所以在物理上,一个类对象向另一个类对象按成员进行复制时是通过依次复制每个非静态数据成员实现的。
二、静态函数成员
类名::函数名(对象名,参数表)
因为C++在产生类的对象时,为了减少对象所占空间,物理上为同一类的所有对象的成员函数只保留一份代码,如下图所示。一般情况下静态函数不能得到明显好处,只有逻辑上的优点,使用上不方便。此处不介绍。
相关面试题:关键字static的作用是什么?
答:有以下几个作用:
1、函数体内static变量(局部静态变量),不同于auto变量,该变量只被分配一次。
2、模块内的static全局变量可以被模块内所有函数访问,但不能被模块外其他函数访问。使用范围被限制在声明它的模块内。
3、在类中的static成员变量属于整个类,对类的所有对象只有一份拷贝。
4、在类中的static成员函数属于整个类,这个函数不接受this指针,因而只能访问类的static成员变量。
关于this指针,在调用某对象的成员函数时,系统会自动产生一个隐藏的指针,它始终指向要调用其成员函数的对象,并将该指针作为一个参数自动传递给该成员函数,这样成员函数就明确知道了要取哪一个对象的成员数据。为什么说静态成员函数没有this 指针?因为普通成员函数虽然在物理上只有一份代码,但在逻辑上认为每一个对象都有一份代码,所以有this指针。而静态成员函数在逻辑上也只有一份代码,不属于具体的对象,当然也就没有this指针。