首页 > 编程语言 >C++单例 singleton的实现

C++单例 singleton的实现

时间:2024-03-10 21:36:28浏览次数:32  
标签:初始化 singleton getInstance 静态 局部变量 C++ 线程 单例

 

在这个单例模式的实现中,使用了静态局部变量来确保只有一个实例。

 

静态局部变量只会在第一次调用函数时初始化,并且在程序的整个生命周期内保持其值不变。

这意味着,无论多少次调用 getInstance() 方法,都只会在第一次调用时创建一个实例,后续的调用会返回同一个实例。

 

具体来说,在 getInstance() 方法中,静态局部变量 instance 在第一次调用时会被初始化,

然后该实例将一直存在于程序的整个生命周期中,直到程序结束。

因此,无论调用 getInstance() 方法多少次,都只会返回同一个实例。

 

#include <iostream>

class Singleton {
public:
    // 获取单例实例的静态方法
    static Singleton& getInstance() {
        // 使用静态局部变量确保线程安全的懒汉式单例模式
        static Singleton instance;
        return instance;
    }

    // 单例类的其他方法和成员
    void showMessage() {
        std::cout << "Hello, I am a singleton instance!" << std::endl;
    }

private:
    // 将构造函数和析构函数设为私有,防止外部创建和删除对象
    Singleton() {}
    ~Singleton() {}
    // 禁止复制和赋值操作,确保只有一个实例
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;
};

int main() {

{ 
    // 获取单例实例
    Singleton& instance1 = Singleton::getInstance();   
    instance1.showMessage();
}

{ 
    // 获取单例实例
    Singleton& instance2 = Singleton::getInstance();   
    instance2.showMessage();

    // 获取单例实例
    Singleton& instance3 = Singleton::getInstance();  
    instance3.showMessage(); 
}

    return 0;
}

 

这个单例模式的实现是线程安全的,因为它使用了静态局部变量。在 C++11 标准及之后的标准中,静态局部变量的初始化是线程安全的。

当第一次调用 getInstance() 方法时,静态局部变量 instance 会被初始化,这个过程是线程安全的。具体来说,C++11标准保证了静态局部变量的初始化是线程安全的,因为编译器会生成线程安全的代码来确保静态局部变量只会被初始化一次,即使在多线程环境下也不会出错。

因此,这个单例模式是线程安全的,可以在多线程环境中安全地使用。

 

标签:初始化,singleton,getInstance,静态,局部变量,C++,线程,单例
From: https://www.cnblogs.com/music-liang/p/18064849

相关文章

  • C++ 面试题 1
    C++面试题1.详细说说C/C++中malloc、free和new、delete的异同点在C和C++中,malloc和free以及new和delete是用于动态内存管理的两组函数/操作符。虽然它们的目的相似,但在使用方式和特性上有一些重要的区别。malloc和freemalloc和free是C语言的标准库函数,用于在堆上分配和释放内......
  • spring 简单的使用 Hikari连接池 和 jdbc连接mysql 的一个简单例子
    pom.xml<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://ma......
  • C++中不同容器下迭代器失效的情况
    C++中不同容器下迭代器失效的情况迭代器失效分三种情况考虑,也是分三种数据结构考虑,分别为数组型,链表型,树型数据结构。数组型数据结构:该数据结构的元素是分配在连续的内存中,insert和erase操作,都会使得删除点和插入点之后的元素挪位置,所以,插入点和删除掉之后的迭代器全部失效,也就......
  • C++左值右值完美转发转移
    左值(Lvalue)与右值(Rvalue)英文含义:左值(Lvalue):Locatorvalue,意味着它指向一个具体的内存位置。右值(Rvalue):Readvalue,指的是可以读取的数据,但不一定指向一个固定的内存位置。定义左值:指的是一个持久的内存地址。左值可以出现在赋值操作的左侧或右侧。例如,变量、数组的元素......
  • [c++] c++ 中的左右值
    c++中的左右值前言:最近又需要再次复习一下关于c++中lvaue和rvalue相关的知识。左值和右值简单看inta=1;这条语句,对于左边的a,我们是可以对其取地址的,而对于右边的1来说,我们无法对其去地址。对于能够取地址的a,位于=左边,我们就将其称之为左值,对于像1这样的......
  • C++ 17新特性
    C++17是C++语言的一个重要版本,引入了许多新特性和改进,以提高开发效率和代码质量。以下是一些常用的C++17新特性:结构化绑定(StructuredBindings):允许以声明式语法将复合类型(如元组、数组、结构体)中的成员绑定到变量上,从而简化代码并提高可读性。#include<tuple>std::tup......
  • C++ Qt开发:QNetworkInterface网络接口组件
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QNetworkInterface组件实现查询详细的网络接口参数。在Qt网络编程中,QNetworkInterface是......
  • C++ Qt开发:QHostInfo主机地址查询组件
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QHostInfo组件实现对主机地址查询功能。在Qt网络编程中,QHostInfo是一个强大而灵活的组件......
  • 【C/C++】四舍五入、向上取整、向下取整
    #include<stdio.h>#include<stdint.h>doublecustom_pow(doublebase,intexponent){doubleresult=1.0;if(exponent>=0){for(inti=0;i<exponent;i++){result*=base;}}else{......
  • C++习题
    打印菱形 #include<iostream>usingnamespacestd;intmain(){cout<<"*"<<endl;cout<<"***"<<endl;cout<<"*"<<endl;return0;} 进制转换#include<iostream>#include<iomanip&g......