[C++]static

在C++中,static变量有不同的用途和作用,取决于它在程序中的声明位置。它可以用于局部变量、类成员变量和全局变量。

1. 局部static变量

局部static变量是在函数或代码块中声明的static变量。它与普通局部变量的主要区别是:

  • 生命周期:局部static变量的生命周期从第一次执行到该声明开始,直到程序结束。即使函数多次被调用,它的值也会在不同的调用之间保持不变。
  • 作用域:它的作用域仅限于函数或代码块,不能被函数外部直接访问。

示例

1
2
3
4
5
6
7
8
9
10
11
void example() {
static int count = 0; // 只在第一次调用时初始化
count++;
std::cout << "Count: " << count << std::endl;
}

int main() {
example(); // 输出:1
example(); // 输出:2
return 0;
}

2. 类的static成员变量

类中的static成员变量是属于整个类的,而不是属于某个对象的。它在所有类的实例间共享,同一个类的所有对象都可以访问这个变量,并且它的值对所有对象都是相同的。

  • 生命周期:静态成员变量的生命周期从程序开始,到程序结束。
  • 访问方式:可以通过类名或类的对象来访问,但推荐使用类名来访问。
  • 初始化:静态成员变量必须在类定义体外进行初始化,不能在类内部直接赋值。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class MyClass {
public:
static int staticVar;
};

int MyClass::staticVar = 0; // 在类定义外初始化

int main() {
MyClass::staticVar = 10; // 通过类名访问
MyClass obj1, obj2;
std::cout << obj1.staticVar << std::endl; // 输出:10
obj2.staticVar = 20;
std::cout << obj1.staticVar << std::endl; // 输出:20 (共享变量)
return 0;
}

3. 全局static变量或函数

如果在函数外部声明static变量或函数,它的作用域将被限制在定义它的文件中,也就是说,它只能在该文件中访问,不能被其他文件链接或访问。通常,这种用法用于隐藏模块的全局变量,使得它们不会污染其他文件的命名空间。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 在file1.cpp中
static int globalStaticVar = 100;

void function() {
std::cout << globalStaticVar << std::endl;
}

// 在file2.cpp中
extern void function();

int main() {
function(); // 输出:100
// 不能直接访问globalStaticVar,因为它是file1.cpp的静态变量
return 0;
}

4. static成员函数

如果在类中声明一个static成员函数,那么该函数可以在没有对象实例的情况下被调用。static成员函数只能访问类的static成员变量或其他static成员函数,不能访问非静态成员。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class MyClass {
public:
static int staticVar;

static void staticFunction() {
std::cout << "Static variable: " << staticVar << std::endl;
}
};

int MyClass::staticVar = 42;

int main() {
MyClass::staticFunction(); // 可以在没有对象的情况下调用
return 0;
}

总结

  • 局部static变量:初始化一次,生命周期贯穿整个程序,作用域限于函数内。
  • 类的static成员变量:在类的所有对象之间共享,必须在类外进行初始化。
  • 全局static变量:作用域限制在定义它的文件中,不会被其他文件访问。
  • 类的static成员函数:无需创建对象即可调用,只能访问static成员。

这些特性使得static关键字在C++中广泛用于控制变量和函数的生命周期、作用域和访问权限。


[C++]static
https://erlsrnby04.github.io/2024/10/04/C-static/
作者
ErlsrnBy04
发布于
2024年10月4日
许可协议