类的静态成员在定义的时候,需要先加上一个static
。虽然在类体内定义,可以被对象改变,但它不属于某个对象,甚至可以脱离对象单独存在,属于整个类体,(就是上交给国家的感觉)。分为静态数据成员和静态成员函数两种。
静态数据成员
静态数据成员在类体内声明,但在类体外初始化,且必须初始化。初始化的格式为:静态变量类型
类名
::赋值语句
class Date
{
public:
static int a;//声明a
};
int Date::a=6;//初始化a
构造函数可以改变静态成员的值,但不能用于初始化,也就是说,类体外的初始化语句是必须要有的。如果有多个静态成员变量,需要挨个初始化,而不能用逗号链接。
class Date
{
public:
static int a,b;
Date(){a=5;}
};
int Date::a=0;//如果任何一个静态变量没初始化,程序会报错
int Date::b=0;//a和b要各自初始化,不可连在一起
//int Date::a=0,b=0;这样写是错的
int main()
{
Date t;
cout<<t.a;
return 0;
}
输出:
5
静态成员不属于任何对象,可以不依赖对象,用类名::变量
直接输出。
class Date
{
public:
static int a;
};
int Date::a=0;
int main()
{
cout<<Date::a<<endl;
return 0;
}
输出:
0
应用实例
静态成员变量不受对象限制,单独存在,故可以用于记录对象个数:
class Date{
private:
static int num;
public:
Date(){
num++;
}//每当用无参构造函数定义一个对象,num就会+1
};
int Date::num=0;//初始化num=0
int main()
{
Date d1,d2,d3;//num=3
return 0;
}
静态成员函数
静态成员函数只能访问静态成员变量/其他静态成员函数,可以在类体内实现(内联函数),也可以在类体内声明,在类体外实现(外联函数)。静态成员函数像静态数据成员一样没有对象用类名::函数名
直接调用
class Date
{
public:
static int a;
static int plus(){
return a*a;//内联的静态成员函数
}
};
int Date::a=4;
int main()
{
cout<<Date::plus()<<endl;//不依赖对象的调用
Date d;
cout<<d.plus();//也可以用任意一个对象调用
return 0;
}
输出结果:
16
16