1. 静态成员的作用
1.1 为什么要有静态成员
- 静态成员:局限在类中使用的全局资源
2. 静态成员变量
2.1 语法
- 普通成员变量的定义和初始化是在构造时完成的。而静态成员需要在类的外部单独进行定义和初始化(语法要求)。
- 实例化出来的对象只有非静态的的成员变量, 没有静态的。静态成员变量是类中的全局资源,并不属于对象(但是属于类)。但对象是可以使用类中的静态变量的,从而实现对象间的数据共享。
- 静态变量和全局变量类似,被存放在全局区,可以把静态成员变量理解为限制在类中使用的全局变量。
- 静态成员变量也要收到类的访问控制限定符 public, private, product 的约束
- 在类的外部访问静态成员变量
- 类名::静态成员变量;
- 对象.静态成员变量; // 这种访问方式不推荐,容易和普通成员变量访问方式混淆
2.2 代码示例
#include <iostream>
#include <cstring>
using namespace std;
class A{
public:
A(int data = 0):m_data(data){};
int m_data;
static int s_data;
};
int A::s_data = 20;
int main(void){
A a1(10);
cout << sizeof(a1) << endl;// 4,a1对象中只有非静态成员变量
cout << A::s_data << endl; // 20
// 虽然s_data不属于a1, 但是a1对象是可以访问类中的静态变量的
// 可以类比: 成员函数是代码段的,对象是栈区的,对象也可以调用成员函数
cout << a1.s_data << endl; // 20
}
3. 静态成员函数
3.1 语法
- 普通常成员函数中的const是用来修饰this指针的,静态成员函数没有this指针,自然就没有const属性
- 静态成员函数没有this指针, 自然就没办法访问普通成员变量。静态成员变量是局限在类中使用的全局变量, 普通成员函数自然是可以访问的。
- 推荐: 类名::静态成员函数(实参表) 便于和普通成员函数的调用区分开
3.2 代码示例
#include <iostream>
#include <cstring>
using namespace std;
class A{
public:
A(int data = 0):m_data(data){};
void func_1(void){
cout << "普通成员函数" << endl;
}
static void func_2(void){
// cout << m_data << endl; // error, 因为静态成员函数没有this指针, 是访问不了普通局部变量的
cout << s_data <<"静态成员函数" << endl;
}
int m_data;
static int s_data;
};
int A::s_data = 20;
int main(void){
A::func_2(); // 推荐
A a1(10);
a1.func_1(); // A::func_1(&a1)
a1.func_2(); // A::func_2()
}
$ ./a.out
20静态成员函数
普通成员函数
20静态成员函数