C++关键字之static
静态成员
静态成员的提出是为了解决数据共享的问题。实现数据共享有许多种方法,其中使用全局性的变量或对象是一种方法。但是全局性会带来一个问题:
不安全性——全局量在程序任何地方都可以更新而不加限定,无法控制范围。
static的作用
C++中的static的作用基本与C中static中一致。唯一的区别是C++中多了一个类域,所以C++对static进行了一方面的扩展:static修饰“类的成员”,正是有了这样的扩展,static才可以解决数据共享问题。
因为类也是一种类型,所以static修饰的对象类似于static修饰的普通变量!
静态成员包含静态数据成员和静态成员函数
静态数据成员
此时static修饰的成员变量就变成了对该成员变量的声明而再不是定义!此时该成员叫做静态成员变量或静态数据成员。
- 静态数据成员的定义或说明时前面加关键字static
- 静态数据成员的初始化应该在类体外进行,格式如下:
<数据类型> <类名>::<静态数据成员名>=<初值>;- 静态数据成员被存放在静态数据区所以必须对它进行初始化
- 静态成员和类的普通成员一样,也有public、protected、private3种访问级别,也可以具有返回值,const修饰符等参数
- 所有对象共享一个static类成员变量
class Data{
public:
Data(int _year = 0, int _month = 0, int _day = 0)
:year(_year),
month(_month),
day(_day)
{
cout << "构造成功!-->"<<this<<endl;
}
~Data()
{
cout << "析构成功!-->"<<this<<endl;
}
void print_data()
{
cout << this->year <<" " << this->month <<" "<< this->day <<" " <<this->minute <<endl;
}
static int minute;
private:
int year;
int month;
int day;
};
int Data::minute = 0;
int main()
{
Data data;
data.print_data();
cout << data.minute<<endl;
cout << Data::minute<<endl;
return 0;
}
static修饰类的成员函数
静态成员函数的实现中可以直接引用类中说明的静态成员,而不可以直接引用非静态成员。静态成员函数要引用非静态成员时,可以通过对象来引用(不能是this指针)。最重要的一点:静态成员函数没有this指针。
class Data{
public:
Data(int _year = 0, int _month = 0, int _day = 0)
:year(_year),
month(_month),
day(_day)
{
cout << "构造成功!-->"<<this<<endl;
}
~Data()
{
cout << "析构成功!-->"<<this<<endl;
}
static void count_day(Data &data)
{
cout << "year = "<<data.year<<" minute = "<<data.minute<<endl;
}
void print_data()
{
cout << this->year <<" " << this->month <<" "<< this->day <<" " <<this->minute <<endl;
}
static int minute;
private:
int year;
int month;
int day;
};
int Data::minute = 0;
int main()
{
Data data;
data.print_data();
cout << data.minute<<endl;
cout << Data::minute<<endl;
data.count_day(data);
return 0;
}