2023-10-07
编程
00
请注意,本文编写于 348 天前,最后修改于 178 天前,其中某些信息可能已经过时。

目录

1. 静态局部变量
2. 静态成员变量
3. 静态成员函数
4. 静态全局变量
5. 线程局部存储(Thread Local Storage, TLS)
总结

在C++中,static关键字是一个多功能的修饰符,它在不同的上下文中具有不同的含义。本文将详细介绍C++中static关键字的各种用法。

1. 静态局部变量

在函数内部,static可以用来声明局部变量。当函数内部的变量被声明为static时,它实际上是在静态存储区域(通常在BSS段)中存储的,而不是在堆栈上。这样的局部变量在程序的生命周期内只初始化一次,并且它的生命周期贯穿整个程序,即使该函数执行结束后也不会被销毁。

cpp
void counter() { static int count = 0; count++; std::cout << count << std::endl; }

每次调用counter函数时,都会输出递增的数字,而不是每次都从1开始。

2. 静态成员变量

在类中,static修饰的成员变量表示该变量是属于类本身的,而不是属于类的某个对象的。所有该类的对象共享同一个静态成员变量。它们在内存中只有一个实例,无论创建了多少对象。

cpp
class MyClass { public: static int count; MyClass() { count++; } }; int MyClass::count = 0;

每次创建一个MyClass对象时,count的值都会增加。

3. 静态成员函数

在类中,static还可以修饰成员函数。静态成员函数不需要类的对象就可以调用。由于它们没有this指针,所以不能直接访问非静态成员变量和非静态成员函数,但它们可以访问静态成员变量和其他静态成员函数。

cpp
class MyClass { public: static int count; static void showCount() { std::cout << count << std::endl; } }; int MyClass::count = 0;

4. 静态全局变量

在文件作用域内,static可以用来限制全局变量或函数的链接范围到当前文件。这意味着,这些变量或函数在其他文件中是不可见的。

cpp
// file1.cpp static int myVariable = 10;

myVariable只在file1.cpp中可见。

5. 线程局部存储(Thread Local Storage, TLS)

在C++11及之后的版本中,static关键字还可以用在类的成员初始化中,表示该成员是一个线程局部的。

cpp
class MyClass { public: static thread_local int myThreadVariable; };

这意味着每个线程都有一个myThreadVariable的副本。

总结

static在C++中是一个强大而多功能的修饰符。根据上下文的不同,它可以用于控制变量的生命周期、限制链接范围或标记线程局部变量。希望本文能帮助您更好地理解和使用static关键字。

本文作者:Rowlet

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!