有时我们需要一种所有的类对象所共享的成员,例如可以统计类对象的个数,那我们就要用到static关键字
我们可以是用全局变量来实现这个操作,但是全局变量在任何时候都可以修改,一不注意就会改变了它的值,这样破坏了类的封装性。
类的static成员不属于任何一个类对象,它是直接与类关联的
语法:
static在类中定义是引用型声明,不能在类中初始化。必须还要在类外进行定义性说明与初始化,如果不初始化默认为0。
特殊的整型static const 成员:(这里注意是整型)
在类中定义并初始化,可以不再类外定义(按照一般的static定义也是对的)。
static成员的优点:
(1)static成员的名字是在类作用域中,可以避免与全局变量和其他类成员的命名冲突
(2)实现了封装
(3)可以看出成员是与哪个类相关联
看一个例子:
#include <iostream>
using namespace std;
class A
{
public:
static int a; //引用性声明,不能在这初始化,必须在类体外进行定义性说明
//static int a=0; //error 不能再类中直接初始化
const static int b = 200;
static const int c = 300; //只能是静态常量整型才能在类中初始化,不需要在类体外进行定义性说明
//static const double d = 400; //error
};
int A::a=100; //定义性说明,必不可少的,不要再带static了,可以在这里初始化
//A::a = 0; //error
int main()
{
cout<<A::a<<endl;
cout<<A::b<<endl;
cout<<A::c<<endl;
return 0;
}
static成员函数:
static成员函数没有this指针
static成员函数不能访问非static成员变量,不能调用非static成员函数
非static成员函数可以访问static成员变量,也可以调用static成员函数
#include <iostream>
using namespace std;
class A
{
private:
static int a;
int b;
public:
void display()
{
cout<<a<<endl;
cout<<b<<endl;
getA();
}
static void getA()
{
cout<<a<<endl;
//cout<<b<<endl; //error因为没有this指针,所以static成员函数不能访问对象的成员
//display(); //error , 同上
}
};
int A::a;
int main()
{
A a;
a.display();
A::getA();
a.getA(); //不建议这样使用
}