C++中的模式

单例模式

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;
}
 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值