前言
你是否常常看到代码上::这个符号?
其实这是利用类名和作用域运算符来访问静态数据成员或嵌套类,这里主要介绍静态数据成员
静态成员就是在成员变量和成员函数前加上关键字static,称为静态成员。
本文将详细介绍静态数据成员和静态成员函数,以及创建和调用的细节
一、静态数据成员
- 静态数据成员
- 所有对象共享同一个静态数据成员
- 在编译阶段分配内存
- 类内声明,类外初始化,很重要
- 静态数据成员也有权限限制(private类外是不可以访问的)
class MyClass {
public:
static int count; // 静态数据成员声明
};
int MyClass::count = 0; // 静态数据成员初始化(很重要)
int main() {
MyClass::count = 10; // 访问静态数据成员
return 0;
}
二、静态成员函数
静态成员函数
- 所有对象共享同一个函数
- 静态成员函数只能访问静态成员变量
- 属于类本身,但不是类对象
- 静态成员函数可以直接通过类名调用,无需创建类的对象
class MathUtils {
public:
static int add(int a, int b) { // 静态成员函数
return a + b;
}
};
int main() {
int sum = MathUtils::add(2, 3); // 调用静态成员函数
return 0;
}
静态成员函数两种调用方式
//静态成员变量两种访问方式
//1、通过对象
MathUtils m1;
m1.add(2,3);
//2、通过类名
MathUtils::add(2, 3);
只能访问静态成员
class MathUtils {
public:
static int add(int a, int b) { // 静态成员函数
m_A = 100;
a=m_A;
//m_B = 100; //错误,不可以访问非静态成员变量
return a+ b;
}
static int m_A; //静态成员变量
int m_B; //
};
使用静态成员的好处
共享数据:静态数据成员可以用于表示类的全局状态或共享信息。
全局操作:静态成员函数可以执行与类相关的全局操作,无需创建对象。
总结
静态成员是属于类本身而不是类的对象的成员。它们可以是静态数据成员或静态成员函数。静态成员在内存中只有一个副本,与类的所有对象共享。静态成员函数不依赖于类的实例,可以直接通过类名调用。静态成员在表示共享数据和执行与类相关的全局操作时非常有用。