C++编程(五)单例模式 友元
文章目录
- 一、单例模式
- (一)概念
- (二)实现方式
- 1. 饿汉式
- 2. 懒汉式
- 二、友元
- (一)概念
- (二)友元函数
- 1.概念
- 2.语法格式
- 3. 使用示例
- 访问静态成员变量
- 访问非静态成员变量
- (三)友元成员函数
- (四)友元类
一、单例模式
(一)概念
设计模式只是一种编程思想,没有固定的代码。
是面临一般问题的解决的方法。
如:单例模式、工厂模式、桥接模式…
单例指的是只有一个实例化对象
(二)实现方式
1. 饿汉式
饿汉式是加载时完成创建,无论用或者不用,单例对象一直存在
步骤:
构造函数私有化
使用私有的静态成员变量维护唯一的单例对象
定义公有的静态成员函数用于获取单例对象
#include <iostream>
using namespace std;
class MyClass
{
public://定义公有的静态成员函数用于获取单例对象static MyClass& getObj(){return m1;}void print(){cout<<"m_a="<<m_a<<endl;}
private://构造函数私有化MyClass(int a):m_a(a){cout<<"私有化构造函数"<<endl;}//使用私有的静态成员变量维护唯一的单例对象static MyClass m1;int m_a;
};
//静态成员变量的定义
MyClass MyClass::m1=100;int main()
{MyClass &m=MyClass::getObj();MyClass &mm=MyClass::getObj();cout<<"&m ="<<&m<<endl;cout<<"&mm="<<&mm<<endl;m.print();mm.print();return 0;
}
输出结果:

2. 懒汉式
懒汉式是用时即创建,不用即销毁
步骤:
构造函数私有化
使用私有的静态成员指针变量维护唯一的单例对象
定义公有的静态成员函数用于获取单例对象(每次调用该函数,都返回唯一的指针)
#include <iostream>
using namespace std;
class MyClass
{
public://定义公有的静态成员函数用于获取单例对象static MyClass* getObj(){if(NULL == m1){m1=new MyClass(100);}return m1;}void print(){cout<<"m_a="<<m_a<<endl;}
private://构造函数私有化MyClass(int a):m_a(a){cout<<"私有化构造函数"<<endl;}//使用私有的静态成员指针变量维护唯一的单例对象static MyClass *m1;int m_a;
};
//静态成员变量的定义
MyClass* MyClass::m1=NULL;int main()
{MyClass *m=MyClass::getObj();MyClass *mm=MyClass::getObj();cout<<"m ="<<m<<endl;cout<<"mm="<<mm<<endl;m->print();mm->print();return 0;
}
输出结果

二、友元
(一)概念
友元是C++中一种特殊的机制
(二)友元函数
1.概念
将一个全局函数作为一个类的友元函数,在类中将此函数用friend修饰,就是友元函数
友元函数打破类的封装性,友元可以访问类中的任何权限的成员
2.语法格式
class 类名{
访问控制权限:friend 返回值 函数名(形参名){}
}
- 注意:
- 友元函数是不受访问控制权限的限制,可以放在类中任意位置,但使用时一般放在开头。
3. 使用示例
访问静态成员变量
#include <iostream>
using namespace std;
class MyClass
{friend void print();
public:static int s_pub;
private:static int s_pri;
protected:static int s_pro;
};//静态成员变量定义
int MyClass::s_pub=100;
int MyClass::s_pri=200;
int MyClass::s_pro=300;//全局函数
void print(){cout<<"s_pub="<<MyClass::s_pub<<" ";cout<<"s_pri="<<MyClass::s_pri<<" ";cout<<"s_pro="<<MyClass::s_pro<<endl;
}int main()
{print();return 0;
}
访问非静态成员变量
#include <iostream>
using namespace std;
class MyClass
{friend void print(MyClass &c);
public:int m_pub;
private:int m_pri;
protected:int m_pro;
};void print(MyClass &c){c.m_pub=10;c.m_pri=20;c.m_pro=30;cout<<"m_pub="<<c.m_pub<<" ";cout<<"m_pri="<<c.m_pri<<" ";cout<<"m_pro="<<c.m_pro<<endl;
}int main()
{MyClass m;print(m);return 0;
}
(三)友元成员函数
将一个类的成员函数作为另一个类的友元函数
(四)友元类
假设有两个类:类A 类B
类B作为类A的友元类,说明类B可以访问类A的公有权限
- 注:
- 友元关系不具有交换性:A是B的朋友,B不一定是A的朋友
- 友元关系不具有传递性
- 友元关系不能被继承
- 友元关系破坏了类的封装性,使访问控制权限失去了意义,因此实际开发时,不要过于依赖友元
相关文章:
C++编程(五)单例模式 友元
文章目录 一、单例模式(一)概念(二)实现方式1. 饿汉式2. 懒汉式 二、友元(一)概念(二)友元函数1.概念2.语法格式3. 使用示例访问静态成员变量访问非静态成员变量 (三&…...
012-GeoGebra基础篇-构造圆的切线
前边文章对于基础内容已经悉数覆盖了,这一篇我就不放具体的细节,若有需要可以复刻一下 目录 一、成品展示二、算式内容三、正确性检查五、文章最后 一、成品展示 二、算式内容 A(0,0) B(3,0) c: Circle(A,B) C(5,4) sSegment(A,C) DMidpoint(s) d: Circ…...
数据结构速成--查找
由于是速成专题,因此内容不会十分全面,只会涵盖考试重点,各学校课程要求不同 ,大家可以按照考纲复习,不全面的内容,可以看一下小编主页数据结构初阶的内容,找到对应专题详细学习一下。 目录 …...
SpringMVC的基本使用
SpringMVC简介 SpringMVC是Spring提供的一套建立在Servlet基础上,基于MVC模式的web解决方案 SpringMVC核心组件 DispatcherServlet:前置控制器,来自客户端的所有请求都经由DispatcherServlet进行处理和分发Handler:处理器&…...
【PYG】Cora数据集分类任务计算损失,cross_entropy为什么不能直接替换成mse_loss
cross_entropy计算误差方式,输入向量z为[1,2,3],预测y为[1],选择数为2,计算出一大坨e的式子为3.405,再用-23.405计算得到1.405MSE计算误差方式,输入z为[1,2,3],预测向量应该是[1,0,0]࿰…...
MyBatis-plus这么好用,不允许还有人不会
你好呀,我是 javapub. 做 Java 的同学都会用到的三件套,Spring、SpringMV、MyBatis。但是由于使用起来配置较多,依赖冲突频发。所有,各路大佬又在这上边做了包装,像我们常用的 SpringBoot、MyBatisPlus。 基于当前要…...
Linux驱动开发实战宝典:设备模型、模块编程、I2C/SPI/USB外设精讲
摘要: 本文将带你走进 Linux 驱动开发的世界,从设备驱动模型、内核模块开发基础开始,逐步深入 I2C、SPI、USB 等常用外设的驱动编写,结合实际案例,助你掌握 Linux 驱动开发技能。 关键词: Linux 驱动,设备驱动模型,内核模块,I2C,SPI,USB 一、Linux 设备驱动模型 Li…...
安全技术和防火墙
1、安全技术 1.1入侵检测系统 特点是不阻断网络访问,主要提供报警和事后监督。不主动介入,默默的看着你(类似于监控) 1.2入侵防御系统 透明模式工作, 数据包,网络监控,服务攻击,…...
Webpack: 开发 PWA、Node、Electron 应用
概述 毋庸置疑,对前端开发者而言,当下正是一个日升月恒的美好时代!在久远的过去,Web 页面的开发技术链条非常原始而粗糙,那时候的 JavaScript 更多用来点缀 Web 页面交互而不是用来构建一个完整的应用。直到 2009年5月…...
python处理txt文件, 如果第一列和第二列的值在连续的行中重复,则只保留一行
处理txt文件, 如果第一列和第二列的值在连续的行中重复,则只保留一个实例,使用Python的内置函数来读取文件,并逐行检查和处理数据。 一个txt文件,里面的数据是893.554382324,-119.955825806,0.0299997832626,-0.133618548512,28.1155740884,112.876833236,46.7922,19.62582…...
C++17中引入了什么新的重要特性
C17是C标准的一个重要版本,它在语言核心和标准库中引入了许多新特性和改进,使得C编程更加现代化和高效。以下是C17中引入的一些重要新特性: 语言核心新特性 结构化绑定(Structured Bindings): 结构化绑定…...
Andrej Karpathy提出未来计算机2.0构想: 完全由神经网络驱动!网友炸锅了
昨天凌晨,知名人工智能专家、OpenAI的联合创始人Andrej Karpathy提出了一个革命性的未来计算机的构想:完全由神经网络驱动的计算机,不再依赖传统的软件代码。 嗯,这是什么意思?全部原生LLM硬件设备的意思吗?…...
用国内镜像安装docker 和 docker-compose (ubuntu)
替代方案,改用国内的镜像站(网易镜像) 1.清除旧版本(可选操作) for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do apt-get remove $pkg; done 2.安装docker apt-get update 首先安装依赖 apt-g…...
Linux多线程【线程互斥】
文章目录 Linux线程互斥进程线程间的互斥相关背景概念互斥量mutex模拟抢票代码 互斥量的接口初始化互斥量销毁互斥量互斥量加锁和解锁改进模拟抢票代码(加锁)小结对锁封装 lockGuard.hpp 互斥量实现原理探究可重入VS线程安全概念常见的线程不安全的情况常…...
os实训课程模拟考试(大题复习)
目录 一、Linux操作系统 (1)第1关:Linux初体验 (2)第2关:Linux常用命令 (3)第3关:Linux 查询命令帮助语句 二、Linux之进程管理—(重点) &…...
QT/QML国际化:中英文界面切换显示(cmake方式使用)
目录 前言 实现步骤 1. 准备翻译文件 2. 翻译字符串 3.设置应用程序语言 cmake 构建方式 示例代码 总结 1. 使用 file(GLOB ...) 2. 引入其他资源文件 再次生成翻译文件 5. 手动更新和生成.qm文件 其他资源 前言 在当今全球化的软件开发环境中,应用程…...
设计模式在Java项目中的实际应用
设计模式在Java项目中的实际应用 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 引言 设计模式是软件开发中重要的思想工具,它提供了解决特定问题…...
js制作随机四位数验证码图片
<div class"lable lable2"><div class"l"><span>*</span>验证码</div><div class"r"><input type"number" name"vercode" placeholder"请输入验证码"></div>&l…...
[开源软件] 支持链接汇总
“Common rules: 1- If the repo is on github, the support/bug link is also on the github with issues”" label; 2- Could ask questions by email list;" 3rd party software support link Note gcc https://gcc.gnu.org openssh https://bugzilla.mindrot.o…...
从零开始搭建spring boot多模块项目
一、搭建父级模块 1、打开idea,选择file–new–project 2、选择Spring Initializr,选择相关java版本,点击“Next” 3、填写父级模块信息 选择/填写group、artifact、type、language、packaging(后面需要修改)、java version(后面需要修改成和第2步中版本一致)。点击“…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
