在类中的数据成员或成员函数定义或声明前以static关键词开头,即构成静态数据成员与静态成员函数。
1.静态数据成员的实现
class Time
{
public :
void showtime();
private:
static int hour; //定义hour为静态数据成员
int minute;
int sec;
};
2.静态数据成员的意义
C++为什么要进入静态数据成员这个概念,或者它有什么好处。 静态数据成员可以实现一个类中不同对象的某个数据的值是一样的。比如一个类中包含的数据成员有:班级,姓名,学号,性别。那么对于一个班的几个同学,班级的值一定是一样的。假设每一个学生就是一个对象,那么不同的对象的数据中,班级这个数据就是一样的。 所以这也就是静态的数据成员的意义,当班级的数据前加上static关键字后,班级被定义为静态数据成员,当这个值改变时,该类实例化出的每一个对象的班级数据全部随之改变。
3.静态数据成员的特性
(1)静态数据成员的属性: 静态数据成员属于类,而不属于某一个对象。
(2)静态数据成员的初始化: 静态数据成员在类内定义,而不能在类内完成初始化,直接赋值和利用构造函数初始化都不可以。我是这样理解这个特性的:
//直接赋值完成初始化
class Time
{
public :
void showtime();
private:
static int hour = 0;
int minute;
int sec;
};
这个很好理解,这显然是错的,因为只有静态常量才能在类内完成初试化,要改成这样才可以static const int hour = 0;
但是如果写成这样,该数据成员将无法改变,显然我们并不希望如此。
//利用构造函数初始化静态数据成员
class Time
{
public :
Time()
{
hour = 0;
minute = 0;
sec = 0;
}
void showtime();
private:
static int hour;
int minute;
int sec;
};
利用构造函数初始化静态数据成员,这也是错的。我们可以这样理解这件事,在构造函数的博客里提到:类中的构造函数在实例化对象时被系统调用,然后实现对成员数据的赋值工作,显然这些数据成员属于对象。而静态数据成员属于类,不属于任何一个对象。
那么应该如何完成静态数据成员的初始化:静态数据成员的初始化只能在类体外完成。
class Time
{
public :
void showtime();
private:
static int hour ;
int minute;
int sec;
};
int Time::hour= 10;
这是正确的方式!!看着很奇怪有没有!!没有对象,直接用类名引用成员,这也恰恰说明了静态数据成员不属于任何对象,而属于类本身。
(3)静态数据成员的引用: 从(2)中已经看到了,可以直接用类名来引用静态数据成员。同时也可以通过对象来引用,这是因为虽然静态数据成员不属于某一个对象而是属于类,但是对象属于类,所有也就可以应用对象来引用静态数据成员。
4.静态数据成员的应用
#include <iostream>
using namespace std;
class Time
{
public :
Time(int,int);
void showtime();
private:
static int hour ;
int minute;
int sec;
};
Time::Time(int m,int s)
{
minute = m;
sec = s;
}
int Time::hour= 10;
void Time::showtime()
{
cout<<"hour:"<<hour<<endl<<"min:"<<minute<<endl<<"sec:"<<sec<<endl;
}
int main()
{
Time time1(2,3);
time1.showtime();
Time time2(4,5);
time2.showtime();
getchar();
return 0;
}
运行结果: hour:10 minute:2 sec:3 hour:10 minute:4 sec:5
可以看到:两个对象的hour成员都是10。
和静态数据成员类似,静态成员函数一样也是在前面加入static关键字。 1.静态成员函数的实现
class Time
{
public :
static void showtimeh();//定义showtimeh()为静态成员函数
void showtime();
private:
static int hour; //定义hour为静态数据成员
int minute;
int sec;
};
2.静态成员函数的意义
静态成员函数可以使一切不需要实例化就可以有确定行为方式的函数使用起来更加方便,比如某些通用算法。由于静态成员函数只能访问本类中的静态数据成员,而无法访问非静态数据成员,这样使程序设计更加清晰。
3.静态数据成员的特性
(1)静态成员函数的属性: 静态成员函数属于类,而不属于某一个对象。
(2)静态成员函数的访问: 静态成员函数只能访问本类中的静态数据成员。 非静态成员函数可以访问本类中的静态数据成员与非静态数据成员。 4.静态数据成员的应用
#include <iostream>
using namespace std;
class Time
{
public :
Time(int,int);
static void showtimeh();
void showtime();
private:
static int hour ;
int minute;
int sec;
};
Time::Time(int m,int s)
{
minute = m;
sec = s;
}
int Time::hour= 10;
void Time::showtime()
{
cout<<"hour:"<<hour<<endl<<"min:"<<minute<<endl<<"sec:"<<sec<<endl;
}
void Time::showtimeh()
{
cout<<"hour:"<<hour<<endl;
}
int main()
{
Time time1(2,3);
time1.showtime();
Time::showtimeh();
getchar();
return 0;
}
运行结果: hour:10 minute:2 sec:3 hour:10