静态局部变量
在函数内部使用 static 关键字修饰的局部变量叫做静态局部变量。
初始化时间:
在函数第一次被调用的时候进行初始化。
静态局部变量的生存期从其初始化开始,一直延续到程序的终止。与自动局部变量(非静态局部变量)不同,静态局部变量在函数调用结束后并不会被销毁。
静态局部变量仅在第一次执行到其声明的代码行时进行初始化,并且只进行一次初始化。之后,即使函数退出,该变量的值仍然保持不变,直到程序结束。
静态全局变量
态全局变量在程序启动时进行初始化,并一直存在于整个程序执行期间。它们占用静态存储区域,并在程序终止时才被销毁。
静态局部变量在函数第一次执行到其声明的代码行时进行初始化,并且只进行一次初始化。它们的生存期与静态全局变量类似,在整个程序执行期间持续存在,直到程序终止时才被销毁。
无论是静态局部变量还是静态全局变量,生命周期都是在进行初始化之后,直到整个程序终止才被销毁。
静态变量默认初始化为零(对于基本数据类型)。
静态成员变量
静态成员变量:在类中声明的静态成员变量,属于类的一部分,而不是对象的一部分。它们在类外部进行定义和初始化,并且只初始化一次。静态成员变量在整个程序执行期间存在,无论是否创建了类的实例或对象。
初始化的时机与静态全局变量相同。
静态成员函数
类内部使用 static 关键字修饰的函数是静态函数。 静态函数属于类而不是类的实例,可以通过类名直接调用,而无需创建对象。 静态函数不能直接访问非静态成员变量或非静态成员函数。
静态常量
在编译时期进行初始化,并且在整个程序执行期间保持不变。
当涉及静态常量时,有两种常见的情况:类内的静态常量和全局的静态常量。下面是它们的示例:
- 类内的静态常量:
class MyClass {
public:
static const int MAX_VALUE = 100; // 类内的静态常量声明和定义
};
// 类外部可以直接使用类名加作用域解析运算符来访问静态常量
int main() {
int value = MyClass::MAX_VALUE;
// ...
return 0;
}
在这个示例中,MyClass
类内部声明和定义了一个静态常量 MAX_VALUE
。这个常量可以通过类名加作用域解析运算符 ::
在类外部进行访问和使用。
- 全局的静态常量:
static const double PI = 3.14159; // 全局的静态常量声明和定义
int main() {
double radius = 5.0;
double circumference = 2 * PI * radius; // 在全局范围内访问全局静态常量
// ...
return 0;
}
在这个示例中,全局范围内声明和定义了一个静态常量 PI
。这个常量可以在程序的任何地方进行访问和使用。
无论是类内的静态常量还是全局的静态常量,它们在编译时期进行初始化,并且在整个程序执行期间保持不变。它们的值在编译时确定,并且无法在运行时修改。
静态断言
静态断言:静态断言是在编译时期进行的断言检查,用于在编译阶段验证一些常量表达式或类型特性是否满足特定条件。如果断言条件不满足,编译过程将失败并显示错误消息。
static_assert(sizeof(int) == 4, "Size of int must be 4 bytes");
静态对象
静态对象是在程序启动时期创建,并在整个程序执行期间持续存在的对象。静态对象的生存期与程序的生存期相同,它们在程序启动时进行构造,并在程序结束时进行析构。
单例模式:下面是懒汉模式。还存在饿汉模式,就是做成静态成员变量。等待被调用。
class MySingleton {
public:
static MySingleton& getInstance() {
static MySingleton instance;
return instance;
}
private:
MySingleton() {
// 构造函数私有化,确保只能通过 getInstance() 获取实例
}
// 其他成员和函数...
};
静态模板成员
在类模板中,可以声明静态模板成员,它们与类的特定实例无关,可以在模板的不同实例之间共享。
template<typename T>
class MyTemplateClass {
public:
template<typename U>
static U add(U a, U b) {
return a + b;
}
};