单件s_instance作为类成员静态变量与函数静态局部变量的区别

在C++中,静态成员变量和静态局部变量虽然都是静态的,但它们的作用和使用方式有明显的区别:

1. **静态成员变量**:
   - 静态成员变量是类的一部分,它是类的所有实例对象共享的,只有一份拷贝。通常在类的声明中定义,然后在类的定义文件中初始化。
   - 静态成员变量可以通过类名::成员名的方式访问,也可以在类的静态成员函数中使用。
   - 静态成员变量的生命周期与程序的生命周期相同,直到程序结束时才被销毁。

2. **静态局部变量**:
   - 静态局部变量是在函数内部声明为静态的变量,它们在函数第一次被调用时初始化,并且只初始化一次。它们在函数执行结束后并不会被销毁,而是保留其值直到程序结束。
   - 静态局部变量对外部是不可见的,只能在其声明所在的函数内部访问。
   - 静态局部变量适合于需要在函数中保持状态或者进行延迟初始化的情况。

**区别总结**:
- **可见性和作用域**:静态成员变量是类的一部分,可以被类的所有实例和静态成员函数访问;静态局部变量仅在声明所在的函数内部可见。
- **生命周期**:静态成员变量的生命周期与程序运行周期相同;静态局部变量的生命周期从第一次调用开始到程序结束。
- **初始化时机**:静态成员变量在类的定义文件中进行初始化;静态局部变量在函数第一次调用时进行初始化。

在实际编程中,选择使用静态成员变量还是静态局部变量取决于需求,静态成员变量适合需要在整个类范围内共享的情况,而静态局部变量适合于函数内部需要保持状态或者进行延迟初始化的情况。

1.

#include <iostream>

class Singleton {
private:
    static Singleton* s_instance; // 静态成员变量,用于存储单例对象指针

    // 私有构造函数,防止外部实例化
    Singleton() {}

public:
    // 静态成员函数,用于获取单例对象实例
    static Singleton* getInstance() {
        if (s_instance == nullptr) {
            s_instance = new Singleton();
        }
        return s_instance;
    }

    void showMessage() {
        std::cout << "Hello, I am a singleton object!" << std::endl;
    }
};

// 初始化静态成员变量
Singleton* Singleton::s_instance = nullptr;

int main() {
    // 获取单例对象实例
    Singleton* singleton1 = Singleton::getInstance();
    singleton1->showMessage();

    // 尝试获取单例对象的另一个实例,应该返回相同的对象
    Singleton* singleton2 = Singleton::getInstance();
    singleton2->showMessage();

    return 0;
}

2.

#include <iostream>

class Singleton {
private:
    // 私有构造函数,防止外部实例化
    Singleton() {}

public:
    // 静态成员函数,用于获取单例对象实例
    static Singleton& getInstance() {
        static Singleton instance; // 静态局部变量,确保只初始化一次
        return instance;
    }

    void showMessage() {
        std::cout << "Hello, I am a singleton object!" << std::endl;
    }
};

int main() {
    // 获取单例对象实例
    Singleton& singleton1 = Singleton::getInstance();
    singleton1.showMessage();

    // 尝试获取单例对象的另一个实例,应该返回相同的对象
    Singleton& singleton2 = Singleton::getInstance();
    singleton2.showMessage();

    return 0;
}

相关推荐

  1. /*局部变量静态局部变量区别*/

    2024-07-11 21:22:02       59 阅读
  2. C++_静态成员变量介绍

    2024-07-11 21:22:02       47 阅读
  3. 【C++编程】静态 static 成员 & 常 const 函数

    2024-07-11 21:22:02       19 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-11 21:22:02       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-11 21:22:02       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-11 21:22:02       58 阅读
  4. Python语言-面向对象

    2024-07-11 21:22:02       69 阅读

热门阅读

  1. easy-poi实现动态列(标题)、多sheet导出excel

    2024-07-11 21:22:02       23 阅读
  2. null empty

    2024-07-11 21:22:02       18 阅读
  3. C++反射的实现方式

    2024-07-11 21:22:02       21 阅读
  4. Visual Studio Code:深度解析与开发者的新宠

    2024-07-11 21:22:02       24 阅读
  5. 减法原则的定义

    2024-07-11 21:22:02       18 阅读
  6. 实现基于Zookeeper的分布式协调服务

    2024-07-11 21:22:02       22 阅读
  7. ios的info.plist 配置

    2024-07-11 21:22:02       24 阅读
  8. iOS 开发中不常见的专业术语

    2024-07-11 21:22:02       17 阅读
  9. Onnx 1-深度学习-Operators

    2024-07-11 21:22:02       20 阅读
  10. Windows 32 汇编笔记(一):基础知识

    2024-07-11 21:22:02       18 阅读
  11. HarmonyOS学习之ArkTS语法补充学习

    2024-07-11 21:22:02       24 阅读