C++基础篇:05 静态成员与单例模式

news/2024/10/28 20:24:27/

1 静态成员

1.1 什么是静态成员

        被static修饰的成员变量、成员函数都称为静态成员

1.2 普通成员的特点

        普通成员变量:每个类对象中都独有一份成员变量,相互之间没有任何关联

        普通成员函数:都隐藏着一个this指针

1.3 静态成员的特点

        静态成员变量:

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

                ② 静态成员变量的生命周期不依赖于任何的对象,为整个程序的生命周期

                ③ 静态成员变量必须通过static声明在类内,在类外单独定义、初始化,在定义时不能加static

                ④ 因为静态成员变量不依赖于任何类对象,因此可以直接通过 类名::静态成员变量名 的方式来访问,不需要创建对象或依赖对象

1.4 静态成员函数

        格式:

                static 返回值 函数名(参数列表){} //声明与定义可以不分开

            ① 没有隐藏的this指针,所以在静态成员函数中无法直接访问普通成员变量、普通成员函数,但是可以直接访问静态成员变量和静态成员函数

            ② 虽然静态成员函数不能直接访问普通成员,但是静态成员函数的作用域依然算是类内的,因此只要让静态成员函数获得类对象的指针或引用,依然有权限间接访问private\protected的普通成员

static void func(Test* t)
{t->普通成员;
}
static void func(Test& t)
{t.普通成员;
}

           ③ 调用方式:

                对象.静态成员函数();

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

                类名::静态成员函数();   //类对象可以不用创建出来,也可以完成调用

   

1.5 静态成员的作用:

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

        ② 静态成员变量适合存储所有类对象共享的公共属性(汇率、利率、税率)

       ③ 静态成员函数可以当做私有的静态成员变量的公开访问接口,这样做一方面可以不需要实例化对象就可调用类内的静态成员;另一方面这样也不会破坏类的封装性;总体上是为了让类拥有管理自己静态成员的能力

2 单例模式

2.1 什么是单例模式

        只能实例化出一个类对象

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

        ① 任务管理器\日志管理器

        ② 网站访问统计计数器

        ③ 线程池、内存池

        ④ 服务器的连接管理器 accept

2.3 实现单例模式的原理

① 禁止在类外实例化对象,把构造函数私有化

② 确保类对象有且只有一份,在类中定义一个静态的类类型对象(对象(饿)、对象指针(懒))

③ 提供一个公开的获取静态类对象的接口,通过公开静态成员函数来实现

2.4 饿汉模式的单例

        在程序运行前就实例化出单例的类对象,无论后期是否用到都会一开始就完成实例化

        优点:不可能被多个线程同时运行创建多个类对象,线程安全的单例模式

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

2.5 懒汉模式的单例

        当程序运行到第一次使用类对象时,才会实例化单例的类对象

        优点:什么时候使用什么时候创建,如果用不到就不会创建,节约资源

        缺点:当多个线程同时第一次获取类对象时,就可能创建出多份,线程不安全的单例


http://www.ppmy.cn/news/68866.html

相关文章

深入探究C++中的仿函数和迭代器——提升你的STL技能

📖作者介绍:22级树莓人(计算机专业),热爱编程<目前在c++阶段>——目标Windows,MySQL,Qt,数据结构与算法,Linux,多线程&…

一分钟图情论文:《公共图书馆法》视域下的馆员知识与能力体系探究

一分钟图情论文:《公共图书馆法》视域下的馆员知识与能力体系探究 在公共服务体系建设过程中,图书馆建设是十分关键地一环,在图书馆建设过程中又以图书馆员队伍的建设首当其冲。在当今复杂的信息环境下,我们该如何培养图书馆员&a…

Mybatis二级缓存详解

目录 二级缓存 MyBatis的缓存机制整体设计以及二级缓存的工作模式 二级缓存的划分 使用二级缓存,必须要具备的条件 一级缓存和二级缓存的使用顺序 二级缓存实现的选择 MyBatis自身提供的二级缓存的实现 二级缓存的作用 二级缓存的作用域 二级缓存应用场景…

NexNosql Client与chatGPT的对话

问:Nexnosql client有哪些优点? 答:nexnosql client 的优点包括: 即开即用,无需部署服务,最大限度降低使用成本。高度集成,Elasticsearch、Redis、MongoDB,非关系型数据库一网打尽…

ROS 下 激光扫描仪 YDLidar-G4 使用

环境配置: ubuntu20.04 LTS ROS noetic 编程工具:vs code,远程通过ssh访问 扫描仪:YDLidar-G4 YDLidar驱动: YDLidar SDK YDLidar ROS 功能包 此环境包含树莓派,以下过程在树莓派3B上测试通过&#xff0c…

canal学习-运行canal-adapter源码并记录解决报错问题(一)

运行canal-adapter 1. 下载canal源码1.1 下载源码并安装好环境1.2 查看目录结构 2.项目运行2.1 项目打包2.2 项目打包可能遇到的问题:1.Failure to find com.alibaba.otter:connector.tcp:jar:jar-with-dependencies:1.1.52.com.alibaba.druid.pool.DruidDataSource…

leetcode 27. 移除元素

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面…

JSP基于网络超市商品销售管理系统的设计与实现(源代码+论文)

随着互联网日益深入我们的生活,网上商品销售的方式也逐渐被人们所接受,因而集成销售管理功能的网上销售系统也显得更加重要而实用。鉴于此,本课题设计了基于网络超市的商品销售管理系统。首先,论文简单介绍了商品销售管理系统的产…