自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

星光编译者的技术博客,专注 C/C++、Linux、数据结构与算法。

记录真实问题,分享可运行的代码与清晰的解题思路,让每一次编译与调试,都成为通往技术星河的一束光。

  • 博客(88)
  • 收藏
  • 关注

原创 【Python】基础语法(3):函数、作用域、递归、列表元组、字典与文件操作

🔥 星光编译者 · 个人主页📚 学习专栏: 《C/C++ 成长笔记》 · 《Linux 实践手册》 · 《数据结构与算法》🌄 向云端飞扬,编译属于自己的代码星河。  你好,这里是 星光编译者。  这里记录我在 C/C++、Linux、数据结构与算法 学习中遇到的真实问题、亲手验证过的代码,以及那些容易被忽略的实现细节。  比起简单罗列结论,我更愿意从问题出发,把一个知识点的来由讲清楚,把“为什么会这样”和“应该怎样解决”说明白,让每一次踩坑都沉淀成可以复用的经验。  如果这篇记录能帮你少绕一点路,或让

2026-09-30 13:47:27 342 1

原创 【Python】基础语法(2):分支、循环、流程控制与人生重开模拟器

顺序结构让语句按既定次序执行;条件分支把自然语言规则翻译成互斥或独立的判断;缩进决定代码块归属,是 Python 语法的一部分;while适合“满足条件就继续”的不定次数任务;适合遍历序列或明确的整数区间;continue跳过本轮,break结束当前循环,pass只负责占位;复杂项目应拆成多个职责清楚的阶段,而不是堆成巨大的嵌套分支。程序当前掌握了哪些状态?条件为真和为假分别走向哪里?循环每一轮改变了什么?什么条件保证程序最终能够结束?

2026-09-30 13:42:09 552 1

原创 【Python】基础语法(1):常量、变量、类型、输入输出与运算符

count = 10 # 首次绑定print(count) # 读取count = 20 # 重新绑定Python 不需要在变量名前写intfloat之类的类型声明。字面值提供数据,运算符把数据组成表达式;变量是名字与对象的绑定,而不是固定类型的物理盒子;类型决定表示与操作intfloatstrbool的规则不能随意混用;input()返回字符串,转换类型时要考虑失败;运算符不只是符号,还包含优先级、类型规则、取整方向和短路语义;浮点数是近似表示,工程比较需要合理容差。数据是什么类型?

2026-09-30 13:38:21 418

原创 【Python】认识 Python:计算机基础、编程语言、应用方向、环境搭建与第一个程序

日常生活中的计算器主要用于数值计算,而现代计算机能够完成的任务远不止加减乘除。进行算术运算和逻辑判断;保存、读取和修改数据;接收键盘、鼠标、摄像头、传感器等输入;通过屏幕、扬声器、打印机等设备输出结果;借助网络与其他计算机交换信息;按照程序自动、稳定地重复复杂流程。台式机、笔记本、手机、服务器、路由器和许多智能设备,外形与用途不同,但都可以看作计算机系统。程序是一组按照特定规则组织、可以由计算机执行的指令。从哪里取得两个数;输入不合法时怎样处理;使用什么规则进行运算;

2026-09-29 14:36:00 612 9

原创 【C 语言】深入理解指针(3):字符指针、数组指针、二维数组传参、函数指针与转移表

这一讲把指针从“保存某个数据的地址”推进到了更完整的类型系统:字符指针让我们区分字符串字面量与字符数组;数组指针让指针算术以整行为单位;二维数组传参揭示了列数其实属于元素类型;函数指针让程序可以保存、传递和选择行为;函数指针数组与转移表则把“编号到行为”的关系组织成可扩展的数据结构。面对复杂声明时,不要数星号,也不要只盯着地址。它指向什么、一步跨多远、解引用或调用后得到什么。当这套分析顺序形成习惯,指针就不再是一团符号,而会变成可以逐层验证的规则。

2026-09-29 14:21:47 779 8

原创 【C 语言】深入理解指针(2):数组名、数组传参、二级指针与指针数组

先看对象是什么:数组、指针变量、指针数组还是二维数组;再写出表达式类型int *int **还是int (*)[N];再判断步长与边界:指针加一跨过哪个类型,能否安全解引用;函数接口显式携带长度:首元素地址不会自动保存原数组的元素个数。数组名在普通表达式中通常转换为首元素指针,但与&arr会保留整个数组的语义;p[i]是*(p + i)的下标写法;一维数组传参本质上只把首元素地址交给函数;二级指针沿两层地址关系访问对象;指针数组则把多个地址组织成一个数组。

2026-09-28 12:49:18 629 10

原创 【C 语言】深入理解指针(1·下):指针运算、野指针、assert 与传址实战

NULL是可用于指针的空指针常量宏。空指针表示“没有指向有效对象”,不能解引用。不要把它简化成“所有平台上地址位图必然全是 0”。指针真正难的地方不是和两个符号,而是始终同时跟踪类型、边界与生存期。指针加减要沿同一数组移动,指针相减得到元素间隔,尾后指针可以当终点却不能解引用。面对无效指针,要从初始化、边界、生存期和接口契约上预防,而不是等崩溃后再猜。assert能把内部假设显式化,my_strlen展示了指针遍历,则说明了函数为何能通过地址修改调用者对象。

2026-09-28 12:42:23 389 8

原创 【C 语言】操作符详解(下):逗号、下标、结构体、类型转换与表达式求值

int c = 5;/* 不要这样写 */的左右操作数没有规定先后,表达式一边读取c,另一边又修改c,两者没有必要的顺序关系。在 C11 中属于未定义行为。未定义行为不能靠“我的编译器输出 9”或“加一对括号”变成合法题目。int c = 5;--c;/* 定义明确,result = 8 */课程里的,以及同一大表达式里多次i----ii++++i,也有同类问题。不同编译器出现不同输出只是症状,不能把某一个输出当成标准答案。操作符学习可以分两层:先知道每个符号做什么,再知道。

2026-09-26 10:46:38 533 2

原创 【C 语言】深入理解指针(1·上):从内存地址到 const 指针

指针基础可以压缩成一条主线:**对象占据存储空间,得到对象地址,指针变量保存地址,再通过地址访问对象。**指针类型告诉编译器如何解释目标和如何跨元素移动,const则把“能不能改指向”与“能不能通过指针改对象”分开表达。下篇将把这些基础放进真正的程序场景:数组遍历、指针相减、野指针规避、assert断言、模拟strlen以及用地址交换两个整数。资料:课程 PDF《第11讲:深入理解指针(1)》;ISO C11 工作草案 N1570的声明、指针、转换与表达式条款。本文示例和示意图为重新整理与绘制。

2026-09-26 10:46:26 559

原创 【C 语言】操作符详解(上):进制、补码、移位与位运算实战

先确认整数类型和位宽,再写出需要的二进制位,最后检查移位位数与结果范围。这样,就是清楚的逐位规则,掩码也能自然推导出来。下篇会继续看那些不直接处理二进制位、却常常让表达式变难读的操作符:逗号、下标、函数调用、结构成员访问,以及优先级与实际求值顺序的区别。资料:课程 PDF《第10讲:操作符详解》;ISO C11 工作草案 N1570的整数转换、移位与按位运算条款。本文示例和示意图为重新整理与绘制。

2026-09-24 10:47:36 410

原创 【C 语言】函数递归详解:终止条件、阶乘与逐位打印、调用栈、斐波那契和迭代取舍

把阶乘的基线误写为,则所有更大阶乘都会乘到0,结果全部错误。基线是整条递推链的根,不是一个随便填的停止标志。学递归最重要的不是记住一段固定模板,而是能把一个问题拆成更小的同类问题,并清楚说出何时停止、怎样返回、代价是什么。定义当前问题↓找无需继续拆分的基线↓把问题规模严格缩小↓让子问题给出答案↓在回归阶段完成当前层↓检查深度、重复计算和数值范围递归基线负责停下来,规模缩小负责保证能够走到基线。递归有“递”和“归”两段,调用后的代码会在返回时继续执行。

2026-09-24 10:44:13 420

原创 【C 语言】VS 实用调试技巧:断点、单步执行、监视窗口与内存排错

常见原因包括当前行无可执行指令、加载的程序与源码不匹配、PDB 未加载,或调试的不是当前构建产物。调试的本质不是“让程序慢下来”,而是让隐藏在执行过程中的控制流、数据流和内存状态变得可观察。稳定复现问题↓写清期望值与实际值↓提出一个可证伪假设↓用断点到达高信息量位置↓用 F10 / F11 控制执行粒度↓用 Watch / Locals / Call Stack / Memory 收集证据↓找到第一个错误状态↓完成最小修复↓。

2026-09-21 18:40:57 433 1

原创 【C 语言项目】数组和函数综合实践:从零实现控制台扫雷游戏

项目规则可见棋盘9 行 × 9 列雷的数量10 个坐标范围行、列都使用 1~9未排查位置显示安全位置显示周围八格的雷数0~8踩中雷显示完整雷盘,本局失败胜利条件81 - 10 = 71 个安全格全部打开1099这里的“第一次”非常关键。如果同一个安全坐标被反复输入,不能反复累加,否则玩家可能只打开少量格子就被错误判定为胜利。main 初始化随机序列↓外层菜单决定开始或退出↓game 创建 mine 与 show↓初始化完整 11×11 棋盘↓。

2026-09-20 13:03:22 609 8

原创 【C 语言】函数详解:从库函数、自定义函数到参数传递、数组传参、声明定义与 static/extern

返回类型 函数名(形式参数列表) {函数体 }// 调用另一个已声明函数// 标准 C 中不能在这里定义 inner某些编译器可能提供嵌套函数扩展,但那不是可移植的标准 C 写法。函数声明告诉编译器接口是什么;函数定义除了包含接口信息,还提供函数体。// 声明int add(int x, int y) // 定义return 0;函数定义本身也是声明。若定义位于mainreturn 0;课件示例中的<stido.h>是拼写错误,正确头文件是<stdio.h>;

2026-09-20 12:58:43 272 6

原创 【C 语言】数组详解:从一维数组、二维数组到内存布局、VLA 与二分查找

长度是元素个数,下标从 0 开始,因此最后一个合法下标是 9。数组是 C 语言从“单个变量”走向“批量数据处理”的关键一步。它把同类型数据放进连续内存,用下标建立统一访问方式,再与循环组合,形成输入、输出、统计、查找和二维表格处理的基础。确定元素类型与数量↓创建并初始化数组↓使用 0~n-1 的下标访问↓用循环覆盖全部合法下标↓理解连续内存与 sizeof↓扩展到二维数组的行列结构↓根据环境选择固定数组、VLA 或动态内存↓在有序数组上用二分查找缩小区间。

2026-09-19 10:47:07 494 5

原创 【C 语言】分支和循环(下):从 rand、srand、time 到完整猜数字游戏

100产生0~99,整体加一后上下界都加一。猜数字游戏代码不长,却把初学 C 语言时最重要的几种控制能力串到了一起:程序需要先初始化,再进入菜单;选择开始后进入一局;每次猜测根据三个互斥分支给出反馈;满足成功或失败条件后,再回到外层菜单。程序启动↓time(NULL) 提供变化值↓srand 只初始化一次↓do-while 显示菜单├── 0:退出程序├── 其他:提示错误,回到菜单└── 1:进入 game↓rand 生成本局答案↓while 接收猜测。

2026-09-19 10:35:00 376 8

原创 【C语言基础】分支和循环(下篇):while、for、do-while、break、continue 与嵌套循环

循环真正需要掌握的,不是“把代码多执行几次”,而是怎样维护状态,并证明过程最终停止。确定循环状态与初始值↓写出继续循环的条件↓完成本轮工作↓调整状态,逼近结束条件↓需要提前结束:break只跳过本轮:continue↓嵌套时分别说明每一层职责↓用零次、一次、边界和异常输入验证一个可靠循环必须能说明初始化、判断、循环体与调整四个部分。while 和 for 都先判断,循环体可能一次也不执行;do-while 至少执行一次。

2026-09-19 10:30:55 273 7

原创 【C语言基础】分支和循环(上篇):if、关系与逻辑运算、短路求值和 switch 一次讲透

语法上可以放在任何位置,但通常放最后最符合阅读习惯。无论放在哪里,匹配后仍遵循顺序执行和break规则。在条件判断中,整数0为假,非零为真。关系与逻辑运算的结果会规范为整数0或1。分支结构的表面是几个关键字,真正的核心却是条件、路径和边界。把业务规则拆成互斥或组合条件↓使用关系运算得到 0 / 1↓使用!、&&、|| 组合条件↓if 处理范围与复合规则switch 处理离散常量值↓用 else / default 覆盖剩余路径↓用边界值和反例验证每条分支。

2026-09-17 21:06:37 573 10

原创 【内存管理发展史】从 8086 实模式到分页:CPU 如何把虚拟地址变成物理地址

swap 是虚拟内存系统可能使用的一种后备存储手段。即使系统没有启用 swap,进程仍然拥有虚拟地址空间、页表、权限隔离、文件映射和按需分配。同样,物理内存满了也不能简单理解为“随便挑一页换到磁盘就行”。内核要考虑页面是否可回收、是否脏、是否有文件后备、是否被锁定、活跃程度和系统回收策略。4 KiB 页面需要 12 位页内偏移;剩余 20 位分别用 10 位索引 1024 项页目录和 10 位索引 1024 项页表。

2026-09-17 21:00:19 255 9

原创 【Linux 多线程】自旋锁:从 atomic_flag 原子操作到 pthread_spin_* 与高竞争优化

从表面看,自旋锁只是一个while循环;真正理解它,需要把原子性、内存序、调度和缓存一致性放到同一张图中。线程尝试获取锁↓原子 test-and-set / exchange├── 旧值 false:acquire 成功,进入临界区└── 旧值 true:pause / 只读观察 / 退避↓再次争抢↓在临界区维护共享不变量↓release 解锁↓下一位成功者观察到之前的写入自旋锁用 CPU 忙等换取避免主动阻塞与唤醒的机会,只适合极短且可控的等待。普通bool和volatile。

2026-09-16 10:20:05 357 13

原创 【C语言数据类型和变量·下】从表达式到输入输出:运算符、类型转换与 printf/scanf 安全用法

操作数进入表达式↓整数提升与通常算术转换↓+ - * / % 执行计算↓赋值或复合赋值把结果写回对象↓++ / -- 同时产生表达式值与对象修改↓必要时进行经过范围验证的显式转换↓printf 按格式把值转换成输出字符scanf 按格式解析字符并通过地址写入对象↓检查返回值、范围、宽度和输入残留表达式怎样计算首先由操作数类型决定,不由结果变量类型倒推。两个整数相除执行整数除法,至少一端为浮点数才进行浮点除法。只用于整数,余数非零时与左操作数同号。

2026-09-16 09:55:57 256 13

原创 【C语言数据类型和变量·上】从内置类型到变量模型:一次讲透 sizeof、signed/unsigned 与作用域

这一篇从内置类型出发,最终落到变量的可见范围和生存时间。现实中的数据需求↓选择字符 / 整数 / 浮点 / 布尔类型↓类型规定对象表示、大小与运算规则↓sizeof 查询对象表示所占字节数limits.h / float.h 查询数值能力↓使用类型定义并初始化变量↓通过作用域理解“名字在哪里可见”通过存储期理解“对象存在多久”通过链接理解“跨文件是否同一实体”内存里只有比特,类型规定这些比特如何解释和参与运算。普通char的符号性由实现决定,它不等同于。

2026-09-16 09:52:29 515 6

原创 【C语言常见概念】从第一行代码到字符串结束标志:一次打通编译、main、ASCII、转义字符与注释

许多常见操作不必由每个程序员重复实现。C 标准规定了一组库接口,不同平台的实现负责提供相应功能。<stdio.h>:输入输出;<string.h>:字符串和内存块操作;<stdlib.h>:内存分配、转换、程序控制;<math.h>:常见数学函数;<ctype.h>:字符分类和转换。使用库函数时包含正确头文件,编译器才能看到准确声明并检查调用。声明告诉编译器某个名字及其类型;定义还为函数提供函数体,或为对象提供实际实体。一个函数可以在多个翻译单元通过头文件被声明,但整个程序中应有符合规则的定义。

2026-09-15 09:56:05 503 7

原创 【读者写者问题与读写锁】读共享、写独占:从经典双锁协议到 pthread_rwlock

读者结束后递减计数。当计数从 1 变为 0,末读者释放只有此时才能确定读者群体已经完全离开,共享资源才重新对写者开放。读者写者问题表面上只是“读的时候可以一起,写的时候必须单独”,真正展开后,它连接了访问意图、状态机、锁所有权、公平性和生命周期。识别共享资源上的两种访问意图↓建立兼容矩阵:读读共享、读写互斥、写写互斥↓经典算法用 reader_count 表示读者群体├── 首读者:阻塞写者├── 中间读者:并发加入└── 末读者:放行写者↓发现读者优先可能导致写者饥饿↓。

2026-09-15 09:48:06 440 6

原创 【System V 消息队列】从消息类型到责任链:把进程通信接进日志处理流水线

这份加餐从 System V 消息队列出发,最终落到一个更完整的服务端处理系统。ftok 生成 key_t↓msgget 创建或获取队列,得到 msqid↓msgsnd 发送 mtype + 正文↓msgrcv 按 msgtyp 选择并取走消息↓msgctl 查询、修改或 IPC_RMID 删除队列消息队列交付文本↓Format 补时间与 PID↓SaveFile 追加落盘↓BackupFile 判断阈值↓。

2026-09-13 10:14:23 483 9

原创 【System V 信号量】从 P/V 原语到 Builder 封装:写出可控、可清理的进程互斥组件

P 操作申请资源许可,资源不足时等待;V 操作归还许可,并可能使等待者具备继续运行的条件。两者必须由同步实现保证原子性。这次 System V 信号量实验,表面上是在父子进程之间保护两次printf抽象层:P / V 与资源许可↓内核层:信号量集、等待队列与 undo 调整↓接口层:ftok、semget、semctl、semop↓设计层:Builder、RAII、创建/连接分流与删除权ftok 生成 key↓创建者用 semget + IPC_EXCL 建立集合↓。

2026-09-13 10:08:54 411 8

原创 【mmap 进程间通信】从共享内存到跨进程唤醒:用互斥锁、条件变量控制多个进程

这份 mmap 进程间通信实验,表面上只有一个共享字符串和几次唤醒,背后却把虚拟内存、IPC 和并发控制连在了一起。服务端 shm_open 创建命名对象↓ftruncate 设置 SharedState 大小↓双方用 MAP_SHARED 映射同一后端页↓同步原语放入共享区,并设为 PROCESS_SHARED↓客户端持锁写命令、递增 version、broadcast↓工作进程醒来后重新竞争锁,并用 while 检查 version↓每个进程复制命令,再判断自己是否应该行动。

2026-09-12 10:40:15 266 12

原创 【mmap 文件 LRU 缓存】把大文件按页装入内存:从哈希表 + 双向链表到可运行的 C++17 实现

从表面看,这个项目只是把 LRU 的 value 换成了mmap地址;真正实现后,会发现它同时连接了容器复杂度、资源所有权和虚拟内存三条主线。接收任意逻辑偏移↓检查 0 <= offset < file_size↓按运行时页大小向下对齐↓哈希表查询对齐块├── 命中:splice 到链表头部└── 未命中:计算尾块长度并 mmap↓插入头部与哈希索引↓超容量则删除尾部↓节点析构自动 munmap↓返回 mapped_base + offset_in_block。

2026-09-12 10:27:00 408 10

原创 【Linux mmap 文件映射】从虚拟地址到页缓存:读写文件、匿名映射与极简 malloc

PROT_READ:允许读;PROT_WRITE:允许写;PROT_EXEC:允许执行;PROT_NONE:暂时不可访问。权限既要符合业务意图,也要与文件打开方式兼容。例如,对文件建立可写MAP_SHARED映射时,描述符通常必须以O_RDWR打开;否则mmap可能以EACCES失败。安全上应遵循最小权限原则:只读数据不要添加PROT_WRITE,普通数据不要添加PROT_EXEC。文件长度通常不是页大小的整数倍。[0, 4096) 完整页[4096, 8192) 完整页。

2026-09-09 15:55:36 274 15

原创 全网最实用 LaTeX 安装与使用教程(2026 版):TeX Live、TeXstudio、Overleaf 从零到第一份 PDF

选定 XeLaTeX 编译器。成功编译第一份中文文档。遇到错误时先读第一条报错信息。当你完成这三步,后面的图片、表格、公式和参考文献,都只是逐项添加功能。与其一开始背完所有命令,不如先把最小示例跑起来,再把自己的论文内容一点点迁移进去。如果你只是想马上开始,打开 Overleaf;如果你准备长期写论文,装好 TeX Live 和 TeXstudio。两条路线都能得到同样专业、稳定的 PDF。

2026-09-08 13:16:08 943 6

原创 【Makefile 进阶】从自动发现源文件、模式规则到目录分离与多模块递归构建

wildcard 扫描真实源文件↓foreach 跨模块汇总文件列表↓patsubst 把 .c 映射成 objs/.../*.o↓模式规则复用一条编译逻辑↓$< 提供输入,$@ 提供输出,$^ 提供全部链接依赖↓$(dir $@) 创建目标父目录↓addprefix 生成 -I 搜索路径↓-MMD -MP 生成 .d,补齐头文件依赖↓顶层 Makefile 用 $(MAKE) -C 编排子模块↓make 根据依赖图和时间戳完成增量、并行构建。

2026-09-05 20:17:12 458 9

原创 【C++类和对象(下)深度解析】从初始化列表、类型转换与静态成员到友元、内部类和拷贝消除

🔥 星光编译者 · 个人主页📚 学习专栏: 《C/C++ 成长笔记》 · 《Linux 实践手册》 · 《数据结构与算法》🌄 向云端飞扬,编译属于自己的代码星河。  你好,这里是 星光编译者。  这里记录我在 C/C++、Linux、数据结构与算法 学习中遇到的真实问题、亲手验证过的代码,以及那些容易被忽略的实现细节。  比起简单罗列结论,我更愿意从问题出发,把一个知识点的来由讲清楚,把“为什么会这样”和“应该怎样解决”说明白,让每一次踩坑都沉淀成可以复用的经验。  如果这篇记录能帮你少绕一点路,或让

2026-09-04 10:08:57 559 11

原创 【C++ 类和对象(中)下篇】运算符重载、拷贝赋值、日期类实战与 const 成员

本文可以归纳为四条主线。

2026-09-02 13:35:57 373 11

原创 【C++ 类和对象(中)上篇】默认成员函数:构造、析构、拷贝构造与深浅拷贝

public:private:private:创建时,两个Stack成员会分别调用自己的默认构造。MyQueue不需要重复编写“如何初始化 Stack”的细节。如果类存在成员之间的内部指针、缓存、注册关系、外部句柄或“复制后必须重新绑定”的不变量,默认逐成员拷贝可能仍不够。private:// 可能指向 data_ 内部直接复制后,selected_可能仍指向源对象的data_。因此判断标准不是“成员都是标准库类型就永远安全”,而是复制后整个对象的不变量是否仍成立。

2026-09-01 18:52:23 443 10

原创 【C++类和对象(上)】从类的定义、封装与对象模型到内存对齐和 this 指针

int year;int month;int day;// 语法允许,但这个状态通常没有业务意义public:private:int _year;int _month;int _day;此时,Date不只描述“有三个整数”,还规定了对象能够提供什么操作、哪些状态不能被外部随意破坏。把数据、操作和访问规则组织成一个完整类型。int _month;int _day;

2026-08-30 20:35:28 784 9

原创 【C++入门基础(上)】从发展历程、学习路线到命名空间与输入输出

从 C 的效率与控制能力出发↓C++ 通过标准化持续演进为多范式语言↓教程负责建立路径,参考手册负责查询,标准负责精确定义↓源文件经过预处理、编译、汇编和链接形成程序↓命名空间给名称建立边界,限定名让来源清晰↓cin/cout 通过类型化的流完成输入输出↓从第一天开始关注警告、错误阶段、输入失败和可移植性现代 C++ 不只是“C 加上类”,而是一门支持多种编程范式的系统级语言;标准版本、编译器支持和项目启用的语言模式是三件不同的事;

2026-08-28 12:08:48 598 10

原创 【C++入门基础(下)】默认参数、函数重载、引用、inline 与 nullptr

add(1, 2);// int 版本// double 版本// string 版本// f.h// 只有声明// f.cpp// 定义只在这个翻译单元可见另一个翻译单元调用f时看不到可达定义,不满足内联函数的使用要求。问题的根源不是“展开后绝对没有函数地址”,而是需要使用该内联函数的定义域必须能看到相应定义。通常把完整定义放在头文件中。public:private:“放在头文件”背后的原因并不完全相同:内联函数依赖多定义与可达定义规则;模板还涉及按需实例化。

2026-08-28 12:08:28 472 5

原创 【C++ string 上篇】从字符串基础到容量管理、迭代器与经典算法题

这里npos恰好会通过无符号回绕得到正确结果,但这种技巧可读性不高,而且遇到尾随空格就失败。--end;C 字符串需要手工维护缓冲区与终止字符↓std::string 封装字符序列和资源生命周期↓size 描述有效字符,capacity 描述可用空间↓reserve 预留容量,resize 改变有效长度↓下标、迭代器和范围 for 完成遍历↓find/rfind 定位,substr 提取,npos 表示失败↓。

2026-08-27 11:50:45 476 9

原创 【C++ string 下篇】从浅拷贝陷阱到深拷贝、copy-and-swap 与模拟实现

对象不变量是:每个对外可观察的成员函数开始和结束时,都必须成立的条件。对教学版String2. 正常持有存储时,data_ 指向 capacity_ + 1 个 char4. [0, size_) 保存有效字符5. 移动后的特殊空状态允许 data_ == nullptr6. 若 data_ == nullptr,则 size_ == 0 且 capacity_ == 0读取函数:不破坏不变量修改函数:完成操作后恢复不变量失败路径:原对象仍满足不变量析构函数:只释放自己拥有的资源。

2026-08-27 11:50:32 417 4

原创 【C++模板初阶】从泛型编程到函数模板、类模板与编译期实例化

返回类型 函数名(参数列表) {// 函数体int a = 10;int b = 20;这里需要警惕返回引用的生命周期。若向这个版本传入临时对象,返回引用可能在完整表达式结束后悬空。首先是一个函数模板定义,不是某个确定签名的普通函数。// 仅用于帮助理解,不是要求编译器真的生成这段源码 int Add < int >(int left , int right) {int概念含义函数模板生成一族函数的规则或蓝图模板实参代入模板参数的具体类型或值函数模板特化。

2026-08-24 12:10:10 290 2

空空如也

空空如也

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

TA关注的人

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