# 九. static
静态成员是指声明为static的成员,在类的范围内所有对象共享该数据
可以是公有的、私有的、保护的。若为公有的可直接访问
访问格式:
<类名>::<静态成员>
对象名.公有静态成员
对象指针->静态成员
静态数据成员
静态数据成员不属于任何数据对象,它在程序创建时编译并初始化,所以在该类的任何对象被创建前就存在,不占用对象空间(即计算类占用空间时,只算普通数据成员的字节数,不算静态数据成员)
静态数据成员初始化的格式为:
<数据成员><类名>::<静态数据成员名>=<初始值>;
静态成员函数
静态成员函数的定义是在一般函数定义前加上static关键字
- 一般情况下,静态成员函数主要用来访问全局变量或同一个类中的静态数据成员。可以用在建立任何对象之前处理静态数据成员
- 静态成员函数不访问类中的非静态成员
- 静态成员函数中是没有this指针的
- 静态成员函数可以在类体内定义,也可以在类体外定义。在类体外时,不用static前缀
如:
#include<iostream>
using namespace std;
class Student
{
private:
double score;
public:
static int count;//静态数据成员
static double total;//静态数据成员
Student(double score)
{
this->score = score;
count++;//增加人数
total += score;//增加分数
}
static double getAverage()//静态成员函数
{
//? cout<<score<<endl; //错误,因为静态成员函数不能访问非静态数据成员,score依赖某个具体对象
return total/count;
}
static double getTotal()//静态成员函数
{
return total;
}
};
int Student::count = 0;//静态数据成员的初始化
double Student::total = 0;//静态数据成员的初始化
int main()
{
Student s[3] = {Student(70),Student(80),Student(90)};
cout<<Student::getAverage()<<endl;//用类名访问静态成员函数
cout<<Student::getTotal()<<endl;
cout<<s[1].count<<endl;//输出静态数据成员count,此为用对象访问,输出为2,可能造成误解,所以用类名访问较好
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37