静态成员,指的是在c++类中声明成员时可以加上static关键字,这样声明的成员就叫做静态成员(包括数据成员和成员函数)。即声明为static的类成员或者成员函数便能在类的范围内同享。

静态成员变量

特点

  • 所有对象共享同一份数据
  • 在编译阶段分配内存
  • 类内声明,类外初始化

访问方式

  1. 通过对象进行访问
  2. 通过类名进行访问

示例:

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
#include<iostream>
using namespace std;

class Person {
public: //公共权限
static int m_A; //类内声明静态成员变量
private: //私有权限
static int m_B;
};

int Person::m_A = 100; //类外初始化
int Person::m_B = 300;

int main() {
Person p; Person p2;
//公有权限
cout << p.m_A << endl; //通过对象进行访问
cout << Person::m_A << endl; //通过类名进行访问
p2.m_A = 200; //所有对象共享同一份数据
cout << p2.m_A << endl;
cout << p.m_A << endl;
cout << Person::m_A << endl;
//私有权限
cout << p.m_B; //报错,不可访问
cout << Person::m_B; //报错,不可访问
return 0;
}
}

静态成员函数

特点

  • 所有对象共享同一个函数
  • 静态成员函数只能访问静态成员变量

访问方式

  1. 通过对象进行访问
  2. 通过类名进行访问

示例:

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
#include<iostream>
using namespace std;

class Person {
public: //公有权限
static void func() {
m_A = 100; //静态成员函数可以访问 静态成员变量
m_B = 200; //报错,静态成员函数,不可访问 非静态成员变量,无法区分到底是哪个对象的m_B属性
cout << "static void func的调用" << endl;
}

static int m_A; //静态成员变量
int m_B; //非静态成员变量

private: //私有权限
static void func2() {
cout << "static void func2的调用" << endl;
}
};

int Person::m_A = 0;


int main() {
Person p;
p.func(); // 通过对象进行访问
Person::func(); //通过类名进行访问
Person::func2(); //报错,类外访问不到私有静态成员函数
return 0;
}