1. 静态局部变量
在函数内部,可以使用 static
修饰变量,以便在函数调用之间保留其值。静态局部变量在第一次调用函数时初始化,并在程序的整个生命周期内存在,但其作用域仅限于该函数内部。
#include <iostream>
void counter() {
static int count = 0; // 静态局部变量
count++;
std::cout << "Count: " << count << std::endl;
}
int main() {
counter(); // 输出: Count: 1
counter(); // 输出: Count: 2
counter(); // 输出: Count: 3
return 0;
}
2. 静态成员变量
在类中,static
修饰符用于定义静态成员变量。这类变量属于类本身,而不是属于某一个对象。所有对象共享相同的静态成员变量。
#include <iostream>
class Example {
public:
static int count; // 声明静态成员变量
Example() {
count++; // 每当创建一个对象时,增加 count
}
static void displayCount() {
std::cout << "Count: " << count << std::endl;
}
};
// 静态成员变量的定义
int Example::count = 0;
int main() {
Example obj1;
Example obj2;
Example::displayCount(); // 输出: Count: 2
return 0;
}
3. 静态成员函数
静态成员函数也属于类本身,而不是类的对象。您不能在静态成员函数中访问非静态成员变量和非静态成员函数,因为静态成员函数不属于具体的对象。
#include <iostream>
class Counter {
public:
static int count;
static void increment() {
count++;
}
};
// 静态成员变量的定义
int Counter::count = 0;
int main() {
Counter::increment(); // 通过类名调用静态方法
Counter::increment();
std::cout << "Count: " << Counter::count << std::endl; // 输出: Count: 2
return 0;
}
4. 静态全局变量和函数
static
关键字也可以在全局作用域使用,使全局变量或函数的可见性仅限于定义它的源文件。其他文件无法访问使用 static
修饰的全局变量或函数,这可以用来限制作用域并避免名称冲突。
// file1.cpp
#include <iostream>
static void greet() { // 静态全局函数
std::cout << "Hello from file1!" << std::endl;
}
void callGreet() {
greet();
}
// file2.cpp
#include <iostream>
// void greet(); // 无法原型这函数, 因为它是静态的
int main() {
callGreet(); // 只能通过调用 callGreet() 使用
return 0;
}
总结
在 C++ 中,static
的主要用法通过几种不同的上下文提供了灵活性:
- 静态局部变量: 用于在函数调用之间保存状态。
- 静态成员变量: 允许类变量在所有对象之间共享。
- 静态成员函数: 用于访问静态成员,不需要创建对象。
- 静态全局变量和函数: 限制符号的可见性,以避免命名冲突。
通过适当地使用 static
,可以有效地管理内存和数据共享,同时增强代码的组织性和可读性。