- 博客(29)
- 收藏
- 关注
原创 【C++】构造函数和析构函数
构造函数是特殊的公有成员函数(但不是只是公有成员函数,在特殊用途中构造函数的访问限定可以定义为私有或保护)。函数名称与类同名:构造函数名称必须与类名严格一致。无返回值类型:无需声明返回类型(是没有返回类型,而不是void),实际上构造函数有返回值,返回值就是构造函数所创建的对象。在程序运行时,当新的对象被建立,该对象所属的类构造函数自动被调用,在该对象的生存周期中也只调用这一次。
2025-08-05 16:04:15
719
原创 【C++】封装,this指针
C++封装机制是面向对象编程的核心特性,通过访问控制修饰符(private/protected/public)实现数据和方法的捆绑。封装将数据成员私有化,通过公有成员函数提供可控访问接口,隐藏内部实现细节。类作为抽象模板定义属性和行为,对象作为实例占用实际内存。成员函数通过作用域解析运算符"::"定义,可访问类的所有成员。this指针机制使不同对象共享同一份成员函数代码,通过隐式参数区分调用对象。静态成员不属于对象,存储在数据区。封装提高了代码安全性和可维护性,体现了信息隐藏的编程思想。
2025-08-03 20:46:27
908
原创 【C++】面向对象编程
面向过程编程(如C语言)采用自顶向下、模块化的设计思想,通过函数实现功能,数据与函数分离。面向对象编程(如C++)则将现实实体抽象为类,封装属性和方法,实例化为对象。面向对象具有封装性、继承性等优点,提高了代码复用性和可维护性。两种范式各有特点,选择取决于具体需求。
2025-08-03 18:32:28
155
原创 【计算机网络】Socket网络编程
摘要:本文介绍了网络编程中的核心概念和技术要点。主要内容包括:1)主机字节序和网络字节序的区别及转换函数;2)IPv4/IPv6套接字地址结构及其转换方法;3)网络编程接口API,涵盖socket、bind、listen、accept等关键函数;4)TCP编程流程,详细说明了服务器端和客户端的实现步骤,并提供了完整的代码示例。文章重点阐述了不同字节序的转换方法、套接字地址结构的使用规范,以及TCP通信的基本流程,为网络编程提供了实用的技术参考。
2025-08-02 19:00:01
751
原创 【计算机网络】计算机网络引言
计算机网络是通过通信链路和交换设备将分散的计算机系统连接起来,实现资源共享和信息传递的系统。其核心组成部分包括:硬件设备(交换机、路由器等)、传输介质(双绞线、光纤等)以及关键概念如IP地址(IPv4/IPv6)、MAC地址和端口(0-65535)。网络采用分层模型(OSI七层/TCP-IP四层),各层协议(如TCP、UDP、HTTP等)协同工作完成数据传输。通信流程遵循封装与解封装原则:数据从应用层逐层添加协议头,经物理层传输后,在接收端逆向拆解还原。互联网作为全球性网络,通过标准化协议实现跨网络通信。
2025-08-02 18:16:42
866
原创 【Linux】生产者消费者问题
生产者消费者问题,也被称作有限缓冲问题。可以描述为:两个或者更多的线程共享同一个缓冲区,其中一个或多个线程作为生产者会不断地向缓冲区中添加数据,另一个或者多个线程作为消费者” 从缓冲区中取走数据。
2025-07-31 16:17:09
733
原创 【Linux】线程——并发运行、同步、线程安全
本文系统介绍了多线程编程中的核心同步机制,包括信号量、互斥锁、读写锁和条件变量。主要内容包括:1. 线程并发运行的基本概念和实现方式;2. 信号量的定义、种类(二进制/计数信号量)及操作接口;3. 互斥锁的原理、基本函数及典型应用场景;4. 读写锁的特点与实现,分析其适用于读多写少的优势;5. 条件变量的工作原理及线程间通信机制;6. 线程安全问题及解决方案,重点讨论strtok()的线程安全替代方案strtok_r()。文中通过大量代码示例演示了各种同步机制的具体实现,并分析了常见问题如死锁、竞态条件等,
2025-07-29 17:34:53
882
原创 【C++】New和Malloc
本文比较了C++中new运算符和malloc函数的内存管理机制。new既是关键字又是运算符,可以自动计算内存大小并支持初始化,失败时抛出异常。malloc则是函数,需要手动计算大小且不初始化,失败返回NULL。new通过delete释放,malloc通过free释放。文章还介绍了定位new的特殊用法,它能在指定地址构造对象,适用于内存池等场景。两者的核心区别在于:new是类型安全的运算符,能自动处理构造/析构;malloc是原始的内存分配函数,需要更多手动管理。
2025-07-25 11:09:16
611
原创 【数据结构】关于链表的面试题
通过两个辅助指针p和 q,在遍历链表时逐个反转指针方向。第一个有效节点NULL,pNULLq保存p的下一个节点(防止断链)。pnextnextpppq当p为NULL时,说明原链表已全部遍历完毕,逆置完成。
2025-07-19 00:53:19
707
原创 【数据结构】双向链表
本文详细介绍了双向链表的数据结构及其操作实现。首先阐述了双向链表的概念,每个节点包含数据域和两个指针域(前驱和后继),相较于单向链表支持双向遍历但需要更多存储空间。文章重点讲解了双向链表的核心操作,包括初始化、插入(头插、尾插、指定位置插入)、删除(头删、尾删、按位置/值删除)等操作的实现原理和代码示例,并分析了指针修改顺序的重要性。此外还介绍了其他辅助操作如清空、销毁、判空、获取长度和遍历方法。最后总结了双向链表的优缺点(操作灵活但占用空间大)及其典型应用场景(如浏览器历史记录、撤销操作等)。全文通过图解
2025-07-18 23:42:14
912
原创 【Linux】线程
线程是操作系统调度的最小单位,属于同一进程的多个线程共享内存空间。文章介绍了线程与进程的区别、并行与并发的概念,以及线程的生命周期。重点讲解了POSIX线程库的使用方法,包括创建线程(pthread_create)、线程退出(pthread_exit)、等待线程结束(pthread_join)等操作,并提供了示例代码展示主线程和子线程的并发执行。线程编程需要考虑同步机制,编译时需要链接pthread库(-lpthread)。
2025-07-18 18:21:14
704
原创 【Linux】进程间通信(三)——共享内存和消息队列
本文介绍了两种进程间通信机制:共享内存和消息队列。共享内存通过直接访问同一物理内存实现高效数据交换,需配合信号量进行同步,包含创建(shmget)、映射(shmat)、操作(p/v)和删除(shmctl)等步骤,具有高性能但需手动管理同步。消息队列采用异步通信模式,通过msgget创建、msgsnd/msgrcv收发消息、msgctl删除,支持解耦和流量削峰,但存在系统复杂度增加和消息延迟等问题。两种方式各适用于不同场景,共享内存适合高频数据交换,消息队列更适用于分布式系统和解耦需求。文中通过C语言代码示例
2025-07-18 14:21:06
641
原创 【数据结构】单循环链表
摘要 单循环链表是一种尾节点指向头节点的特殊链表结构,形成闭合环。其节点结构与普通单链表相同,但尾节点指针指向头节点而非NULL。本文详细介绍了单循环链表的实现与操作,包括:初始化、插入(头插/尾插/按位置插入)、删除(头删/尾删/按位置/按值删除)、查找、清空、销毁等核心功能,并提供了各操作的图解和代码实现。文章还分析了单循环链表的应用场景(如约瑟夫问题、轮询调度等),优缺点(空间利用率高但操作较复杂),以及常见问题(如死循环预防、内存泄漏等)的解决方案。该数据结构适合需要环形访问的场景,但需特别注意循环
2025-07-17 23:22:43
1011
原创 【Linux】进程间通信(二)——信号量
信号量是一个特殊的变量,一般取正数值;它的值代表允许访问的资源数目。获取资源时,需要对信号量的值进行原子减一,该操作被称为。释放资源时,需要对信号量的值进行原子加一,该操作被称为。当信号量值为 0 时,代表没有资源可用,P 操作会阻塞。同一时刻,只允许被一个进程或线程访问的资源。信号量的值如果只取 0,1,将其称为。测试结果:错误,不满足我们要求的结果。要求打印结果为:aaaabbbbb。如果信号量的值大于 1,则称之为。作用:信号量主要用来同步进程。ipcrm -s +id号。访问临界资源的代码段。
2025-07-16 13:46:26
274
原创 【Linux】进程间通信(一)——管道
本文介绍了Linux系统中的进程间通信(IPC)机制,重点分析了管道的实现与应用。主要内容包括:1) 进程间通信的基本概念和常见方式(管道、消息队列、共享内存等);2) 有名管道的创建与使用,通过mkfifo创建管道文件实现任意进程间通信;3) 无名管道的pipe系统调用实现父子进程通信;4) 管道的特点:半双工通信、数据存储在内存等。文章通过具体代码示例展示了管道的单向数据传输过程,并比较了有名管道与无名管道的区别及应用场景。
2025-07-15 19:26:31
584
原创 【Linux】Linux信号<signal.h>和进程替换exec
2. #define SIGINT 2 //键盘按下 Ctrl+c 时,会产生该信号10. #define SIGKILL 9 //该信号的响应方式不允许改变14. #define SIGPIPE 13 //读端关闭的描述符,写端写入时产生,该信号会终止程序16. #define SIGTERM 15 //系统 kill 命令默认发送的信号18. #define SIGCHLD 17 //子进程结束后,会默认给父进程发送该信号。
2025-07-15 12:45:00
1812
原创 【Linux】复制进程fork
进程是操作系统资源分配的基本单位,包含程序代码、数据和系统资源。fork()系统调用用于创建子进程,返回父进程中的子进程PID和子进程中的0。父子进程共享初始内存空间,通过写时拷贝技术优化资源使用。进程并发运行可实现并行处理,需注意僵死进程问题(子进程结束但未被父进程回收)。解决方法包括父进程调用wait()或让init进程接管孤儿进程。逻辑地址由CPU生成,物理地址对应实际内存位置,通过MMU进行转换。
2025-07-15 10:15:00
976
原创 【数据结构】单链表
单链表是一种动态线性数据结构,由节点(含数据域和指针域)链式连接而成,支持高效插入/删除操作。本文详细介绍了单链表的节点结构设计(包括辅助节点)、核心功能实现(头插/尾插/按位插入、头删/尾删/按值删除等)、查找判空等辅助操作,并对比了顺序存储的优缺点。特别强调了临时指针的两种移动策略:需前驱节点的操作从辅助节点开始,直接遍历则从首节点开始。单链表适合动态内存场景,但存在查找效率低(O(n))和额外指针开销的问题,常用于实现栈、队列及图的邻接表存储。
2025-07-14 23:30:00
869
原创 【Linux】进程
进程是操作系统中的基本执行单元,指正在运行的程序实例。它不仅包含程序的代码段,还包括当前活动(如程序计数器、寄存器值)、堆栈(临时数据)、数据段(全局变量)以及系统资源(如打开的文件、内存分配)。进程是系统资源分配和调度的独立单位。
2025-07-14 19:00:00
280
原创 【Linux】Vi/Vim 命令
摘要:vi/vim是Unix/Linux系统中高效的文本编辑器,支持纯键盘操作。它具有三种模式:命令模式(移动/编辑)、插入模式(输入文本)和底行模式(保存/退出)。常用命令包括h/j/k/l移动光标,i/a/o进入插入模式,dd删除行,yy复制行,:wq保存退出。vim还支持搜索替换(/text)、显示行号(:set nu)等高级功能。通过持续练习可掌握其强大编辑能力,成为命令行环境下的高效工具。
2025-07-14 14:29:03
800
原创 【Linux】Linux基础命令
本文总结了Linux系统的常用命令、目录结构、文件类型与权限管理。常用命令部分介绍了用户管理(sudo、useradd)、文件操作(cd、ls、cp/mv)、文本处理(grep、wc)等基础命令;系统目录部分说明了/etc、/bin等核心目录的功能;文件权限部分详细讲解了-rwx权限体系,包括文字设定法(u/g/o)和数字设定法(755等),并介绍了chmod命令的两种修改方式。全文覆盖了Linux系统管理的基础知识点,包括命令行操作、文件系统结构和权限控制机制。(149字)
2025-07-14 14:13:14
837
原创 【C语言】内存操作函数(二)
本文介绍了C标准库中的三个内存操作函数:memset、memcmp和memchr。memset用于以指定值填充内存区域,适用于初始化缓冲区但需注意按字节填充的特性;memcmp用于比较两段内存区域的内容,返回字典序比较结果;memchr则用于在内存中搜索特定字符。三者均以字节为单位操作,不关心数据类型,但使用时需注意边界条件和特殊场景(如结构体填充字节)。文中还提供了函数原型、实现示例及注意事项,强调memset不适合非字符数组初始化,memcmp不同于strcmp等关键区别。
2025-07-14 13:37:30
652
原创 【数据结构】 顺序表
顺序表是一种线性表的连续存储结构,具有高空间利用率和随机访问特性。摘要介绍了顺序表的结构体设计(包含元素指针、长度和容量),以及初始化、插入(头插/尾插/按位插)、删除(头删/尾删/按位删/按值删)、查找、判空/满、扩容等核心操作实现。重点分析了插入/删除的平均时间复杂度为O(n),随机访问为O(1)的特点。顺序表适用于元素数量稳定、频繁访问的场景,与链表相比更节省内存但修改效率较低。典型应用包括数组排序和矩阵运算,现代语言中的动态数组(如C++ vector)多基于顺序表实现。
2025-07-13 21:35:05
228
原创 【数据结构】第一节 绪论
摘要:数据结构是组织和存储数据的方式,包含逻辑结构、存储结构和数据运算三要素。逻辑结构分为线性(如链表)和非线性(如树、图);存储结构包括顺序、链式、索引和散列存储。算法是解决问题的有限步骤,具有有穷性、确定性等特性,其效率通过时间复杂度和空间复杂度衡量,常用大O表示法分析最坏、平均和最好情况下的性能。
2025-07-13 21:16:08
603
原创 【C语言】C语言内存操作函数(一)
memcpy和memmove函数对比摘要这两个函数都用于内存数据复制,但处理方式不同:memcpy实现非重叠内存区的快速复制,格式为voidmemcpy(voiddest,constvoid*src,size_tnum),直接进行字节复制memmove专门处理重叠内存区,通过判断dest和src位置关系,选择从后往前或从前往后复制示例代码显示:memcpy直接复制会导致重叠区数据被覆盖,而memmove能正确处理重叠情况测试表明,在相同数组内部复制时,memcpy会破坏原数据,memmove则能
2025-07-09 16:01:30
187
原创 【C语言】C语言字符串操作函数
字符串destination中,并覆盖destination原始字符串,可以用来为字符串变量赋值。将字符串source添加到字符串destination的尾部。目标空间足够大,源空间一定要有\0, 不能自己给自己追加。(3). 若str1小于str2,返回-1;(2). 若str1大于str2,返回1;(1). 如果两个字符串相等,则返回0;目标空间足够大,源空间一定要有\0。str 不为空,为空就不能解引用。计算字符串str的长度。两个字符串一定要有\0。将字符串source。
2025-07-08 17:24:12
358
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人