【C++八股】static关键字
static
用于修改变量、函数、类成员的存储方式和作用域。面试中常考 static
的作用、使用场景、与普通变量的区别。
1. static
修饰局部变量
作用:局部变量的生命周期变为整个程序运行期间,但作用域仍然在当前函数内。
#include <iostream>
void func() {
static int count = 0; // 只初始化一次
count++;
std::cout << count << std::endl;
}
int main() {
func(); // 输出 1
func(); // 输出 2
func(); // 输出 3
}
✅ 特点:
- 只初始化一次(即使多次调用
func()
)。 - 不会被销毁,程序结束时才释放。
✅ 应用场景:计数器、状态保持等。
2. static
修饰全局变量
✅ 作用:限制全局变量的作用域,使其只能在当前文件内访问。
1)普通全局变量(作用域跨文件)
// a.cpp
int globalVar = 10; // 可以在其他文件访问
// b.cpp
extern int globalVar; // 其他文件可访问
(2)static
修饰全局变量(作用域仅限当前文件)
// a.cpp
static int globalVar = 10; // 仅限 a.cpp 使用,b.cpp 无法访问
// b.cpp
extern int globalVar; // ❌ 编译错误,找不到 globalVar
✅ 总结:
- 普通全局变量:作用域跨文件,可以用
extern
引用。 static
全局变量:只在当前文件可见,防止命名冲突。
✅ 应用场景:防止变量污染,避免多个文件中的变量重名。
3. static
修饰函数
✅ 作用:限制函数的作用域,使其只能在当前文件内访问。
(1)普通函数(可跨文件调用)
// a.cpp
void func() {
std::cout << "Hello" << std::endl;
}
// b.cpp
extern void func(); // ✅ 可以跨文件调用
(2)static
修饰函数(作用域仅限当前文件)
// a.cpp
static void func() { // 仅限 a.cpp 使用
std::cout << "Hello" << std::endl;
}
// b.cpp
extern void func(); // ❌ 编译错误,无法访问
✅ 总结:
- 普通函数:可以跨文件调用。
static
函数:仅限当前文件使用,防止函数名冲突。
✅ 应用场景:隐藏内部实现,避免污染全局命名空间。
4. static
修饰类成员
(1)static
修饰类成员变量
✅ 作用:
- 所有对象共享,属于类而不是对象。
- 只能在类外初始化。
#include <iostream>
class A {
public:
static int count; // 声明静态成员变量
};
int A::count = 0; // ✅ 类外初始化
int main() {
A obj1, obj2;
obj1.count = 5;
std::cout << obj2.count << std::endl; // 输出 5(共享同一份数据)
}
✅ 特点:
- 所有对象共享一份数据。
- 类外初始化(不能在类内直接赋值)。
2)static
修饰类成员函数
✅ 作用:
- 不依赖对象,可以直接通过类名访问。
- 不能访问非
static
成员变量。#include <iostream> class A { public: static void show() { // 静态成员函数 std::cout << "Static function" << std::endl; } }; int main() { A::show(); // ✅ 直接通过类名访问 }
✅ 特点:
- 不依赖对象,可以直接用
类名::方法()
调用。 - 不能访问普通成员变量,因为静态函数没有
this
指针。
✅ 应用场景:
- 计数器(统计对象个数)。
- 单例模式(保证全局唯一对象)。
6. 总结
🔥 面试官常问的 static
关键问题:
-
static
修饰局部变量和普通局部变量的区别?- 普通局部变量每次调用都会重新创建,
static
变量只初始化一次,整个程序生命周期都存在。
- 普通局部变量每次调用都会重新创建,
-
static
修饰全局变量的作用?- 限制作用域到当前文件,防止与其他文件的全局变量重名冲突。
-
static
修饰函数的作用?- 限制作用域到当前文件,防止跨文件调用。
-
static
修饰类成员的作用?- 所有对象共享一个变量,不依赖对象可以直接访问。
✅ 口诀记忆
- 局部变量
static
,存活整个程序 - 全局变量
static
,作用范围缩小 - 函数
static
,只能在本文件用 - 类成员
static
,多个对象共用