单例模式
class Singleton {
private:
// 私有的默认构造函数,防止外部直接创建实例
Singleton() {}
// 静态成员变量,存储类的唯一实例
static Singleton* instance;
public:
// 静态成员函数,用于获取类的唯一实例
static Singleton* getInstance() {
if (instance == nullptr) {
instance = new Singleton();
}
return instance;
}
// 禁止拷贝构造函数和赋值运算符
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
// 其他成员函数...
};
// 初始化静态成员变量
Singleton* Singleton::instance = nullptr;
// 使用示例
int main() {
Singleton* s1 = Singleton::getInstance();
Singleton* s2 = Singleton::getInstance();
// s1 和 s2 指向同一个实例
assert(s1 == s2);
return 0;
}
单例模式保证其全局只有一个,具有全运行周期的实例,所以new的空间在程序最终完成时由系统释放
在C++中,static关键字具有多种用途,根据它被使用的上下文,它的作用会有所不同。以下是static关键字在C++中的主要作用:
隐藏作用(文件作用域):
在文件作用域(全局作用域)中,static修饰的变量或函数只在该文件内部可见,即具有内部链接(internal linkage)。这意味着其他文件(即使它们包含相同的头文件)也不能访问这些变量或函数。这有助于隐藏实现细节和防止命名冲突。
持久性(文件作用域):
全局变量或函数具有静态存储期,这意味着它们在程序开始执行之前就被分配了内存,并且在程序结束时才释放。然而,当static修饰全局变量或函数时,它强调了这个持久性。此外,对于函数内的局部静态变量,它们也具有静态存储期,即在函数调用之间保持其值。
控制访问(类作用域):
在类作用域中,static成员变量或函数与类的任何特定对象实例无关。这意味着它们不依赖于类的对象实例而被创建,并且可以通过类名直接访问,而无需创建类的对象实例。静态成员函数只能访问静态成员变量和其他静态成员函数。
初始化:
对于静态局部变量,如果未显式初始化,它们会被自动初始化为零(对于基本数据类型)。这是与非静态局部变量不同的,非静态局部变量如果没有显式初始化,其值将是未定义的。
函数内静态变量:
在函数内部,static关键字可以用于声明局部变量,这些变量将在函数调用之间保持其值。这种变量通常用于在函数调用之间保存状态或用作计数器。
静态断言(C++11起):
static_assert是一个编译时断言,它允许程序员在编译时检查条件是否为真。如果条件不满足,编译器将产生一条错误消息,其中包含程序员提供的自定义消息(可选)。这有助于在编译时捕获错误,而不是在运行时。
下面是一些示例:
文件作用域中的静态变量:
cpp
复制
// file1.cpp
static int x = 10; // 只在file1.cpp中可见
// file2.cpp
// 这里不能访问file1.cpp中的x,即使它们包含相同的头文件
类中的静态成员:
cpp
复制
class MyClass {
public:
static int count; // 静态成员变量
static void incrementCount() { // 静态成员函数
count++;
}
};
int MyClass::count = 0; // 在类外部定义并初始化静态成员变量
int main() {
MyClass::incrementCount();
std::cout << MyClass::count << std::endl; // 输出1
return 0;
}