C++学习笔记(十)

文章目录

前言

一、单例设计模式

[1.1 单例设计模式的定义](#1.1 单例设计模式的定义)

[1.2 单例设计模式的思想](#1.2 单例设计模式的思想)

[1.3 单例设计模式的两种类型](#1.3 单例设计模式的两种类型)

[1.3.1 饿汉式](#1.3.1 饿汉式)

[1.3.2 懒汉式](#1.3.2 懒汉式)

总结


前言

随着技术的革新,出现各种各样的编程语言,C++就是其中之一,作为最受欢迎的编程语言之一,C++带给开发者们最大的惊喜便是其强大的特性。一方面跟C兼容,可以直面系统底层API,SDK,另一方面提供了很多范式,足够的抽象能力,面向对象,操作符重载,模板等。本章将接着之前的学习笔记继续向下整理知识点,本篇的主要内容为C++的常用设计模式中的单例设计模式


提示:以下是本篇文章正文内容,下面案例可供参考

一、单例设计模式

C++有着23种设计模式,包括工厂方式模式、抽象工厂模式、单例设计模式、建造这模式、观察者模式等。

1.1 单例设计模式的定义

一个类型在定义对象的时候有且只有一个对象叫做单例

1.2 单例设计模式的思想

① 不可以从外部调用类的构造函数,必须把构造函数私有化

② 使用公有权限下定义的函数 但是如果定义的函数是普通类型的函数,则需要以来对象才可以调用,这样就和单例的定义产生冲突,所以必须,把这个函数升级为静态函数。

③ 当函数升级成为静态函数,函数就没有this指针,无法调取类中属性,素以需要把类中该属性升级为静态属性。

④ 把类中的本类的指针,升级为静态属性。并在类外完成初始化,初始化则给定一个唯一的实例.

1.3 单例设计模式的两种类型

1.3.1 饿汉式
cpp 复制代码
class A
{
private:
    //4.类单例类型的类中提供一静态指针:
    static A* my_Instance;
    //1.把构造函数私有化:
    A()
    {
        cout << "A构造" << endl;
    }
public:
    //2.使用一个公有接口函数返回一个实例:
    //3.把这个公有接口函数升级static静态成员方法:
    static A* get_Instance()
    {                                
        //在公有接口返回。
        return my_Instance;
    }
};
A* A::my_Instance = new A();

注意:饿汉式中有一种缺点,那就是当定义的单例过多的时候,采用饿汉式这种写法会导致开辟了很多个空间用来保存初始化的数据,最直观的感受就是会导致,程序跑起来的速度变慢。

1.3.2 懒汉式
cpp 复制代码
mutex suo;
class A
{
    //4.在单例类型的类中定义静态指针
    static A* my_Instance;
private:
    //1.把构造函数私有化:
    A()
    {
        cout << "A构造" << endl;
    }
public:
    //2.使用一个公有接口函数返回实例
    //3.把这个公有接口函数升级成为static修饰的静态成员方法:
    static A* get_Instance()
    {                               
        if(my_Instance == nullptr)
        {
            //锁+双条件判断:轻量级锁:
            lock_guard<mutex> lock(suo);  
            if(my_Instance == nullptr)
            {
                my_Instance = new A();
            }
        }
        return my_Instance;
    }
    //懒汉式析构:
    ~A()
    {
        cout << "A析构" << endl;
    }
    //懒汉式单例释放空间要单独写一个函数
    static void destory()
    {
        delete my_Instance;
    }
};

注意:当采用懒汉式的这种写法时,只是比饿汉式多了一个判断条件,用来判断实例是否为空。当实例不为为空,调用构造时,并且返回值还没传回时,会存在着另几个线程到达的情况,此时就会出现问题,所以在上述代码中引入了锁的概念,使得在判断为真后,执行代码的期间内,让其他的线程在此等候,避免出现问题。

注意:当使用单例设计模式的时候,为了使单例设计模式更加安全可靠,C++11提供的新功能:把默认拷贝构造与=运算符重删除,此条通常放在私有权限下。

cpp 复制代码
//C++11提供的新功能:把默认拷贝构造与=运算符重删除。
    Singleton(const Singleton& other) = delete;
    void operator=(const Singleton& other) = delete ;

总结

以上就是今天要讲的内容,本文仅仅简单介绍了单例设计模式的设计方法和两种设计格式,并分别举了饿汉式和懒汉式的代码写法。希望对大家有所帮助,当然如果本文中有写的不对的地方,或者有更好的理解方式,欢迎私信与我或在评论区中指出,谢谢。

相关推荐
吾当每日三饮五升2 小时前
C++单例模式跨DLL调用问题梳理
开发语言·c++·单例模式
猫武士水星3 小时前
C++ scanf
开发语言·c++
BinaryBardC3 小时前
Bash语言的数据类型
开发语言·后端·golang
Lang_xi_3 小时前
Bash Shell的操作环境
linux·开发语言·bash
Pandaconda3 小时前
【Golang 面试题】每日 3 题(二十一)
开发语言·笔记·后端·面试·职场和发展·golang·go
捕鲸叉4 小时前
QT自定义工具条渐变背景颜色一例
开发语言·前端·c++·qt
想要入门的程序猿4 小时前
Qt菜单栏、工具栏、状态栏(右键)
开发语言·数据库·qt
Zhichao_974 小时前
【UE5 C++课程系列笔记】21——弱指针的简单使用
笔记·ue5
Rossy Yan4 小时前
【C++面向对象——群体类和群体数据的组织】实现含排序功能的数组类(头歌实践教学平台习题)【合集】
c++·排序算法·面向对象·封装·查找
Elena_Lucky_baby4 小时前
在Vue3项目中使用svg-sprite-loader
开发语言·前端·javascript