- C++
【C++】C++关键字-static介绍学习笔记教程
- 2025-8-11 13:19:39 @
1 条评论
-
admin SU @ 2025-8-11 13:19:48
C++关键字-static学习笔记
一、static关键字的基本作用
static
是C++中一个多功能的关键字,其核心作用是改变变量或函数的存储方式、作用域或生命周期。根据使用场景的不同,static
的具体含义和效果会有所差异。二、静态局部变量(在函数内部使用)
在函数内部声明的变量前加上
static
,该变量就成为静态局部变量。特点:
- 生命周期:从第一次函数调用时初始化,直到程序结束才销毁(普通局部变量在函数调用结束后销毁)。
- 作用域:仅在声明它的函数内部可见。
- 初始化:只初始化一次,后续函数调用会保留上次的值。
示例代码:
#include <iostream> using namespace std; int count() { static int num = 0; // 静态局部变量 num++; return num; } int main() { cout << count() << endl; // 输出1 cout << count() << endl; // 输出2 cout << count() << endl; // 输出3 return 0; }
应用场景:
- 记录函数被调用的次数。
- 实现单例模式(确保某个类只有一个实例)。
三、静态全局变量(在文件作用域声明)
在全局变量前加上
static
,该变量就成为静态全局变量。特点:
- 作用域:仅在当前文件中可见(普通全局变量可以被其他文件通过
extern
引用)。 - 生命周期:从程序开始到程序结束。
示例代码:
// file1.cpp static int g_val = 10; // 静态全局变量,仅在file1.cpp中可见 // file2.cpp extern int g_val; // 错误,无法引用file1.cpp中的静态全局变量
应用场景:
- 避免不同文件中的全局变量重名冲突。
- 限制变量的作用域,提高代码的封装性。
四、静态成员变量(在类中声明)
在类的成员变量前加上
static
,该变量就成为静态成员变量。特点:
- 存储方式:不属于类的任何实例,而是属于整个类,所有实例共享同一份数据。
- 初始化:必须在类外进行初始化(语法:
数据类型 类名::变量名 = 初始值;
)。 - 访问方式:可以通过
类名::变量名
或对象.变量名
访问(需要满足访问权限)。
示例代码:
#include <iostream> using namespace std; class Student { public: static int total; // 静态成员变量,记录学生总数 string name; }; // 类外初始化静态成员变量 int Student::total = 0; int main() { Student s1; s1.name = "张三"; Student::total++; // 通过类名访问 Student s2; s2.name = "李四"; s2.total++; // 通过对象访问 cout << "学生总数:" << Student::total << endl; // 输出2 return 0; }
应用场景:
- 存储类级别的共享数据(如统计类的实例数量)。
五、静态成员函数(在类中声明)
在类的成员函数前加上
static
,该函数就成为静态成员函数。特点:
- 调用方式:属于整个类,可以通过
类名::函数名
或对象.函数名
调用(需要满足访问权限)。 - 访问限制:只能访问类的静态成员变量和静态成员函数,不能访问非静态成员变量和非静态成员函数(因为没有
this
指针)。 - 生命周期:不属于任何实例,和类的生命周期一致。
示例代码:
#include <iostream> using namespace std; class MathUtil { public: // 静态成员函数,计算两个数的和 static int add(int a, int b) { return a + b; } }; int main() { int sum1 = MathUtil::add(3, 5); // 通过类名调用 MathUtil mu; int sum2 = mu.add(2, 7); // 通过对象调用 cout << sum1 << " " << sum2 << endl; // 输出8 9 return 0; }
应用场景:
- 实现工具类函数(如数学计算、数据转换等,不需要访问类的实例数据)。
- 管理静态成员变量(如提供修改或获取静态成员变量的接口)。
六、总结:static在不同场景的作用对比
使用场景 核心作用 生命周期 作用域 静态局部变量 延长局部变量的生命周期 从第一次初始化到程序结束 所在函数内部 静态全局变量 限制全局变量的作用域 从程序开始到程序结束 所在文件内部 静态成员变量 实现类级别的共享数据 类内部(通过类或对象访问) 静态成员函数 实现类级别的工具函数,不依赖实例数据 通过合理使用
static
关键字,可以提高代码的封装性、减少命名冲突,并实现一些特殊的功能(如单例模式、工具类等)。但需注意避免过度使用,以免增加代码的复杂度和耦合性。
- 1