在C++中,static
是一个关键字,它可以用于多种不同的上下文中,具有不同的含义。下面我将分别介绍 static
在不同情况下的用法:
1.静态局部变量:
在函数内部声明的变量前加上 static
关键字,就创建了一个静态局部变量。静态局部变量在程序执行期间只被初始化一次,并且在函数调用结束后,其值会被保留下来,下次调用函数时会继续使用上次保留的值。静态局部变量的生命周期与程序的整个运行周期相同。
示例:
#include <iostream>
void foo() {
static int count = 0;
count++;
std::cout << "Count: " << count << std::endl;
}
int main() {
foo(); // 输出 Count: 1
foo(); // 输出 Count: 2
foo(); // 输出 Count: 3
return 0;
}
2.静态全局变量:
在全局作用域(即在所有函数之外)声明的变量前加上 static
关键字,就创建了一个静态全局变量。静态全局变量的作用域仅限于当前源文件,其他源文件无法访问它,即它具有内部链接(internal linkage)。
示例:
// File1.cpp
#include <iostream>
static int count = 0; // 静态全局变量,只能在当前源文件中访问
void foo() {
count++;
std::cout << "Count: " << count << std::endl;
}
// File2.cpp
#include <iostream>
extern int count; // 在其他源文件中使用 extern 声明外部变量
void bar() {
count++;
std::cout << "Count: " << count << std::endl;
}
int main() {
foo(); // 输出 Count: 1
bar(); // 输出 Count: 2
return 0;
}
3.静态成员变量:
在类中声明的变量前加上 static
关键字,就创建了一个静态成员变量,它被该类的所有对象共享,而不是每个对象都有一份。静态成员变量必须在类的定义外部进行初始化。
示例:
#include <iostream>
class MyClass {
public:
static int count; // 静态成员变量声明
};
int MyClass::count = 0; // 静态成员变量定义和初始化
int main() {
MyClass obj1;
MyClass obj2;
obj1.count++; // 等价于 MyClass::count++
std::cout << "Count: " << obj1.count << std::endl; // 输出 Count: 1
obj2.count++; // 等价于 MyClass::count++
std::cout << "Count: " << obj2.count << std::endl; // 输出 Count: 2
std::cout << "Count: " << MyClass::count << std::endl; // 输出 Count: 2
return 0;
}
4.静态成员函数:
在类中声明的成员函数前加上 static
关键字,就创建了一个静态成员函数。静态成员函数不依赖于任何特定的对象,可以直接通过类名调用。它不能访问类的非静态成员,也不能使用 this
指针。
示例:
#include <iostream>
class MyClass {
public:
static void staticFunction() {
std::cout << "This is a static member function." << std::endl;
}
void nonStaticFunction() {
std::cout << "This is a non-static member function." << std::endl;
}
};
int main() {
MyClass::staticFunction(); // 输出 This is a static member function.
MyClass obj;
obj.nonStaticFunction(); // 输出 This is a non-static member function.
return 0;
}
这就是 static
在 C++ 中的几种常见用法。它可以用于控制变量的生命周期、作用域和共享性,以及创建独立于对象的成员函数。