第十三问:C++中静态变量的用法有哪些?
1. 静态变量(Static Variables)
用法:
- 在函数内部定义的静态变量在函数调用之间保持其值。
- 在类中定义的静态成员变量属于类而不是对象。
代码示例:
#include <iostream>
void foo() {
static int count = 0; // 静态局部变量
count++;
std::cout << "Count: " << count << std::endl;
}
class MyClass {
public:
static int staticVar; // 静态成员变量声明
};
int MyClass::staticVar = 10; // 静态成员变量定义
int main() {
foo(); // 输出 Count: 1
foo(); // 输出 Count: 2
foo(); // 输出 Count: 3
MyClass obj1, obj2;
std::cout << "Static Var: " << obj1.staticVar << std::endl; // 输出 Static Var: 10
obj1.staticVar = 20;
std::cout << "Static Var: " << obj2.staticVar << std::endl; // 输出 Static Var: 20
return 0;
}
原理:
- 静态局部变量在程序开始时初始化一次,之后的函数调用不会重新初始化。
- 静态成员变量在类中声明,但在类外定义,属于类而不是对象,所有的对象共享同一个静态成员变量。
2. 静态函数(Static Functions)
用法:
- 静态成员函数不能访问非静态成员变量或调用非静态成员函数。
- 静态成员函数可以直接通过类名调用。
代码示例:
#include <iostream>
class MyClass {
public:
static void staticFunction() {
std::cout << "This is a static function." << std::endl;
}
void nonStaticFunction() {
std::cout << "This is a non-static function." << std::endl;
}
};
int main() {
MyClass::staticFunction(); // 直接通过类名调用静态函数
MyClass obj;
obj.nonStaticFunction(); // 通过对象调用非静态函数
return 0;
}
原理:
- 静态成员函数没有
this
指针,因为它们不与任何对象实例相关联。 - 静态函数可以访问静态成员变量,但不能访问非静态成员变量。
3. 静态链接(Static Linkage)
用法:
- 在全局作用域或命名空间作用域内定义的静态变量或函数具有内部链接,只能在定义它们的文件内访问。
代码示例:
// file1.cpp
static int globalVar = 10; // 静态全局变量
void func() {
std::cout << globalVar << std::endl;
}
// file2.cpp
// 这里无法访问file1.cpp中的globalVar
原理:
- 静态链接的变量或函数在编译时被限制在当前文件内,防止命名冲突。
总结