自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(90)
  • 收藏
  • 关注

原创 五种IO模型 && 阻塞IO && 多路转接之select && 多路转接之poll

poll的结构:events事件:其他的返回结果什么的,跟上面的select完全一样。

2025-08-08 16:07:52 440

原创 HTTPS【什么是HTTPS】【为什么要加密】【常见的加密方式】【数据摘要 && 数据指纹】【HTTPS的工作过程探究】【数据签名】【CA证书】【非对称加密 + 对称加密 + 证书认证】

HTTPS(HyperText Transfer Protocol Secure)是HTTP的安全版本,通过加密技术(如SSL/TLS协议)保护数据传输的隐私和完整性。它确保客户端(如浏览器)与服务器之间的通信不被窃听或篡改,广泛应用于登录、支付、敏感信息传输等场景。• 数字指纹(数据摘要),其基本原理是利用单向散列函数(Hash 函数)对信息进行运算, 生成一串固定长度的数字摘要(也就是说,假如有多个十万字的文章,通过hash映射为一个固定长度的字符串,因为是hash映射,所以不存在解密过程)。

2025-08-04 17:09:36 953

原创 数据链路层、NAT、代理服务、内网穿透

• 反向代理服务器是一种网络架构模式,其作为 Web 服务器的前置服务器,接收来自客户端的请求,并将这些请求转发给后端服务器,然后将后端服务器的响应返回 给客户端。• 源主机发出 ARP 请求,询问“IP 地址是 192.168.0.1 的主机的硬件地址是多少”, 并将这个请求广播到本地网段(以太网帧首部的硬件地址填 FF:FF:FF:FF:FF:FF 表示 广播);现在它们都要访问一个直播平台,这个直播平台直接把它们的IP地址给交换了,使主播的直播画面,信息等不经过平台的服务器,直接把画面推送给用户。

2025-08-02 20:51:23 676

原创 IP协议详解:从网段划分到分片组装

对于 ftp 这样的程序, 最大吞吐量比较重要.• 13 位分片偏移(framegament offset): 是分片相对于原始 IP 报文开始处的偏移. 其实就是在表示当前分片在原报文中处在哪个位置. 实际偏移的字节数是这个值 8 得到的. 因此, 除了最后一个报文之外, 其他报文的长度必须是 8 的整数倍(否则报文 就不连续了).通过合理设置主机号和网络号, 就可以保证在相互连接的网络中, 每台主机的 IP 地址都 不相同. 那么问题来了, 手动管理子网内的 IP, 是一个相当麻烦的事情.

2025-08-01 16:45:02 924

原创 传输层协议UDP与TCP

• 由于我们的请求量很大, 就可能导致 TIME_WAIT 的连接数很多, 每个连接都会占用一个通信五元组(源 ip, 源端口, 目的 ip, 目的端口, 协议). 其中服务器的 ip 和端 口和协议是固定的. 如果新来的客户端连接的 ip 和端口号和 TIME_WAIT 占用的链 接重复了, 就会出现问题.大量的丢包, 我们就认为网络拥塞;接收端处理数据的速度是有限的. 如果发送端发的太快, 导致接收端的缓冲区被打满, 这 个时候如果发送端继续发送, 就会造成丢包, 继而引起丢包重传等等一系列连锁反应.

2025-07-30 18:43:59 722

原创 HTTP协议

URL是什么?

2025-07-28 18:54:48 543

原创 计算机网络:【socket】【UDP】【地址转换函数】【TCP】

它返回的是一个文件描述符。创建socket文件描述符(TCP/UDP,客户端服务器• socket()打开一个网络通讯端口,如果成功的话,就像 open()一样返回一个文件描 述符;• 应用程序可以像读写文件一样用 read/write 在网络上收发数据;• 如果 socket()调用出错则返回-1;• 对于 IPv4, family 参数指定为 AF_INET;• 对于 UDP 协议,type 参数指定为 SOCK_DGRAM, 表示面向数据报的传输协议。

2025-07-01 17:08:37 753

原创 Linux数据库:【数据库基础】【库的操作】【表的操作】

数据库是一个用于存储和管理数据的系统。它可以帮助用户组织、检索、更新和管理大量数据。mysql是数据库服务的客户端,mysqld是数据库服务的服务端,它的本质就是基于CS模式的网络服务。文件保存数据有以下几个缺点:文件的安全性问题文件不利于数据查询和管理文件不利于存储海量数据文件在程序中控制不方便比如我们在一个普通文件里写入大量的数据(十万行十亿行),那么多的数据在普通文件里,我们如果想要管理起来这是非常麻烦的一件事,比如我要修改十亿行数据里的第一百万行,怎么搞?

2025-04-06 00:00:00 968

原创 Linux线程同步与互斥:【线程互斥】【线程同步】【线程池】

生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区, 平衡了生产者和消费者的处理能力。因为我在当前的进程没有进行释放锁的操作,我是持有锁被切换的,相当于拿着钥匙,钥匙不给其他线程,其他线程也只能干等着,等我回来释放锁,其他线程才能展开锁的竞争,进入临界区。• 但有时候,很多变量都需要在线程间共享,这样的变量称为共享变量,可以通过数据的共享,完 成线程之间的交互。

2025-04-05 00:00:00 1025

原创 Linux线程概念与控制:【线程概念(页表)】【Linux线程控制】【线程ID及进程地址空间布局】【线程封装】

• 在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”• 一切进程至少都有一个执行线程• 线程在进程内部运行,本质是在进程地址空间内运行• 在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更加轻量化• 透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形 成了线程执行流。

2025-04-04 00:00:00 760

原创 Linux进程信号:【什么是信号】【产生信号】【保存信号】【捕捉信号】【可重入函数】【volatile】【SIGGHLD】

闹钟响了,上课铃响了,肚子饿了。这些都是给人的信号,人可以接收这些信号,从而去处理信号。信号的三种处理方式:默认处理动作(我饿了,立刻就去吃饭),自定义处理信号(我饿了,先打完这把游戏再吃),忽略信号(我饿了,但我现在就是不吃)。你怎么能识别信号呢?识别信号是内置的,进程识别信号,是内核程序员写的内置特性。信号产生之后,你知道怎么处理吗?知道。如果信号没有产生,你知道怎么处理信号吗?知道。所以,信号的处理方法,在信号产生之前,已经准备好了。处理信号,立即处理吗?

2025-04-03 00:00:00 933

原创 Linux进程间通信:【目的】【管道】【匿名管道】【命名管道】【System V 共享内存】

第二次循环,再次创建管道文件,因为父进程的3已经被关闭了,所以重新分配的话会分配3和5,后面依然会关闭3,此时就要创建新的子进程了,那么这个子进程有了上面的经验,这个子进程就会进程父进程所有的东西,包括上面父进程的4。上面的方法并不好,虽然解决了问题,这里我们希望只让父进程的写端指向我们的文件,所以我们在每一次的创建新的子进程的时候,让子进程把它的兄弟进程的写端给关掉,根本不增加引用计数的机会。在创建子进程的时候,子进程会继承父进程的文件描述符表,所以子进程的文件描述符表需要关闭写端,父进程需要关闭读端。

2025-04-02 00:00:00 1343

原创 Linux库制作与原理:【静态库】【动态库】【目标文件】【ELF文件】【ELF从形成到假造轮廓】【理解链接和加载】

库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:• 静态库 .a[Linux]、.lib[windows]• 动态库 .so[Linux]、.dll[windows]预备代码,第三节:简单封装的libc库• 静态链接的出现,提高了程序的模块化水平。对于一个大的项目,不同的人可以独立地测试和开发自己的模块。

2025-02-11 15:36:55 857

原创 Linux Ext系列文件系统:【理解硬件(磁盘)】【引入文件系统】【ext2文件系统】【软硬链接】

目录一、理解硬件(磁盘)1.1磁盘的存储结构 1.2磁盘的逻辑结构1.3CHS与LBA地址转换二、引入文件系统2.1块​编辑 2.2分区2.3inode三、ext2文件系统 3.1宏观认识 3.2Block Group3.3块组内部构成3.3.1超级块(Super Block)3.3.2GDT(Group Descriptor Table)3.3.3块位图(Block Bitmap)3.3.4inode位图(Inode Bitmap)3.3.5节点表(Inode Table)3.3.6Data B

2025-02-08 12:07:15 815

原创 Linux基础IO【系统文件I/O】【理解“一切皆文件”】【缓冲区】

pathname: 要打开或创建的⽬标⽂件flags: 打开⽂件时,可以传⼊多个参数选项,⽤下⾯的⼀个或者多个常量进⾏“或”运算,构成flags。参数:O_RDONLY: 只读打开O_WRONLY: 只写打开O_RDWR : 读,写打开这三个常量,必须指定⼀个且只能指定⼀个O_CREAT : 若⽂件不存在,则创建它。需要使⽤mode选项,来指明新⽂件的访问权限O_APPEND: 追加写返回值:成功:新打开的⽂件描述符失败:-1缓冲区是内存空间的一部分。

2025-02-06 13:46:39 991

原创 Linux进程控制:【进程创建】【进程终止】【进程等待】【进程程序替换】【自主shell命令行解释器】

程序替换是通过特定的接口,加载磁盘上的一个全新的程序(代码和数据),加载到调用进程的地址空间 中!我们知道,进程在被杀死后就会进入僵尸状态,在task_struct内部会记录我们此时的退出状态和信号信息等,父进程进行系统调用(wait)找到子进程,把信息按位操作通过status交到父进程所对应的地址空间上。5.光返回0还不够,我们需要在父进程的外部加一个循环(非阻塞轮询),使得父进程的waitpid隔一段时间就查一下,而隔一段的这个时间,父进程就可以干自己的事情,具体怎么干,参考上面的代码。

2025-02-01 21:11:37 735

原创 Linux进程概念:【环境变量】【程序地址空间】

◦ 众所周知,编译完成后的程序是存放在硬盘上的,当运行的时候,需要将程序搬到内存当中去运行,如果直接使用物理地址的话,我们无法确定内存现在使用到哪里了,也就是说拷贝的实际内存地址每一次运行都是不确定的,比如:第一次执行a.out时候,内存当中一个进程都没有运行,所以搬移到内存地址是0x00000000,但是第二次的时候,内存已经有10个进程在运行了,那执行a.out的时候,内存地址就不一定了。• 因为有地址空间的存在和表表的映射的存在,我们的物理内存中可以对未来的数据进行任意位置 的加载!

2025-01-26 14:41:53 982

原创 Linux初识:【冯诺依曼体系结构】【操作系统概念】【进程部分概念(进程状态)(进程优先级)(进程调度队列)】

假如磁盘写这100MB的内存失败了,磁盘就会去找进程,但是进程已经死亡了,无法找到进程,此时磁盘也不知道怎么办了,这100MB的东西就丢失了。因为进程在启动时会记录下来当前路径,而fopen就是进程中的一句代码,fopen在创建文件的时候,会默认的获取工作路径,在路径后面加上我们新建的代码。这个exe就是我们对应的可执行文件,当进程在跑的时候我们甚至可以把这个文件删除也不会影响我们正在跑的进程,因为删除的这个文件已经被执行了,上面说过的一个东西程序被执行就一定要先加载到内存,我们删除的只是磁盘上的文件。

2025-01-24 13:58:05 938

原创 Linux初识:【版本控制器Git】【调试器gdb/cgdb使用】

所谓的版本控制器,就是能让你 了解到一个文件的历史,以及它的发展过程的系统。通俗的讲就是一个可以记录工程的每一次改动和版本迭代的一个管理系统,同时也方便多人协同作业。程序的发布方式有两种, debug 模式和 release 模式, Linux gcc/g++ 出来的二进制程 序,默认是 release 模式。当我们在上面用Windows机器对文件进行了修改更新了远端仓库的内容,那我的Linux机器并不知道远端更新了,这时如果我去。它会记录我们所有的修改记录,git在提交的时候只会记录变化的部分。

2025-01-20 17:25:21 894

原创 Linux初识:【make/Makefile】【进度条】

从上到下扫描,刚开始是没有.o文件的,理解为先把这段指令入栈,往下执行,也没有.s文件,也入栈,以此类推一直到.i所依赖的.c文件,执行这段代码,生成.i文件,一直往上走。5.当然,你的C文件和H文件是存在的,于是make会生成myproc.o文件,然后再用myproc.o文件声明make的终极任务,也就是执行文件。7.在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。

2025-01-19 16:59:50 744

原创 Linux初识:【Linux软件包管理器yum】【Linux编辑器-vim的使用】【Linux编译器-gcc/g++的使用】

在Linux下安装软件,一个通常的办法是下载到程序的源代码,并进行编译,得到可执行程序.但是这样太麻烦了,于是有些人把一些常用的软件提前编译好,做成软件包(可以理解成windows上的安装程序)放在一个服务器上,通过包管理器可以很方便的获取到这个编译好的软件包,直接进行安装.软件包和软件包管理器,就好比"App"和"应用商店"这样的关系.

2025-01-18 16:34:17 1329

原创 Linux初识:【shell命令以及运行原理】【Linux权限的概念与权限管理】

你看上了小花,但是有不好意思直接表白,那就让你你家人找媒婆帮你提 亲,所有的事情你都直接跟媒婆沟通,由媒婆转达你的意思给小花,而我们找到媒婆姓王,所以我们叫 它王婆,它对应我们常使用的bash。那么我就必须开放权限给组长,如果只有文件拥有者和other的话,我开放权限就只能开放other的权限,那么其他所有人是不是都可以看见了,为了避免这样的情况发生,就专门设置了一个叫做所属组的东西,使开权限只让所属组看到。在特殊情况下,配置umask可以控制文件的默认权限,让我们的代码是可控的。

2025-01-15 16:07:15 996

原创 Linux初阶:【在Linux系统中,一切皆文件】【文件类型】【部分指令】

我们是设备在启动的时候默认会打开三个设备文件,这三个文件会以FILE*的形式给我们呈现出来,让我们去访问对应的文件。跟Windows差不多,我们在进行文件传输时,为了节省传输的时间,我们通常会对文件进行压缩处理,然后再去进行文件传输。我在echo命令的后面加一个“>”符号,就说明我要把这个字符串写到hello.txt文件里,而不再是默认的显示器文件里。head查看开始的,tail查看最后的。在不同的终端用echo重定向输出字符串到另一个终端里,这充分可以证明终端也是文件 (每一次我们登录就是新建文件)。

2025-01-14 14:49:19 1060

原创 Linux初识:搭建环境,Xshell远程登录

1. 直接安装在物理机上. 但是由于 Linux 桌面使用起来非常不友好, 不推荐.2. 使用虚拟机软件, 将 Linux 搭建在虚拟机上. 但是由于当前的虚拟机软件(如 VMWare 之类的)存在一些 bug , 会导致环境上出现各种莫名其妙的问题, 比较折腾.3. 使用云服务器, 可以直接在 腾讯云, 阿里云或华为云 等服务器厂商处直接购买一个云服务器.这里对于新手推荐直接购买云服务器,好用也好实现。以阿里云为例:可以自行选择。

2025-01-12 17:07:16 347

原创 C++进阶:异常

• 异常处理机制允许程序中独立开发的部分能够在运行时就出现的问题进行通信并做出相应的处理, 异常使得我们能够将问题的检测与解决问题的过程分开,程序的一部分负责检测问题的出现,然后解决问题的任务传递给程序的另一部分,检测环节无须知道问题的处理模块的所有细节。上面的代码就是在除以0时抛出异常,但是抛出异常后在Func函数里有资源需要释放,但是捕捉异常的特性就是直接跳到catch位置,这里的资源没法释放就会资源泄漏,所以这里我们套一个catch捕捉异常,先把资源释放掉再去throw抛异常,外部再去捕捉。

2025-01-12 14:28:32 1071

原创 C++11:【包装器】【智能指针】

weak_ptr支持expired检查指向的 资源是否过期,use_count也可获取shared_ptr的引用计数,weak_ptr想访问资源时,可以调用lock返回一个管理资源的shared_ptr,如果资源已经被释放,返回的shared_ptr是一个空对象,如 果资源没有释放,则通过返回的shared_ptr访问资源是安全的。RAII在获取资源时把资源委托给一个对象,接着控制对资源的访问, 资源在对象的生命周期内始终保持有效,最后在对象析构的时候释放资源,这样保障了资源的正常释放,避免资源泄漏问题。

2025-01-12 14:28:09 1151

原创 C++11:【可变参数模版】【移动构造和移动赋值】【lambda】

• 仿函数的类名是编译按一定规则生成的,保证不同的 lambda 生成的类名不同,lambda参数/返 回类型/函数体就是仿函数operator()的参数/返回类型/函数体, lambda 的捕捉列表本质是生成的仿函数类的成员变量,也就是说捕捉列表的变量都是 lambda 类构造函数的实参,当然隐式捕捉,编译器要看使用哪些就传那些对象。当使用混合捕捉时,第一个元素必须是&或=,并且&混合捕捉时,后面的捕捉变量必须是值捕捉,同理=混合捕捉时,后面的捕捉变量必须是引用捕捉。捕捉列表为空也不能省略。

2024-12-10 21:46:28 743

原创 C++11:【列表初始化】【右值引用和移动语义】

• Function(T&&t)函数模板程序中,假设实参是int右值,模板参数T的推导int,实参是int左值,模 板参数T的推导int&,再结合引用折叠规则,就实现了实参是左值,实例化出左值引用版本形参的 Function,实参是右值,实例化出右值引用版本形参的Function。•变量表达式都是左值属性,也就意味着一个右值被右值引用绑定后,右值引用变量表达式的属性是左值,也就是说Function函数中t的属性是左值,那么我们把t传递给下一层函数Fun,那么匹配的都是左值引用版本的Fun函数。

2024-12-03 17:45:37 615

原创 C++进阶:用哈希表封装unordered_map和unordered_set

• 通过源码可以看到,结构上hash_map和hash_set跟map和set的完 全类似,复用同⼀个hashtable实现key和key/value结构,hash_set传给hash_table的是两个 key,hash_map传给hash_table的是pair<const Key,Value>。• iterator实现的大框架跟list的iterator思路是一致的,用一个类型封装结点的指针,再通过重载运算符实现,迭代器像指针一样访问的行为,要注意的是哈希表的迭代器是单向迭代器。

2024-11-23 16:11:38 671

原创 C++进阶:哈希表实现

当key是string/Date等类型时,key不能取模,那么我们需要给HashTable增加一个仿函数,这个仿函数支持把key转换成一个可以取模的整形,如果key可以转换为整形并且不容易冲突,那么这个仿函数就用默认参数即可,如果这个Key不能转换为整形,我们就需要自己实现⼀个仿函数传给这个参数,实现这个仿函数的要求就是尽量key的每值都参与到计算中,让不同的key转换出的整形值不同。如果是2^x ,那么key%2^x本质相当于保留key的后X位,那么后x位相同的值,计算出的哈希值都是⼀样的,就冲突了。

2024-11-21 22:54:44 1105

原创 C++进阶:unordered_map和unordered_set的使用

• unordered_set的声明如下,Key就是unordered_set底层关键字的类型• unordered_set默认要求Key支持转换为整形,如果不支持或者想按自己的需求走可以自行实现支持将Key转成整形的仿函数传给第二个模板参数• unordered_set默认要求Key支持比较相等,如果不支持或者想按自己的需求走可以自行实现支持将Key比较相等的仿函数传给第三个模板参数• unordered_set底层存储数据的内存是从空间配置器申请的,如果需要可以自己实现内存池,传给第四个参数。

2024-11-05 23:04:24 697

原创 C++进阶:封装红黑树实现map和set

RBTree实现了泛型不知道T参数导致是K,还是pair,那么insert内部进行插入逻辑比较时,就没办法进行比较,因为pair的默认支持的是key和value一起参与比较,我们需要时的任何时候只比较key,所以我们在map和set层分别实现一个MapKeyOfT和SetKeyOfT的仿函数传给 RBTree的KeyOfT,然后RBTree中通过KeyOfT仿函数取出T类型对象中的key,再进行比较,具体细节参考如下代码实现。如果右子树为空,就需要往上找了,找的是孩子是父亲左的那个祖先。

2024-11-02 13:56:11 988

原创 C++高阶:红黑树实现

分析:因为p和u都是红色,g是黑色,把p和u变黑,左边子树路径各增加⼀个黑色结点,g再变红,相 当于保持g所在子树的黑色结点的数量不变,同时解决了c和p连续红色结点的问题,需要继续往上更新是因为,g是红色,如果g的父亲还是红色,那么就还需要继续处理;u不存在,则c一定是新增结点,u存在且为黑,则c一定不是新增,c之前是黑色的,是在c的子树中插入,符合情况1,变色将c从黑色变成红色,更新上来的。分析:p必须变黑,才能解决,连续红色结点的问题,u不存在或者是黑色的,这里单纯的变色无法解决问题,需要旋转+变色。

2024-10-20 21:49:31 1047

原创 C++进阶:AVL树实现

• 更新后parent的平衡因子等于2或-2,更新前更新中parent的平衡因子变化为1->2或者-1->-2,说 明更新前parent子树一边高一边低,新增的插入结点在高的那边,parent所在的子树高的那边更高 了,破坏了平衡,parent所在的子树不符合平衡要求,需要旋转处理,旋转的目标有两个:1、把 parent子树旋转平衡。• 在a子树中插入一个新结点,导致a子树的高度从h变成h+1,不断向上更新平衡因子,导致10的平 衡因子从-1变成-2,10为根的树左右高度差超过1,违反平衡规则。

2024-10-19 21:04:08 1066

原创 C++进阶:map和set的使用

• set的声明如下,T就是set底层关键字的类型• set默认要求T支持小于比较,如果不支持或者想按自己的需求走可以自行实现仿函数传给第二个模版参数• set底层存储数据的内存是从空间配置器申请的,如果需要可以自己实现内存池,传给第三个参 数。• 一般情况下,我们都不需要传后两个模版参数。• set底层是用红黑树实现,增删查效率是O(logN) ,迭代器遍历是走的搜索树的中序,所以是有序 的。

2024-10-15 21:36:53 985

原创 C++进阶:二叉搜索树

找N左子树的值最大结点R(最右结点)或者N右子树的值最小结点R(最左结点)替代N,因为这两个结点中任意⼀个,放到N的 位置,都满足二叉搜索树的规则。• 二叉搜索树中可以支持插入相等的值,也可以不支持插入相等的值,具体看使用场景定义,map/set/multimap/multiset系列容器底层就是二叉搜索树,其中map/set不支持插入相等值,multimap/multiset支持插入相等值。3. 如果支持插入相等的值,插入值跟当前结点相等的值可以往右走,也可以往左走,找到空位置,插入新结点。

2024-10-10 22:48:05 1110

原创 C++进阶:多态

多态是⼀个继承关系的下的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象优惠买票。需要满足:• 必须指针或者引用调用虚函数• 被调用的函数必须是虚函数。说明:要实现多态效果,第一必须是基类的指针或引用,因为只有基类的指针或引用才能既指向派生类对象;第二派生类必须对基类的虚函数重写/覆盖,重写或者覆盖了,派生类才能有不同的函数,多态的不同形态效果才能达到。

2024-10-04 16:48:36 1098

原创 C++进阶:继承

继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许我们在保持原有类特性的基础上进行扩展,增加方法(成员函数)和属性(成员变量),这样产生新的类,称子类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。继承是类设计层次的复用。假如我有两个类Student和Teacher,这两个类可能有些属性是相同的,比如它们都有名字,性别等等,但是它们也有一些特点是独有的,比如学生的学号,老师的职工号等等。

2024-08-13 16:32:53 1151 1

原创 C++初阶:模版进阶【非类型模版参数】【模版的特化】【模版分离编译】

模板参数分类类型形参与非类型形参。类型形参:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。非类型形参:就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常 量来使用。创建一个a1.注意:1. 浮点数、类对象以及字符串是不允许作为非类型模板参数的。2. 非类型的模板参数必须在编译期就能确认结果。

2024-08-10 21:00:20 860

原创 C++初阶:【优先级队列】【容器适配器】【deque】【栈和队列】

priority_queue文档介绍(1)优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素 中最大的。(2)类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶 部的元素)。(3)优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的顶部。(4)底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。

2024-08-09 18:39:21 924

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除