- 博客(108)
- 收藏
- 关注
原创 jpg格式以及libjpeg库、了解http协议、http协议传输html网页、html协议传输图片、视频流传输
本项⽬中按照简化编程的原则,只对 http 协议的⾸⾏数据进⾏了解析,⽽且⽹⻚客户端发送的 http 请求数据包均使⽤ GET ⽅法,服务器只需要把客户端请求的数据打包发送给服务器就可以了。在上图的框架中,每增加⼀个浏览器 socket 连接就开辟了⼀个线程来处理相应的接收数据,其处理思路就是不断地接收 http 数据包,进⾏分析后,将客户端请求地数据打包成应答包格式发送给客户端。Request-URL 所标识的资源后附加新的数据 HRAD 请求获取由 Request-URL 所标识的资源的响应消息报头。
2025-08-18 12:23:37
728
原创 Ubuntu系统下摄像头的使用,v4l2接口访问摄像头属性、获取一张yuv图片,yuv格式详解、数据转rgb
步骤 1:在虚拟机下使⽤主机的摄像头时,需要将其连接到虚拟机下,步骤是: ⼯具栏–> 虚拟机–>可移动设备–> ⾃⼰电脑的摄像头(例如 Acer Camera)–> 连接 步骤 2:在 Ubuntu 终端下,切换到 root ⽤户,输⼊ cheese,稍等⽚刻后弹出摄像头拍照窗⼝;函数 mmap() 的功能是:把⽂件映射到进程的虚拟内存空间。:能⼒集可以快速判断⽬前的相机设备是否⽀持后续操控,⽐如有的相机只有拍照没有视频功能,有的相机能拍照的同时记录⾳频等等,所以检查相机能⼒是必要的。
2025-08-18 12:09:35
951
原创 文件传输模块设计
为防⽌ tcp 底层粘包, 在传输⽂件之前先接收协议头信息,在根据协议中的⽂件⼤⼩与⽂件名,在服务器的测试程序中,使⽤多线程的并发服务器,当客户端与服务器建⽴连接后, 会创建⼦线。1. 编写服务器与客户端测试程序,然后在进⾏测试。接收⽂件头,获取⽂件⼤⼩与⽂件名。接收数据, 并将数据写⼊到⽂件中。程来进⾏接收客户端上传的⽂件。将接收的数据写⼊到⽂件中。2. 实现⽂件下载功能。协议设计与接收协议头。协议设计与接收协议头。
2025-08-17 19:57:00
270
原创 udp协议、tcp协议与wireshark抓包分析
ip.addr == 10.226.42.58 && tcp.port == 8888 显示 源 ip 或者⽬的 ip 为 10.226.42.58。ip.addr == 10.226.42.58 || tcp.port == 8888 显示 源 ip 或者⽬的 ip 为 10.226.42.58。udp.port == 8888 显示 udp 源端⼝号或者⽬的端⼝号为 8888 的数据包。tcp.port == 8888 显示 tcp 源端⼝号或者⽬的端⼝号为 8888 的数据包。
2025-08-17 19:56:20
642
原创 文件上传工具基础框架设计与tcp socket封装
现在主流的⽂件上传⼯具⼀般基于 FTP 协议实现,这⾥的上传⼯具主要⽤于强化 tcp socket。上述函数主要对 tcp 服务器的套接字创建,绑定 ip 地址与端⼝号,建⽴监听队列进⾏了封装。⽂件上传⼯具⽤于将⽂件上传到服务器的⼯具, 主要包括客户端程序与服务器程序。step 1 : 创建 tcpsocket.h 与 tcpsocket.c。tcp socket 模块 : 主要封装了 tcp socket 的操作。实现 tcp 客户端 socket 创建与等待连接接⼝设计。⽂件上传⼯具基础框架设计与。
2025-08-17 19:34:25
166
原创 tcp粘包原因分析、解决方案、tcp并发服务器(多进程、多线程)
tcp 粘包 : 使⽤ tcp 协议进⾏数据传输时,** 发送⽅发送的若⼲个数据包到接收⽅接收时粘成。⽅式⼆ : 使⽤数据⻓度 + 数据的⽅式,先接收数据⻓度,再根据⻓度接收数据, 这⾥。step 1 : 发送时,分两次发送,第⼀次发送数据⻓度,第⼆次发送数据。step 2 : 接收时,分两次接收,第⼀次接收数据⻓度,第⼆次接收数据。发送⽅⼀次性发送的数据⼤于 MTU,则会发⽣拆包,将字节流进⾏切⽚分成。当发送⽅的速度⼤于接收⽅的速度时, 在缓冲区中缓存了多个数据包,⼀次性。
2025-08-17 17:08:06
752
原创 tcp客户端实现流程与服务器连接、发送与接收数据、创建套接字、绑定ip地址、tcp服务器实现流程
step 2 : 填写 IP 地址, 要让虚拟机的 ip 地址与 windows ip 地址保持在同⼀个局域⽹类。listen : 建⽴监听队列,并设置套接字的状态为 listen 状态, 表示可以接收连接请求。设计⼀个服务器程序,并和客户端建⽴连接,并打印客户端的 ip 地址和端⼝号。,在实现 tcp 客户端时,则需要先连接服务器,后⾯才能进⾏通讯,socket() : 创建套接字, 使⽤的套接字类型为流式套接字。addr : 连接的套接字的地址结构对象的地址 (⼀般为服务器)
2025-08-17 16:38:26
584
原创 局域网聊天室之整体功能
4. 如果发送的 "quit" 消息,则更新 msg.type = CLIENT_QUIT;msg.type = SERVER_QUIT. // 所有客户端结束,链表清空。4. 填充服务端的 ip 和 port,消息类型,及需要发送的字符。1. 创建⼦线程来发送消息给其他的客户端,传递 parm 参数。1. 主线程,while(1) 循环来接收所有的数据。5. 把消息发送给服务端,然后循环结束。2. 创建⼦线程,⽤于接收服务端发送过来的消息。3. 发送登录消息给服务端,只发送⼀次。
2025-08-17 16:19:14
852
原创 局域网聊天室项目概述、群发服务器设置
局域网聊天室整体代码量较多。客户端和服务器相关代码都比较多。服务端:实现一个服务器群发的功能,服务端设计一个链表,用来存储用户信息,当链表中。创建多线程,把客户端的收发分开。局域网群发服务器的功能,后期在对代码的架构进行扩展。某个用户发送数据的时候,链表中其他用户也可以收到。客户端:发送数据和接收数据应该是异步的。所有登录的用户,需要先发送一个消息,用于接收。协议实现的简单的具有即时信息传输功能的软件。由于此代码为项目的中间架构,此架构目前存在。地址和端口,之后才能收到数据。局域网聊天室之群发服务器设置。
2025-08-17 16:07:21
326
原创 并发服务器之多进程并发
解决的⽅法是服务器(知名端⼝)等待⼀下客户的到来,当⼀个客户到来后,记下其 IP 和 port,然后同理,服务器 fork ⼀个⼦进程,建⽴⼀个 socket 再 bind ⼀个随机端⼝,然后建⽴与客户的连接,并处理该客户的请求。问题在于每个客户都是往服务器端的同⼀个的端⼝发送数据,并⽤的同⼀个 sockfd。并发服务器的每⼀个⼦进程如何正确区分每⼀个客户的数据报(涉及到进程的调度问题,如何避免⼀个⼦进程读取到不该它服务的客户发送来的数据报)。并发服务器是指在同⼀个时刻可以响应多个客户端的请求。
2025-08-17 15:52:22
377
原创 udp通信创建流程、服务器相关api函数
⼤家⾃⼰写⼀个 UDP 发送⽅的代码,按照下列框图要求编写代码,新建⼀个 log.txt 的⽂件,在⽂件中写⼊数据,⽤户读取 log.txt ⽂件的内容,通过 sendto() 发送给⽹络调试助⼿,并通过⽹络测试助⼿接收数据,判断读取的内容是否正确。在函数 socket,recvform,sendto,bind 中选取⼀个⾃⼰熟悉的函数,按照⾃⼰的理解,把英⽂函数接⼝说明翻译为中⽂,并上传。要求读取 log.txt ⽂件的内容,并把⽂件名, ⽂件内容和⽂件内容⼤⼩分别填充到上述结构体中。
2025-08-17 10:33:24
912
原创 消息发布功能实现
服务器接收到消息后, 会进⾏分发处理,最终会通过发布消息函数来进⾏处理,具体接收设计如。step 2 : 将订阅进程的 pid 作为消息类型,在封装消息内容,写⼊到消息队列。当客户端发布消息之后,服务器需要将这个消息转发给订阅这个主题的所有进程。step 1 : 将 msg.h msg.c 拷⻉服务器的⼯程⽬录中。step 1 : 在 server.h 中添加发布消息的处理函数。step 1 : 在 client.h 中添加消息发布接⼝。step 2 : 在 server.c 中添加发布消息接⼝。
2025-08-17 10:08:47
849
原创 消息订阅功能实现
step 2 : 将任务函数添加到线程池中,然后由线程池中的线程来执⾏, 在 runloop 添加相应的代码即可。在任务函数中,服务器根据当前模式进⾏分发, 分为订阅消息处理函数与发布消息处理函数, 这。当服务器接收到数据后,需要将数据以任务函数形式添加线程池中, 并在任务函数中实现相应的。服务器数据接收接⼝主要⽤于接收客户端数据后,将任务分配给线程处理,这⾥主要实现数据。这⾥的数据域是根据项⽬进⾏了定制,主要是保存主题与订阅进程的 id。step 1 : 在 server.h 中添加订阅处理函数的声明。
2025-08-17 09:58:49
680
原创 线程池执行函数、销毁、测试,项目模块整合与数据结构设计
server : 服务器⽬录 (msg 模块与 hashmap 模块在后⾯实现), 需要添加 server.h 与server.c。client : 客户端⽬录 (msg 模块在后⾯实现), 需要添加 client.h 与 client.c。修改 shm.c 创建共享内存的⽂件名为 shm 临时⽂件, 客户端与服务器的 shm 模块要同步。step 3 : 判断是否销毁,如果是销毁,则释放线程互斥锁,并让线程退出。创建两个⽬录,客户端与服务器, 并将相应的模块到对应的⽬录中。编写 Makefile。
2025-08-17 09:48:52
339
原创 线程池原理与框架设计、线程池的数据结构设计、线程池初始化、线程池添加任务
step 2 : 判断任务队列是否已满,如果满了则阻塞在 tp_cond_full 条件变量上。可以创建多个线程,在有任务的时候,则 可以执行任务,在没有任务时,则进入睡眠状态。在处理请求的过程中,需要创建线程与销毁线程,会导致资源的消耗,如何解决。使用多线程并发,将请求的处理分配给线程来完成,处理完成后则退出。线程池在初始化时会创建多个线程,在没有任务时,会进入睡眠状态。这里用户线程与线程池中的线程是生产者与消费者模型。是⽤于在任务队列为满时,阻塞添加任务的线程。step 5 : 初始化任务队列的容量。
2025-08-17 09:32:03
572
原创 项目框架介绍,环形队列设计
如果是发布, 则需要根据主题在 hashmap 中查询到订阅进程的 id,从发布消息进程获。消息发布者 (商家) 在公众号上发布相应的内容,并不关注具体的消息接收者 (消费者)消息发布者负责发布消息,是基于消息主题 (类别) 将发布的内容传输到消息服务器。消息的发布者与消息订阅者解耦,即消息发布者不⽤关⼼订阅者,订阅者也不⽤关⼼。消息订阅者负责接收消息,是基于消息主题 (类别)从消息服务器接收消息。是所有的关注公众号的消息接受者 (消费者) 都可以在公众号中看到消息。
2025-08-17 09:23:11
771
原创 io-poll底层原理分析,io-epoll基本原理与应用、控制与等待、原理分析
应⽤层调⽤ poll 函数,在内核会调⽤ sys_poll, sys_poll 函数定义在内核源码的 fs/select.c ⽂。在 ep_ptable_queue_proc 中 将 ep_poll_callback 回调函数添加到等待队列,驱动最后会关联。在上⾯的函数实现中,在没有⽂件描述符就绪时,会让进程睡眠, 等待 ep_poll_callback 来进。当内存分配好之后,就会将在⽤户空间的传递到内核的 struct pollfd 数组拷⻉到内核的空间中。
2025-08-09 19:45:10
836
原创 io-select、io-poll基本原理与应用
一、进程处理多路请求在没有多路复用IO之前,对于多路IO请求,一般只有阻塞与非阻塞IO两种方式阻塞IO需要结合多进程与多线程每个进程线程处理一路IO缺点客户端越多,需要创建的进程线程越多,相对占用内存资源较多非阻塞IO单进程可以处理,但是需要不断检测客户端是否发出IO请求,需要不断占用cpu,消耗cpu资源二、多路复用简介本质上就是通过复用一个进程来处理多个请求,基本思想如下由内核来监控多个文件描述符是否可以进行I/O操作。
2025-08-09 19:22:54
634
原创 ls命令设计与实现(三、四、五、六)
设计接⼝ get_file_gname 并保存到 struct file_attribute 结构体中。获取⽂件权限与获取⽂件类型的思路⼀致,需要解析 stat 的 st_mode 成员,不同的是解析。具体可以在 show_file_attribute 函数中进⾏打印即可。在 show_file_attribute 函数中进⾏打印。在 get_file_attribute 函数中进⾏调⽤。get_file_last_modify_time 函数。在 get_file_attr 函数中要进⾏分开处理。
2025-08-09 17:43:13
833
原创 cp命令设计与实现(三、四)、ls命令设计与实现(一、二)
获取⽂件类型 是通过解析 struct stat 结构体中的 st_mode 的第 [15:12] bit 来判断。⽂件复制直接采⽤ 标准 io ⼆进制读写函数接⼝,这样可以兼容 ⽂本⽂件与⼆进制⽂件。对于链接⽂件本身需要通过 lstat 函数来获取,否则获取的链接⽂件所指向的⽂件。get_file_type_ls , 将获取的⽂件属性信息保存到结构体相应的成员。如果是第⼆种情形, 源⽂件是⽬录时,则需要复制⽬录中所有的⽂件以及⼦⽬录的内容。step 1 : 遍历⽬录, 并获取⽬录下的⽂件名。
2025-08-09 17:29:02
923
原创 项目框架设计与实现、命令处理框架设计、cp命令设计与实现(一、二)
step 3 : 在主逻辑函数 cmd_cp_execute 中进⾏调⽤ cmd_cp_parse_type。%.o : ⽤于匹配任意 .o ⽂件, 如 cmd_handle.o ,cmd_ls.o ,…%.c : ⽤于匹配任意 .c ⽂件, 如 cmd_handle.c ,cmd_ls.c ,…step 2 : 调⽤ cmd_handle 的 cmd_execute 接⼝执⾏相应的命令。根据⽂件类型进⾏判断,如果是普通⽂件,则直接进⾏复制, 如果是⽬录,则递归复制。
2025-08-09 17:15:07
736
原创 二进制读写与文件定位、静态库和动态库的原理与制作
gcc -I <头⽂件路径> -L < 库的路径 > -l < 动态库的名字 > < 源⽂件 >-o < 可执⾏⽂件名 >gcc -I <头⽂件路径> -L < 库的路径 > -l < 静态库的名字 > -o < 可执⾏⽂件名 >当编译器链接动态库的时候,会在可执⾏⽂件的头信息中记录库的名字,便于在操作系统执⾏。动态库默认加载动态库的路径与链接动态库的默认路径是相同的,都是 /lib 与。当编译器链接静态库的时候,如果在可执⾏⽂件中有调⽤静态库的函数接⼝,则会将。
2025-08-08 20:07:03
490
原创 fopen/fclose、fgetc/fputc、fgets/fputs、格式化输入输出与时间获取
示例 : 以读写⽅式打开⽂件 test.txt,如果该⽂件不存在,则创建. 如果该⽂件已经存在,则⻓度截短为 0.练习: 以读写⽅式打开⽂件 test.txt,如果该⽂件不存在,则报错, 使⽤ r+ 即可.w + 或 w+b 或 wb+ : 打开可读写⽂件,若⽂件存在则⽂件⻓度清为零,即会擦些⽂。w 或 wb : 打开只写⽂件,若⽂件存在则⽂件⻓度清为 0, 即会擦些⽂件以前内容。若⽂件不存在,则会建⽴该⽂件, 如果⽂件存。获取当前时间并转换本地时间,以 %d-%d-%d %d::%d::%d 进⾏打印。
2025-08-08 19:58:14
819
原创 linux io框架、文件io接口、read/write、标准io简介
主要包括 open()/close()/read()/write() /lseek() 相应的系统调⽤ (准确说法是对系统调⽤。应⽤程序通过调⽤ 操作系统提供的 io 接⼝ (函数) 向内核进⾏ io 请求 , 由内核最终完整相应的。系统调⽤是 Linux 内核给⽤户提供的访问接⼝, 但在 glibc 中封装了系统调⽤接⼝⽽形。⽤户层与内核层是相辅相成,⽤户层的应⽤程序依赖于库或者内核, 库与内核给应⽤层提供服务。FILE 指针:每个被使⽤的⽂件都在内存中开辟⼀个区域,⽤来存放⽂件的有关信息,这些信息。
2025-08-08 19:47:13
764
原创 Makefile多文件管理
Makefile 主要是对⼤型多⽂件⼯程进⾏管理,前⼏个章节,我们跟⼤家简单的介绍了⼀下 Makefile 的基本语法。上⼀章节,我们通过 Makefile 对⼯程进⾏了管理,但是我们发现在实际代码⼯程中,并没有这样编写。其操作⽅式为取 target-pattern 中去掉. o 后的⽂件名,并加上. c 形成新的集合。我们编写的属于乞丐版的代码。⼤家把之前编写的俄罗斯⽅块的项⽬通过 Makefile 来进⾏⼯程管理。⾸先把⾃⼰的代码按照下列架构分别放到对应的⽂件夹下,并创建空的 Makefile ⽂件。
2025-08-08 19:23:23
563
原创 shell数组、函数,Makefile工程概述、变量、伪目标和函数、库
Makefile 主要使⽤在没有集成开发环境时,对⼯程⽂件进⾏⾃动化编译的⼯具。Makefile 的本质是⼀个⽂件,需要配合 make 命令进⾏⾃动化编译。⽂件名常⾸字⺟⼤写.Makefile ⽂件的命名:makefile 或者 Makefile。(推荐⾸字⺟⼤写的⽤法)make 是⼀个命令⼯具,⽤来解释 makefile ⽂件中的代码,从⽽实现⾃动化编译。编译使⽤的编译器本质上还是 gcc。Makefile ⽂件中定义了⼀系列的规则来指定, 哪些⽂件需要先编译, 哪些⽂件需要后编。
2025-08-08 17:57:13
655
原创 shell中的if、case、循环语句
1. 从键盘输⼊⼀个⽬录,测试 / home/linux 下该⽬录是否存在,如果这个⽬录存在,则提示⽤户。写⼀个 shell 脚本,要求⽤户从键盘输⼊年,⽉,⽇,输出的时候格式为 XX-XX-XX。1. 要求⽤户从命令⾏运⾏该脚本,通过 $# 判断命令⾏传递的参数的个数【参数个数不包含运⾏。写⼀个 shell 脚本,要求从键盘输⼊ 2 个数,输出这两个数的 +,-,*,/,%特点:变量没有类型,不需要定义,直接使⽤,所有的内容被解释为字符串。使⽤同⼀特定的描述性语⾔,依据⼀定的格式编写的可执⾏⽂件。
2025-08-08 17:38:17
770
原创 linux系统简介、sed命令详解、awk命令
系统简介系统简介1.Linux 系统简介需要从⻉尔实验室的 UNIX 说起1969 年,AT&T 公司的⻉尔实验室与 MIT 合作开发的 Unix,旨在于创建⼀个⽤于⼤型、并⾏、多⽤户的操作系统。Unix 的推⼴:从学校⾛进企业Unix 的版本主要两个:AT&T System V ——就是俗称的 “系统 5”Linux 是⼀种操作系统。1991 年,芬兰赫尔⾟基⼤学的学⽣ Linus Torvals 为了能在家⾥的 PC 机上使⽤与学校⼀样的操作系统,开始编写了类 UNIX.
2025-08-08 17:13:03
638
原创 枚举、位域、变量的存储空间、static使用、堆区内存管理
语⾔中的枚举类型语⾔中的枚举类型枚举:⼀种事物代表的多种可能的值,我们把这些值全部列出来使⽤,就是枚举。注意:(1)枚举中元素都是常量(2)枚举元素没有赋值,第⼀个元素默认为0,后⾯元素⼀次+1(3)枚举是⼀种类型,可以定义变量C标准规定:枚举类型的变量只能赋值为枚举元素的值⼤部分编译器,对枚举类型做了扩充,允许给枚举类型变量赋值为任意的整型值例如:设计⼀个枚举类型,枚举颜⾊输出每种颜⾊代表的值语⾔中的位域。
2025-08-08 16:51:52
813
原创 条件编译、extern关键字、结构体、typedef关键字、联合体(union)
我们在现实⽣活中,在对具体的对象进⾏描述的时候,发现对象是⽐较复杂的。⼀般是由不同的类型组合在⼀起的。例如:我们描述⼀个⼈的时候,习惯性会描述他的姓名,年龄,分数等。上述代码,程序从 main.c 开始运⾏,第⼀次运⾏运⾏到 head1.h 中,int z = 30 定义了⼀次,第⼆次运⾏到 head2.h , ⽽ head2.h 中⼜运⾏了⼀次 head1.h,⼜运⾏ int z = 30 了 2 次,从⽽编译器会提示重复定义。共⽤体的多个成员共⽤同⼀块内存空间,分配的空间最⼤成员所占⽤的内存。
2025-08-08 16:28:06
904
原创 字符串相关操作函数2、指针函数、函数指针、递归函数、实战演练、宏定义的使用
标准中规定允许⽤户定义有省略号的宏,省略号必须放在参数列表的后⾯,以表示可选参数。(也就是说,指针函数其实和普通的函数⼀样的,只不过返回值是⼀个指针类型。如果你把函数的地址作为参数传递给另⼀个函数,在另⼀个函数中通过指针来接收。概念:在函数体内,⾃⼰调⽤不断的调⽤⾃⼰,直到某个条件满⾜才结束调⽤。函数,⾃⼰定义参数和返回值,要求统计上述数组中⼤写字符的个数。⾃定义参数和返回值,统计输⼊的正数的个数和正数之和。通过指针来调⽤其函数,我们就说这是回调函数。回调函数就是⼀个通过函数指针调⽤的函数。
2025-08-08 15:58:43
978
原创 const关键字、函数初识、全局变量、局部变量、静态变量、函数传参(值传递、地址传递、数组)字符串相关操作函数1
编程,这⾥所说的模块就是函数,即把每⼀个独⽴的功能均抽象为⼀个函数来实现。通过 const 操作的变量,其值不能通过赋值或者递增,递减来修改,所以要⼀开始初始化变量;函数是⼀系列 C 语⾔语句的集合, 为了完成某个可能会重复使⽤的功能,⽽封装起来的代码。:我们在使⽤函数传参的时候,除了传递普通的变量外,在某些时刻不得不传递变量的地址。传递变量的地址,我们在使⽤的时候,就只能通过指针来接收了。在接收的位置,就定义什么样类型的变量来接受。:传递变量的地址,通过指针接收,可⽤通过指针修改原变量的值。
2025-08-08 15:40:08
779
原创 4.5 Nginx
说 明 把 这 个 名 为ngx_http_example_filter_module的过滤模块加入 ,ngx_http_example_filter_module.c 是该模块的源代码。调用,对于整个请求的处理阶段来说,他们处于的用处都是一样的,就是把响应内容过滤,然后发给客户端。的时候,就可以看到返回的结果。响应头过滤函数先于响应体过滤函数,而且只调用一次,所以一般可作过滤模块的初始化工作。以上的这些组件都可以按照自己的需求从nginx源码拆出来用(主要是3,4,5,6,7,8,9)。
2025-08-05 18:24:16
1042
原创 一级指针和一维数组、指针数组、指针和二维数组、数组指针保存二维数组
指针数组: 它本质是⼀个数组, 只不过该数组由多个指针来构成,所以,我们叫做指针数组。p是⼀个指针变量,它保存了⼆维数组的⾸地址,它是⼀个变量,可以修改。a是⼀个数组名,它标识数组的⾸地址,它是⼀个符号常量,不能修改。int a[3][2], 想要或的数组中 a[1][1] 值的⽅法有哪些?每个指针中存放的都是地址值. 定义⼀个指针数组等价于定义了多个指针变量。⼆级指针变量是⽤来保存⼀级指针变量本身⾃⼰的地址.个 指针类型变量组成的数组,我们叫做指针数组。所有的指针都是⽤来保存地址的。
2025-08-04 10:56:36
488
原创 continue,goto语句、指针基础、特殊指针、一级指针
语⾔中的语句语⾔中的语句一、continue语句简介continue 语句只能⽤于含有循环的语句中, ⽤于在循环语句中结束本次循环继续下⼀次循环. 若是在循环语句中有了 continue,continue 后⾯的语句将不会执⾏注:(1) 只能⽤于循环语句(2) 不是跳出循环, ⽽是结束本次, 继续下⼀次二、代码讲解。
2025-08-04 10:22:00
251
原创 适配器模式、代理模式、策略模式、观察者模式
* 代理对象⻆⾊内部含有对真实对象的引⽤,从⽽可以操作真实对象,同时代理对象提供与真实对象相同的接⼝以便在任何时刻都能代替真实对象。** 这种交互也称为发布 - 订阅,** 发布者,它发出通知时并不需要知道谁是它的观察者,可以有任意数⽬的观察者订阅并接收通知。简单来说,在某些情况下,⼀个客户不想或者不能直接引⽤另⼀个对象,⽽代理对象可以在客户端和⽬标对象之间起到中介的作⽤。代理对象在客户端和⽬标对象之间起到⼀个中介的作⽤,这样可以起到对⽬标对象的保护。将需要适配的对象进⾏包装然后提供适配后的接⼝。
2025-08-04 09:59:30
765
原创 单例模式、简单工厂、工厂方法、抽象工厂
产⽣于 1987 年美国东北⼤学(Northeastern University)的⼀个名为迪⽶特(Demeter)的研究项⽬,由伊恩 · 荷兰(Ian Holland)提出,被 UML 创始者之⼀的布奇(Booch)普及,后来⼜因为在经典著作《程序员修炼之道》(The Pragmatic Programmer)提及⽽⼴为⼈知。** 任何基类可以出现的地⽅,⼦类⼀定可以出现,只有当派⽣类可以替换掉基类,软件功能不受影响时,基类才能真正被复⽤,** ⽽派⽣类也能够在基类的基础上增加新的⾏为。
2025-08-04 09:40:14
954
原创 c++11智能指针
shared_ptr 定义的智能指针 A 赋值给 shared_ptr 定义的智能指针 B 的时候。weak_ptr ⽀持拷⻉或赋值, 但不会影响对应的 shared_ptr 内部对象的计数.reset :放弃内部对象的所有权或拥有对象的变更, 会引起原有对象的引⽤计数的减少。**shared_ptr 定义的智能指针 A 拷⻉构造产⽣智能指针 B 的时候,**use_count :返回与 shared_ptr 共享的对象的引⽤计数.⽤于获取所管理的对象的强引⽤ (shared_ptr).
2025-08-04 09:18:57
538
原创 std::function 和 std::bind、c++11多线程
和和可调⽤对象有⼀下⼏种定义:是⼀个函数指针是⼀个具有 operator() 成员函数的类的对象可被转换成函数指针的类对象⼀个类成员函数指针 (void(void))C++ 中可调⽤对象的虽然都有⼀个⽐较统⼀的操作形式,但是定义⽅法五花⼋⻔,这样就导致使⽤统⼀的⽅式保存可调⽤对象或者传递可调⽤对象时,会⼗分繁琐。C++11 中提供了 std::function和std::bind 统⼀了可调⽤对象的各种操作。
2025-08-04 09:03:46
600
原创 c++11新的关键字、右值引用与移动语义、lambda表达式
C++98/03,C++11 则带来了数量可观的变化,其中包含了约 140 个新特性,以及对 C++03 标准中约600 个缺陷的修正,这使得 C++11 更像是从 C++98/03 中孕育出的⼀种新语⾔。上述代码看起来没有什么问题,但是有⼀个不好的地⽅:**GetString 函数返回的临时对象,将 s2 拷⻉构造成功之后,⽴⻢被销毁了 (临时对象的空间被释放),再没有其他作⽤;,它并不搬移任何东⻄,** 唯⼀的功能就是将⼀个左值强制转化为右值引⽤,通过右值引⽤使⽤该值,实现移动语义。
2025-08-04 08:53:36
852
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅