标准C++day5——静态成员和单例模式(饿汉、懒汉)

一、静态成员

    什么是静态成员:

        被static修饰的成员变量和成员函数就叫静态成员

    普通成员的特点:

        成员变量:每个类对象中都有一份属于自己的成员变量,相互之间没有关联、独立的

        成员函数:隐藏着一个this指针,接收调用者的地址用于区分调用者

   

    静态成员的特点:

        静态成员变量:

           1、存储在data或者bss内存段中,一个类中的所有静态成员变量只有唯一一份,被所有类对象共享

            2、一旦成员变量被声明为静态成员变量后,通过sizeof计算类字节数时,就不统计该变量的字节数

            3、静态成员变量必须在类内加static声明,在类外单独定义、初始化,定义时无需加static

            4、静态成员变量的生命周期不再依赖于某个类对象,伴随整个程序生命周期

            5、因为静态成员变量的存在不依赖于任何类对象,所以可以无需实例化类对象,直接访问静态成员变量

                对象名.成员变量/静态成员变量

                对象名->成员变量/静态成员变量

                类名::静态成员变量  (无需实例化对象,但是一般成员变量都是私有的)

        静态成员函数:

            1、没有隐藏的this指针,所以在静态成员函数中无法直接访问普通成员变量、普通成员函数,但是手动传递对象的地址间接访问,毕竟静态成员函数还是属于类的

            2、但是可以直接访问静态成员变量、静态成员函数

            3、调用方式

                对象名.成员函数()/静态成员函数()

                对象名->成员函数()/静态成员函数()

                类名::静态成员函数()    (无需实例化对象)

   

    静态成员的作用:

    1、静态成员相当于多了一层类作用域的全局变量、全局函数

    2、静态成员变量适合存储所有类对象的公共属性,从而节约资源(税率、利率等)

    3、静态成员函数可以当做访问私有的静态成员变量的公开接口,一方面不破坏类的封装性,另一方面可以无需实例化对象也能调用类的静态成员,让类本身具有管理自己成员的能力

二、单例模式

    什么是单例模式:只能实例化一个类对象

    什么场景下使用单例模式:

        进程管理器、日志管理器

        网站访问计数器、应用配置程序

        线程池、服务器的连接管理器

    实现单例模式的原理:

        1、禁止在类外随意实例化对象,把构造函数\拷贝构造私有化

        2、确保类对象只有一份,在类中定义一个静态的类对象成员变量

        3、提供一个获取静态类对象成员变量的公开的接口,设计静态成员函数用于获取那唯一的一个静态类对象

   

    饿汉模式的单例:

        程序运行开始时就立即实例化单例类对象,不管后期是否用得到都会完成实例化

        优点:不可能被多个线程同时运行创建多份(线程安全)

        缺点:如果后期使用不到,就浪费时间、资源

    懒汉模式的单例:

        什么时候使用,什么时候才去实例化单例类对象

        优点:使用时才会创建,节约时间、资源

        缺点:可能会被多个线程同时实例化,有可能会创建出多个单例类对象(线程不安全)

三、运算符函数

    在C++中会把运算符当做函数处理,一个表达式,其实可能调用了很多运算符函数来完成计算,这种特性对内建类型没有用,但是对于自建类型而言,通过设计运算符函数能够进行个性化运算,以此提高代码的可读性、易用性,例如string类

        string str;

        str += "hehe";  strcat(str,"hehe");

        str == str1;    strcmp(str,str1);

    运算符函数的格式:#表示运算符 O表示运算符对象  []代表返回值不确定

        单目运算符:    #O  O#

            成员函数:

            [] O::operator#(void)

            {

            }

            返回值不确定,唯一的参数就是调用者本身

            全局函数:

            [] operator#(O& o)   // o引用取别名

            {

            }

    某种运算符成员函数、全局函数只能同时实现一个,不能一起实现

        双目运算符:   a # b

            注意:左操作数是运算符函数的发起者

            成员函数:

            []  A::operator#(B& b)

            {

            }

            全局函数:

            [] operator#(A& a,B& b)

            {

            }

    设计一个坐标类

    Point

    {

        int x;

        int y;

    }

    Point p1(1,1),p2(2,2);

    p1 + p2;

    p1 - p2;    

       

四、运算类的双目运算符  O是类名

    成员函数:a + b

    const O O::operator+(const O& b)const

    {

        return O(x+b.x,y+b.y);  //创了一个匿名的对象 可以忽略不写 直接返回

    }

    全局函数: a + b

    const O operator+(const O& a,const O& b)

    {

        return Point(a.x+b.x,a.y+b.y);

    }

    友元:

        在实现类的全局运算符函数时,可能会使用到类内的私有成员,此时全局函数是没有访问权限,如果改变私有为公开会破坏类的封装性,如果提供公开的访问函数又非常麻烦,最好的方式是给该全局函数给与独家授权让其能够访问类内私有成员,这种行为称把该全局函数设置为友元函数

        方式:在类内对全局函数声明,并在声明前加 friend

        friend const O operator+(const O& a,const O& b);

Java单例模式包括饿汉式和懒汉式两种实现方式。饿汉式是在类加载阶段就创建实例并持有,而懒汉式则是在需要时才创建实例。 饿汉模式是指在类加载阶段就创建出实例的,因此它的实例化过程相对于普通情况要早很多。这也是为什么叫“饿汉”的原因,就像一个饥饿的人对食物没有抵抗力,一下子就开始吃了一样。 懒汉模式是指在需要时才创建实例。这种方式的优点是节省了资源,只有在需要时才会进行实例化。但是它的缺点是在多线程环境下可能会导致多个线程同时创建实例的问题,需要进行额外的线程安全措施来解决这个问题。 总结来说,饿汉式适合在应用启动时就需要创建实例的情况,因为它的实例化过程早于普通情况。而懒汉式适合在需要时才创建实例的情况,可以节省资源。 需要注意的是,单例模式的使用要根据具体的适应场景来决定,不同的情况下选择不同的实现方式。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Java设计模式之单例模式——饿汉式、懒汉式(初了解)](https://blog.csdn.net/m0_68062837/article/details/127307310)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Java多线程案例之单例模式饿汉懒汉)](https://blog.csdn.net/qq_63218110/article/details/128738155)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值