- 博客(84)
- 资源 (2)
- 收藏
- 关注
原创 QT项目-欢乐斗地主游戏
不同地域游戏规则可能有些许差异,游戏按照如下规则进行实现。此单机版游戏共需要 7 种类型的类,依次为:卡牌类、玩家类、窗口类、游戏控制类、线程类、游戏策略类、音频类。
2024-05-17 08:57:37
1674
原创 QT中基于TCP的网络通信
得到和客户端建立连接之后用于通信的QTcpSocket套接字对象,它是QTcpServer的一个子对象,当QTcpServer对象析构的时候会自动析构这个子对象,当然也可自己手动析构,建议用完之后自己手动析构这个通信的QTcpSocket对象。在使用QTcpSocket进行套接字通信的过程中,如果该类对象发射出readyRead()信号,说明对端发送的数据达到了,之后就可以调用 read 函数接收数据了。timeout:传出参数,如果操作超时timeout为true,没有超时timeout为false。
2024-04-23 16:46:29
1447
1
原创 设计模式之抽象工厂模式
简单工厂模式不能遵守开放-封闭原则,工厂和抽象工厂模式可以简单工厂模式只有一个工厂类,工厂和抽象工厂有多个工厂类工厂模式创建的产品对象相对简单,抽象工厂模式创建的产品对象相对复杂工厂模式创建的对象对应的类不需要提供抽象类【这产品类组件中没有可变因素】抽象工厂模式创建的对象对应的类有抽象的基类【这个产品类组件中有可变因素】
2024-03-06 15:21:11
1324
原创 C++11线程同步之条件变量
条件变量是C++11提供的另外一种用于,它能阻塞一个或多个线程,直到收到另外一个线程发出的通知或者超时时,才会唤醒当前阻塞的线程。条件变量通常用于生产者和消费者模型,大致使用过程如下:拥有条件变量的线程获取互斥量循环检查某个条件,如果条件不满足阻塞当前线程,否则线程继续向下执行产品的数量达到上限,生产者阻塞,否则生产者一直生产。产品的数量为零,消费者阻塞,否则消费者一直消费。条件满足之后,可以调用notify_one()或者notify_all()唤醒一个或者所有被阻塞的线程。
2024-03-05 14:04:55
908
原创 C++11线程同步之互斥锁
进行多线程编程,如果多个线程需要对同一块内存进行操作,比如:同时读、同时写、同时读写对于后两种情况来说,如果不做任何的人为干涉就会出现各种各样的错误数据。这是因为线程在运行的时候需要先得到CPU时间片,时间片用完之后需要放弃已获得的CPU资源,就这样线程频繁地在就绪态和运行态之间切换,更复杂一点还可以在就绪态、运行态、挂起态之间切换,这样就会导致线程的执行顺序并不是有序的,而是随机的混乱的,就如同下图中的这个例子一样,理想很丰满现实却很残酷。
2024-03-04 15:54:53
700
原创 C++11之转移和完美转发
使用这个函数并不能移动任何东西,而是和移动构造函数一样都具有移动语义,将对象的状态或者所有权从一个对象转移到另一个对象,只是转移,没有内存拷贝。如果需要按照参数原来的类型转发到另一个函数,可以使用C++11提供的std::forward()函数,该函数实现的功能称之为。从实现上讲,std::move基本等同于一个类型转换:static_cast<T&&>(lvalue);如果不使用std::move,拷贝的代价很大,性能较低。在C++11添加了右值引用,并且不能使用左值初始化右值引用,
2024-03-01 14:54:17
434
原创 C++11之右值引用
无论声明左值引用还是右值引用都必须立即进行初始化,因为引用类型本身并不拥有所绑定对象的内存,只是该对象的一个别名。通过右值引用的声明,该右值又“重获新生”,其生命周期与右值引用类型变量的生命周期一样,只要该变量还活着,该右值临时量将会一直存活下去。a=b是一种特殊情况,在这个表达式中a, b都是左值,因为变量b是可以被取地址的,不能视为右值。中a1虽然写在了=右边,但是它仍然是一个左值,使用左值初始化一个右值引用类型是不合法的。中getObj()返回的临时对象被称之为将亡值,t是这个将亡值的右值引用。
2024-02-29 16:58:21
328
原创 轻松玩转Git
Git是一个分布式的版本控制软件。软件,类似于QQ、office、dota等安装到电脑上才能使用的工具。版本控制,类似于毕业论文、写文案、视频剪辑等,需要反复修改和保留原历史数据。分布式文件夹拷贝本地版本控制集中式版本控制分布式版本控制查看分支git branch创建分支git branch 分支名称切换分支git checkout 分支名称分支合并(可能产生冲突)git merge 要合并的分支注意:切换分支再合并删除分支git branch -d 分支名称。
2024-02-29 16:10:04
921
原创 设计模式之工厂模式
通过示例代码可以看到,每个工厂类其实都不复杂,在每个子工厂类中也只是重写了父类的工厂方法而已,每个子工厂类生产一种恶魔果实,但是工厂函数的返回值确是恶魔果实类的基类类型,相当于是使用父类指针指向了子类对象,此处也是用到了多态。通过这样的处理,工厂函数也就不再需要参数了。在真实的项目场景中,要生成什么类型的恶魔果实其实是通过客户端的操作界面控制的,它对应的可能是一个按钮或者是一个选择列表,用户做出了选择,程序就可以根据该需求去创建对应的工厂对象,最终将选择的恶魔果实生产出来。多个子类,重写父类的工厂函数。
2024-02-06 10:45:38
908
原创 【为什么多态中父类要提供虚析构函数?】
如果说类与类之间产生了继承关系,并且在子类中重写了父类的虚函数,相当于最终要实现多态,就是用父类指针或引用指向子类的对象,并且通过父类指针调用子类里面重写父类的方法,这个子类对象被保存到父类的指针里面。当析构父类指针时,如果不提供父类的析构函数时,执行delete时,释放的是父类的对象,但是父类对象里面保存的是子类的地址,所以不能够完全析构掉子类对象。会造成内存泄露。
2024-02-06 10:09:14
341
原创 C++11之lambda表达式
一般情况下,不指定lambda表达式的返回值,编译器会根据return语句自动推导返回值的类型,但需要注意的是labmda表达式不能通过列表初始化自动推导出返回值类型。其中capture是捕获列表,params是参数列表,opt是函数选项,ret是返回值类型,body是函数体。f6:正确,使用拷贝的方式捕获了外部变量a,只读,使用引用的方式捕获外部变量b,可读写。x5:错误,捕获this指针,可访问类内部成员,没有捕获到变量x,y,因此不能访问。
2024-02-01 19:19:49
751
原创 设计模式之简单工厂模式
在我们现实生活中,买馒头和自己蒸馒头、去饭店点一份大盘鸡和自己养鸡,杀鸡,做大盘鸡,这是全然不同的两种体验:自己做麻烦,而且有失败的风险,需要自己承担后果。买现成的,可以忽略制作细节,方便快捷并且无风险,得到的肯定是美味的食物。对于后者,就相当于是一个加工厂,通过这个工厂我们就可以得到想要的东西,在程序设计中,这种模式就叫做工厂模式,工厂生成出的产品就是某个类的实例,也就是对象。关于工厂模式一共有三种,分别是:简单工厂模式、工厂模式、抽象工厂模式。在本节中,先介绍简单工厂模式。
2024-01-31 16:05:43
738
原创 设计模式之单例模式
/ 懒汉模式public:// = delete 代表函数禁用, 也可以将其访问权限设置为私有private:在调用getInstance()函数获取单例对象的时候,如果在单线程情况下是没有什么问题的,如果是多个线程,调用这个函数去访问单例对象就有问题了。假设有三个线程同时执行了getInstance()函数,在这个函数内部每个线程都会new出一个实例对象。此时,这个任务队列类的实例对象不是一个而是3个,很显然这与单例模式的定义是相悖的。
2023-10-30 14:55:50
698
原创 【设计模式三原则】
我们在进行程序设计的时候,要尽可能地保证程序的可扩展性、可维护性和可读性,所以需要使用一些设计模式,这些设计模式都遵循了以下三个原则,下面来依次为大家介绍。
2023-10-30 13:24:36
252
原创 【UML类图之C++】
面向对象设计主要就是使用UML的类图,类图用于描述系统中所包含的类以及它们之间的相互关系,帮助人们简化对系统的理解,它是系统分析和设计阶段的重要产物,也是系统编码和测试的重要模型依据。下面基于C++这门语言给大家讲一下UML类图的画法。
2023-10-13 09:39:54
2694
1
原创 项目:高并发内存池
模拟实现出一个自己的高并发内存池,在多线程环境下缓解了锁竞争问题,相比于malloc/free效率提高了25%左右,将内存碎片保持在10%左右。
2022-03-15 19:19:27
4176
48
原创 IP协议与MAC地址详解
目录IP协议基本概念协议头格式网段划分IP地址的数量限制私有IP地址和公网IP地址路由NAT(Network Address Translation,网络地址转换).IP协议基本概念主机: 配有IP地址, 但是不进行路由控制的设备; 路由器: 即配有IP地址, 又能进行路由控制; 节点: 主机和路由器的统称;协议头格式1、4位版本号(version): 指定IP协议的版本, 对于IPv4来说, 就是4。2、4位首部长度(header length): 4个比特位能表示的最大数是15,每个单位
2022-02-19 18:03:30
9248
14
原创 深入理解UDP与TCP
小白也可以深入理解UDP与TCP目录UDP协议UDP协议端格式UDP的特点UDP的缓冲区UDP使用注意事项基于UDP的应用层协议TCP协议TCP协议段格式TCP如何实现报头与有效载荷分离:流量控制是通过什么完成的确认应答(ACK)机制超时重传机制连接管理机制理解TIME_WAIT状态理解 CLOSE_WAIT 状态3次握手如何理解3次握手(为什么TCP要3次握手):为什么一定是3次握手,而不是2次,1次,4次呢?4次挥手滑动窗口流量控制UDP协议UDP协议端格式UDP的特点UDP传输的过程类似于
2022-02-16 19:59:42
2139
18
原创 http与https的加密原理
http与https的不得不说的那些事目录HTTP协议格式HTTP请求HTTP响应HTTP的方法HTTP的状态码cookie和sessioncookiesessionHTTPS的加密保护机制HTTP VS HTTPSHTTPS的对称性加密非对称加密黑客攻击防止黑客入侵防止中间信息被篡改远端服务器身份认证问题总结HTTP协议格式HTTP中常见的请求报头HTTP请求HTTP响应HTTP的方法HTTP的状态码cookie和sessioncookiehttp协议是无状态的
2022-02-13 23:27:14
772
12
原创 由浅入深理解高级IO--select poll epoll
由浅入深理解高级IO–select poll epoll目录五种IO模型阻塞IO二级目录三级目录五种IO模型阻塞IO在内核将数据准备好之前, 系统调用会一直等待. 所有的套接字, 默认都是阻塞方式二级目录三级目录...
2022-02-10 12:56:06
1716
2
原创 网络编程套接字(Socket通信)
网络编程套接字(Socket通信)本节重点:1、认识IP地址, 端口号, 网络字节序等网络编程中的基本概念;2、学习socket api的基本用法;3、能够实现一个简单的udp客户端/服务器;4、能够实现一个简单的tcp客户端/服务器(单连接版本, 多进程版本, 多线程版本);5、理解tcp服务器建立连接, 发送数据, 断开连接的流程目录预备知识IP地址和端口号(port)理解 "端口号" 和 "进程PID"TCP协议与UDP协议网络字节序Socket实现UDP通信socket编程接口预备知
2022-01-18 21:20:58
2732
1
原创 深入理解Linux多线程
深入理解Linux多线程目录Linux线程概念什么是线程二级页表线程的优点线程的缺点线程异常线程用途Linux进程VS线程Linux线程控制POSIX线程库创建线程终止线程等待线程Linux线程概念什么是线程1、在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”2、一切进程至少都有一个执行线程3、线程在进程内部运行,本质是在进程地址空间内运行4、在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更加轻量化5、透过进程虚拟地址空间
2021-12-11 09:20:56
3081
14
原创 深入理解红黑树
红黑树目录红黑树的概念红黑树的性质红黑树的插入操作红黑树的验证红黑树的概念红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。红黑树的性质每个结点不是红色就是黑色根节点是黑色的如果一个节点是红色的,则它的两个孩子结点是黑色的(红色不连续)。对于每个结点,从该结点到其所有后代叶结点的简单路径上,均 包含相同数目的黑色结点(每一条
2021-11-20 19:45:27
271
2
原创 高度平衡二叉搜索树(AVLTree)
高度平衡搜索二叉树(AVLTree)目录AVL树的概念AVL树节点的定义AVL树的插入AVL树的旋转右单旋左单旋左右双旋右左双旋AVL树的概念二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。因此,两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年发明了一种解决上述问题的方法:当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行调整),
2021-11-15 19:55:21
3992
3
原创 奇思妙想 “位运算“
奇思妙想 "位运算"目录不用加减乘除做加法查找输入整数二进制中1的个数不用加减乘除做加法题目链接写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。数据范围:两个数都满足 0≤n≤1000进阶:空间复杂度 O(1),时间复杂度 O(1)class Solution {public: int Add(int num1,int num2) { while( num2 != 0 ){ int sum = num1 ^ num2; //得到相加后不
2021-11-13 00:25:44
656
1
原创 进程信号详解
进程信号目录什么是信号生活角度的信号进程角度的信号查看信号列表信号是由谁发送的,记录在哪里信号的发送方式信号的产生方式核心转储什么是信号生活角度的信号1、你在网上买了很多件商品,再等待不同商品快递的到来。但即便快递没有到来,你也知道快递来临时,你该怎么处理快递。也就是你能“识别快递”2、当快递员到了你楼下,你也收到快递到来的通知,但是你正在打游戏,需5min之后才能去取快递。那么在在这5min之内,你并没有下去去取快递,但是你是知道有快递到来了。也就是取快递的行为并不是一定要立即执行,可以理解成“
2021-11-10 19:57:30
1282
原创 进程间通信原理解答
进程间通信原理解答目录共享内存共享内存的概念共享内存的建立共享内存的实现二级目录三级目录共享内存共享内存的概念共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据。内存共享:要让不同的进程看到同一份空间,这份空间由物理内存通过页表映射到进程地址空间中想要达到内存共享,就要将物理内存通过页表映射到进程地址空间中。映射的本质:修改页表,虚拟地址空间中开辟空间如何映射:要用系统接口
2021-10-31 10:39:55
1168
1
原创 C++之三大特性 “封装”、“继承”、“多态”
C++之三大特性 “封装”、“继承”、“多态”目录封装继承继承的概念及定义基类和派生类对象赋值转换继承中的作用域派生类的默认成员函数继承与友元继承与静态成员复杂的菱形继承及菱形虚拟继承继承的总结和反思多态二级目录三级目录封装继承继承的概念及定义继承的概念继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触
2021-10-25 10:39:45
12974
6
原创 磁盘文件系统-深解析
磁盘文件系统-深解析目录一级目录二级目录三级目录一级目录二级目录三级目录假设已经将500G的磁盘划分了A、B、C、D 4块区域,但是每块区域还是比较大,还需要继续划分小的区域。就像把国家划分了省之后,再对每个省进行划分市,便于管理。...
2021-10-19 11:33:14
763
原创 进程地址空间
进程地址空间目录虚拟地址进程地址空间写实拷贝虚拟地址什么是虚拟地址呢?先不解释,看个神奇的代码这是一个简单的代码,定义一个全局变量 g_val=100;用fork() 创建一个子进程(我们知道fork创建子进程时,完全是拷贝父进程的代码和数据),在子进程里将 g_val的值改变为200,这时在子进程和父进程里同时将g_val的值和地址打印出来,结果是否一样呢?我们发现,父子进程,输出地址是一致的,但是变量内容不一样!能得出如下结论:1、变量内容不一样,所以父子进程输出的变量绝对不是同一个
2021-09-30 20:54:46
334
1
原创 Linux中进程的六种状态
Linxu中进程的六种状态目录R运行状态(running)S睡眠状态(sleeping)D磁盘休眠状态(Disk sleep)T停止状态(stopped)Z僵尸状态(Zombies)僵尸进程是什么为什么要有僵尸进程僵尸进程的危害X死亡状态(dead)为了弄明白正在运行的进程是什么意思,我们需要知道进程的不同状态。一个进程可以有几个状态(在Linux内核里,进程有时候也叫做任务)。R运行状态(running)并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列S睡眠状态(sleep
2021-09-15 23:30:03
20263
8
原创 冯诺依曼体系结构与操作系统(OS)详解
冯诺依曼体系结构与操作系统(OS)详解目录冯诺依曼体系结构图冯诺依曼体系结构详解从硬件上来看两台电脑如何通信操作系统(OS)冯诺依曼体系结构图我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系。截至目前,我们所认识的计算机,都是由一个个的硬件组件组成输入单元:包括键盘, 鼠标,扫描仪, 写板等中央处理器(CPU):含有运算器和控制器等输出单元:显示器,打印机等关于冯诺依曼,必须强调几点:这里的存储器指的是内存不考虑缓存情况,这里的CPU能且只能对内存进行
2021-08-15 17:51:31
1613
2
原创 通过张三与如花悲惨爱情故事,理解“用户“、“shell“、“操作系统“之间的关系
通过张三与如花悲惨爱情故事,理解"用户"、“shell”、"操作系统"之间的关系目录shell命令以及运行原理张三与如花的恩爱情仇人物简介张三通过媒婆对话如花如花拒绝张三张三百般纠缠shell命令以及运行原理Linux严格意义上说的是一个操作系统,我们称之为“核心(kernel)“ ,但我们一般用户,不能直接使用kernel。而是通过kernel的“外壳”程序,也就是所谓的shell,来与kernel沟通。如何理解?为什么不能直接使用kernel?从技术角度,Shell的最简单定义:命令行解释
2021-07-29 20:58:42
322
3
原创 C++中,传值、传地址、传引用究竟有何区别
C++中,传值、传地址、传引用究竟有何区别目录传引用定义传引用与传值的区别传指针(地址)与传引用的区别传引用定义传值与传地址,相信大家都了如指掌了,在这里先介绍一下什么是引用?引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。说白了,引用就是给变量起外号,比如一个人可以有乳名,有学名,有笔名,其实就都是一个人而已。例:林冲,江湖上人称“豹子头"类型& 引用变量名(对象名) = 引用实体;void TestRe
2021-07-24 17:15:13
2555
6
原创 mysql数据库安装资源、步骤及基本操作指令详解
mysql数据库安装及基本操作详解目录mysql安装资源及教程安装资源安装教程mysql基本指令操作详解实例操作mysql安装资源及教程安装资源mysql安装包链接链接:https://pan.baidu.com/s/1xS60aeMCmMMwvxWa3Ymwrw提取码:9fkwNotepad++安装资源链接https://pan.baidu.com/s/1g8S7XI6z_1TUS4opGWQgIA提取码:3lbl 点击超链接就可以下载安装包,如果发现超链接不管用,便复制网址到浏览器即
2021-06-28 16:28:23
501
2
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人