自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 17 别只知 “多态” 不知其然!C++ 虚函数机制 + 编译时多态 + 重写 / 隐藏 / 重载区别全解

摘要:多态是C++面向对象编程的核心特性,分为编译时多态(函数重载/模板)和运行时多态(虚函数机制)。实现运行时多态需满足:基类指针/引用调用虚函数,且派生类完成虚函数重写。虚函数重写需保持函数签名一致,但存在协变特例(返回值类型可不同)。基类析构函数应声明为虚函数以避免多态删除时的内存泄漏。C++11引入override/final关键字增强安全性,纯虚函数(=0)强制派生类实现抽象接口。多态与函数隐藏、重载的区别在于作用域规则,虚函数默认参数采用静态绑定需特别注意。

2025-09-07 15:15:29 389

原创 16 从 C 到 C++:用结构体模拟 “继承”+C++ 继承全解析(切片 / 权限 / 静态成员 / 不可继承类)

本文介绍了C语言中如何用数据容器存储不同结构体对象的方法,通过结构体嵌套和类型转换实现类似继承的效果。同时讲解了C++继承的基本概念和实现方式,包括访问权限变化、作用域规则、默认成员函数生成等。重点分析了派生类与基类间的转换关系,解释了切片现象,并展示了如何通过继承实现代码复用。最后讨论了不能被继承的类实现方法,以及静态成员和友元在继承中的特性。

2025-09-06 10:52:10 811

原创 15 C++ 模板深度进阶:非类型参数使用注意点 + 模板特化实战 + 编译问题完美解决

本文介绍了C++模板的进阶应用,主要包括非类型模板参数和模板特化两大主题。非类型模板参数使用常量作为模板参数,但需注意编译期确定性和类型限制。模板特化分为函数模板特化和类模板特化,用于处理特殊类型的情况,其中类模板特化包括全特化和偏特化(部分特化和参数限制特化)。文章还讨论了模板分离编译问题,建议将声明和定义放在同一文件中(如.hpp文件)。这些技术能有效解决模板在特定场景下的问题,提升代码的灵活性和正确性。

2025-09-05 10:32:52 521

原创 14 C++ STL 容器实战:stack/list 模拟实现指南 + priority_queue 用法及避坑技巧

本文介绍了栈(stack)和队列(queue)的模拟实现及应用。栈可通过vector实现,支持push、pop等操作,应用于逆波兰表达式计算;队列因涉及头删尾插,更适合用list实现。优先级队列(priority_queue)基于堆结构,默认使用vector容器构建小堆(堆顶最小),可通过greater比较器创建大堆。堆遍历输出时小堆为降序、大堆为升序。处理自定义类型需重载比较运算符,如日期类需实现<和>操作符以支持堆排序。优先级队列典型应用包括TopK问题,通过维护K个元素的堆结构高效获取前K

2025-09-05 10:02:03 202

原创 17 C 语言宏进阶必看:从宏替换避坑到宏函数用法,不定参数模拟实现一次搞定

本文详细介绍了C语言预处理的相关知识,主要包括预定义符号和宏定义的使用。预定义符号如__FILE__、__LINE__等可在编译时获取文件信息;宏定义(#define)用于文本替换,可定义常量、带参数宏和复杂表达式。文章重点讲解了宏替换规则、宏与函数的区别、#和##运算符的使用技巧,以及可变参数宏的实现方法。通过大量示例说明了宏定义中的常见问题和注意事项,如括号使用、参数类型无关性、字符串化和符号拼接等特性,帮助开发者正确使用预处理功能提高代码效率。

2025-09-04 09:55:38 1057

原创 16 为什么文件内容没写入?C 语言文件操作函数避坑 + 注意点,缓冲区机制讲清楚了

文章摘要:本文系统介绍了C语言文件操作的核心概念。主要内容包括:1)文件分类(文本文件和二进制文件)及其存储方式的差异;2)文件指针(FILE*)的作用机制;3)文件打开关闭操作(fopen/fclose)及模式选择;4)文件读写函数分类及使用场景;5)随机读写操作(fseek/ftell);6)文件结束判定方法;7)文件缓冲区的原理及刷新策略(行刷新、满刷新等)。特别强调了文本与二进制模式在Windows/Linux系统的差异,以及缓冲区管理的重要性。

2025-09-03 16:49:38 1009

原创 15 从动态分配到内存布局:C 语言动态内存函数用法 + 柔性数组实战 + C/C++ 内存分布图全梳理

动态内存管理是C语言中重要的内存分配方式,它允许程序在运行时根据需要申请和释放内存。主要函数包括: malloc - 分配未初始化内存 calloc - 分配并初始化为0的内存 realloc - 调整已分配内存大小 free - 释放动态内存 使用注意事项: 必须检查分配是否成功 避免内存泄漏和重复释放 推荐使用临时指针接收realloc结果 释放后应将指针置NULL 柔性数组是C99特性,允许结构体最后包含一个未指定大小的数组,必须通过动态内存分配使用。 动态内存管理提高了程序的灵活性,但也需要谨慎使用

2025-09-02 20:17:17 1031

原创 14 为什么联合体大小不是成员总和?C 语言联合体计算原理 + 枚举使用 + 注意事项梳理

联合体和枚举类型摘要:联合体(共用体)所有成员共享同一内存空间,大小由最大成员决定,同一时间只能存储一个成员值,修改任一成员会覆盖其他成员。枚举类型用于列举有限取值,默认从0开始递增,可显式赋值。相比#define,枚举具有类型检查、可调试性等优势,应优先使用。联合体需注意内存覆盖、初始化限制和字节序问题,枚举类型建议使用定义常量而非整数赋值。二者都能提升代码可读性和维护性。

2025-09-02 20:00:55 1007

原创 13 C 语言 struct 实战手册:位段用法详解 + 结构体内存对齐计算 + 关键注意事项

本文主要介绍了数据存储中的大小端字节序和结构体相关知识。大小端字节序指数据在内存中的存储顺序,大端模式将数据高位存储在低地址,小端模式相反。文章通过代码示例演示了如何判断当前机器的字节序模式。在结构体部分,详细讲解了结构体的声明、定义、特殊声明、自引用方式,重点分析了结构体内存对齐规则及其原因(用空间换时间),并给出了优化结构体空间的方法。最后介绍了位段的概念、内存分配方式和跨平台问题,指出位段虽节省空间但存在可移植性风险。文章通过丰富示例和内存布局分析,帮助读者深入理解这些底层编程概念。

2025-09-02 10:53:07 1014

原创 12 为什么 memmove 能处理重叠内存?C 语言 memcpy/memmove 用法 + 模拟 + memset/memcmp 避坑

文章摘要:本文介绍了C语言中4个内存操作函数的使用和实现原理。1. memcpy函数用于内存复制,不处理重叠区域,需注意边界问题;2. memmove函数可处理重叠区域的内存复制,通过临时缓冲区或逆向复制实现;3. memset函数用于内存块初始化,可快速设置特定值;4. memcmp函数用于内存块比较,按字节比较大小。文中包含各函数的声明、参数说明、注意事项、使用示例以及模拟实现代码,特别强调了memcpy和memmove在处理内存重叠时的区别。

2025-09-02 09:21:19 722

原创 13 选 list 还是 vector?C++ STL list 扩容 / 迭代器失效问题 + 模拟实现,对比后再做选择

本文主要介绍了C++ STL中list容器的底层实现原理及特性。list采用双向循环链表结构,通过哨兵节点连接首尾形成环形,支持高效插入删除(O(1))但不支持随机访问。重点分析了迭代器失效问题,指出删除操作会导致当前迭代器失效,并给出了正确使用方法。与vector对比,list在频繁插入删除场景下性能更优,但空间利用率较低。最后提供了list的模拟实现代码链接。

2025-09-01 10:11:15 1182

原创 12 避坑 C++ STL!string 与 vector 使用注意点:扩容陷阱 + 迭代器失效 + 模拟实战,一篇搞定

本文主要介绍了C++ STL中string和vector类的关键知识点。在string类部分,讲解了C++11的auto关键字用法、string的扩容机制(1.5倍增长)及其模拟实现要点,包括底层维护的成员变量和构造函数的注意事项。vector类部分重点分析了不同编译器的扩容差异(VS 1.5倍,g++ 2倍)、迭代器失效问题(特别是erase操作后需要更新迭代器)以及深拷贝问题(避免使用memcpy)。文章还提供了两个类的模拟实现源码链接,强调了实际开发中需要注意的细节,如string的\0处理、vect

2025-09-01 09:52:17 848

原创 11 C++ 泛型编程基础指南:函数模板 / 类模板实战 + 显式 / 隐式实例化核心注意点

文章摘要:泛型编程通过模板实现代码复用,解决函数重载的冗余问题。函数模板允许编译器根据实参类型自动生成特定版本函数,支持隐式/显式实例化。类模板需显式指定类型参数,实例化后形成独立类型。模板遵循优先匹配原则,不支持自动类型转换,且相同模板参数仅实例化一次。注意类模板成员函数应在头文件中定义以避免链接错误。(149字)

2025-08-31 09:34:35 817

原创 11 C 语言 sizeof 与指针实战指南:一维 / 二维数组计算注意事项 + 笔试真题解析 + sizeof strlen 对比

本文详细对比了sizeof和strlen在C语言中的区别:sizeof是操作符,计算操作数所占内存大小(字节);strlen是库函数,统计字符串长度(\0前的字符)。通过多个数组和指针示例,演示了它们在字符数组、指针变量、二维数组等不同场景下的运算结果差异。重点分析了数组名的三种含义(整个数组、首元素地址、数组指针),并解析了指针运算的典型笔试题,包括结构体指针运算、逗号表达式初始化数组、指针类型转换等常见考点。

2025-08-30 17:30:00 339

原创 12 C 语言字符串函数进阶:从 strlen 到 strtok 的实用技巧,再手把手教你模拟实现核心函数

本文摘要:C语言字符串处理函数详解,包括字符分类函数(islower等)、字符转换函数(tolower/toupper)、字符串操作函数(strlen/strcpy/strcmp/strstr/strtok/strerror)的使用方法及模拟实现。重点介绍了:1)字符检测与转换;2)字符串长度计算;3)字符串拷贝注意事项;4)字符串比较规则;5)子串查找;6)字符串分割;7)错误码转换。每个函数都包含使用示例和实现要点,特别强调缓冲区安全、空指针检查等编程规范。

2025-08-30 17:30:00 780

原创 10 从面试考点到实战:C++ NULL 与 nullptr 区别 + malloc/calloc/realloc 对比 + new/delete 原理 + 定位 new 用法

摘要:本文深入解析C/C++内存管理中的关键概念。在C++中,NULL和nullptr的区别体现在类型安全、重载行为和模板推导等方面,nullptr(C++11引入)解决了NULL可能导致的类型安全问题。内存分布方面,详细介绍了栈、堆、数据段等区域的特点。对比了C语言(malloc/calloc/realloc)和C++(new/delete)的内存管理方式,重点说明new/delete对自定义类型会调用构造/析构函数的特性。还探讨了operator new/delete的实现原理。

2025-08-29 10:02:44 1039

原创 10 搞定这些才算会 C 语言!数组传参(一维 / 二维)本质 + 函数指针 + qsort 回调函数实战

本文深入探讨了C语言中指针与数组的核心概念,重点解析了数组名与指针的关系、数组传参本质、函数指针等关键知识点。主要内容包括:1)数组名在sizeof和&操作中的特殊含义;2)一维数组传参本质是传递首元素地址;3)字符指针与字符数组的区别;4)数组指针变量和指针数组的定义与使用;5)二维数组传参本质;6)函数指针变量及其应用;7)qsort函数的使用及回调函数原理。通过代码示例和类型解析,揭示了指针操作的内存访问机制,为深入理解C语言内存管理提供了重要参考。

2025-08-28 20:53:34 901

原创 9 从 “内存怎么存” 到 “指针怎么用”:计算机内存编址机制 + C 语言指针核心 + memory 模拟实现

【摘要】本文系统讲解了计算机内存编址机制和指针的核心概念。内存编址通过硬件设计实现,32位系统地址总线可寻址2^32个位置。指针变量大小取决于平台(32位4字节/64位8字节),指针类型决定解引用权限和步长。重点分析了const修饰指针的两种形式、指针运算规则及野指针防范措施,并介绍了assert断言的使用场景。文章还深入探讨了void*指针的泛型特性、指针类型转换的实际应用(如memcpy实现原理)以及指针关系运算的注意事项,为理解内存管理和指针操作提供了全面指导。

2025-08-28 19:48:06 570

原创 9 搞懂这三点,C++ 代码效率翻倍!临时变量解析 + 匿名对象用法 + 拷贝构造优化

C++临时变量与匿名对象核心特性总结:1.匿名对象是未命名的临时变量,生命周期仅限当前行;2.临时变量由编译器自动创建,具有常性、短生命周期和右值特性;3.常见于函数返回值、类型转换、运算符表达式等场景;4.生命周期可通过const引用或右值引用延长;5.使用时需注意悬垂引用陷阱,建议优先使用const引用接收临时对象;6.C++17起可利用返回值优化避免拷贝开销。这些特性对编写高效安全的C++代码至关重要。

2025-08-28 17:54:06 390

原创 8 C 语言硬核知识点汇总:VS 调试实战技巧 + 操作符深层解析 + 原反补码 & 整形提升完全指南

本文主要介绍了VS调试技巧和C语言操作符详解两大部分内容。在调试技巧部分,重点讲解了Debug与Release版本的区别,常用调试快捷键(F5/F9/F10/F11等)的使用方法,以及监视窗口的操作。在操作符部分,详细分类介绍了各类操作符,包括算术、移位、位、赋值等操作符,并深入讲解了二进制转换、补码计算原理。文章还通过实例演示了如何利用位操作实现变量交换,分析了整型提升机制及其在CPU运算中的重要性。最后总结了操作符的优先级规则和表达式求值中的整型提升问题。

2025-08-28 10:09:59 597

原创 8 别再混淆友元和静态成员!C++ 友元函数 / 友元类 / 内部类实战指南 + 与静态成员函数对比

C++友元机制与内部类解析 摘要:友元机制通过friend关键字突破类的封装限制,分为友元函数和友元类。友元函数可访问类的私有成员,但不属于类成员;友元类中所有函数均可访问另一类的私有成员。友元关系是单向且不可传递的。相比之下,静态成员函数无法直接访问实例私有成员。内部类是声明在另一类内部的独立类,默认成为外部类的友元类,常用于紧密关联的类设计。内部类受外部类作用域限制,可访问外部类静态成员,实现更灵活的封装。友元虽便利但增加耦合,应谨慎使用。

2025-08-28 00:22:18 413

原创 7 别再只会用构造函数!C++ 初始化列表与静态成员的 “神级配合“,附单例模式实战

该摘要总结了C++初始化列表和静态成员的关键知识点:1.初始化列表规则:每个成员变量只能出现一次,引用/const成员必须初始化,C++11支持缺省值;2.初始化顺序按声明顺序而非列表顺序;3.静态成员变量需类外初始化,被所有对象共享;4.静态成员函数无this指针,只能访问静态成员;5.通过单例模式示例展示了静态成员的应用,包括饿汉模式(程序启动创建)和线程安全的懒汉模式(首次访问时创建)。

2025-08-27 18:14:38 1454

原创 7 不止讲函数!C 语言 static/extern 关键字的 “隐藏用法”,这篇帮你挖到位

【摘要】本文系统讲解了C语言函数相关核心概念:1.形参是函数定义时的形式参数,仅在调用时实例化,与实参分属不同内存空间;2.函数压栈机制详细解析了调用栈、栈帧结构及参数传递过程,说明其支持递归和隔离作用域的特性;3.return语句的使用规则,包括返回值类型转换、void函数返回及执行控制;4.数组传参要点,强调形参数组与实参数组共享内存,以及不同维度的参数声明规范;5.函数声明与定义的关系,推荐头文件声明的最佳实践;6.static和extern关键字的三种应用场景,着重分析static修饰局部变量对生命

2025-08-27 11:16:08 741

原创 6 C++操作符重载进阶:当‘&‘遇上成员函数时发生了什么?

本文系统讲解了C++中函数重载和操作符重载的核心要点。重点包括:1)重载参数个数规则(一元/二元运算符);2)成员函数重载()的多种参数形式;3)前置/后置++重载区分方法;4)流运算符重载需设为全局函数及访问私有成员的解决方案;5)成员函数指针的特殊语法;6)赋值运算符重载的深/浅拷贝问题;7)const成员函数的特性及重载区分;8)取地址运算符重载的应用场景。文章通过代码示例详细说明了各类重载的使用方法和注意事项,为C++运算符重载提供了全面的实践指导。

2025-08-26 19:57:22 1052

原创 6 进阶 C 语言数组:sizeof 计算的 3 个核心场景(数组名 / 一维数组 / 二维数组),新手也能懂

本文主要介绍了C语言中一维和二维数组的使用注意事项。一维数组部分重点讲解了变长数组的特性(C99后支持)、数组初始化的多种方式(完全/不完全初始化)、数组名作为首元素地址的特性,以及sizeof计算数组大小的方法。二维数组部分阐述了其以一维数组为基本单位的内存连续存储特性,详细说明了不同初始化方式、内存布局特点,并分析了数组名在不同上下文中的含义差异。特别强调了sizeof操作符对数组名称的特殊处理规则,以及如何通过sizeof计算数组元素个数。文章还指出VS2022对C99变长数组支持不足的问题。

2025-08-26 10:37:59 716

原创 5 C++ 类和对象之构造函数

本文介绍了C++类的5种默认成员函数,重点阐述了构造函数、析构函数和拷贝构造函数的特性与使用注意事项。构造函数用于初始化对象,支持重载但需注意默认构造函数的存在规则;析构函数自动调用进行资源清理,不可重载且抽象类应设为虚函数;拷贝构造函数实现对象复制,需注意参数传递方式及浅拷贝问题。文中通过代码示例说明了这些函数的正确使用方式,并强调了在多态和资源管理场景下的关键设计要点。

2025-08-25 13:03:21 715

原创 5 分支与循环介绍及注意点附带rand函数介绍及使用

C语言中rand()函数生成的是伪随机数,其序列由种子值决定,默认种子为1。通过srand(time(NULL))使用时间戳作为种子可增强随机性。文章还介绍了条件语句、循环结构、逻辑运算符的使用注意事项,包括if-else的匹配规则、关系运算符的短路特性、switch-case中的break作用域问题等。此外,对比了break和continue的区别,并说明了goto语句在多层循环跳出时的特殊用途。最后讲解了如何将时间戳转换为本地时间格式字符串。

2025-08-25 10:20:00 789

原创 4 C++ 类和对象进一步认识及相关注意点

本文摘要主要介绍了C++中类与结构体的异同点及关键特性: C++中struct升级为类,可包含函数,成员默认public,而class成员默认private; 成员函数默认为内联函数,类外定义需使用作用域操作符; 类对象大小计算规则与结构体相同,空类占1字节用于标识对象存在; 成员函数通过隐式this指针访问成员变量,所有对象共享成员函数; this指针在函数调用时隐式传递,不能显式修改,空指针访问成员变量会导致崩溃; 成员函数可访问各类成员变量和全局变量,但无法直接访问其他对象的私有成员。 (150字)

2025-08-24 10:32:00 793

原创 3 引用及inline函数注意点

inline不建议声明和定义分离到两个⽂件,分离会导致链接错误。因为inline被展开,就没有函数地址,链接时会出现报错。

2025-08-24 10:16:38 674

原创 4 printf&scanf库函数注意点和使用

printf() 的作⽤是将参数⽂本输出到屏幕。它名字⾥⾯的 f 代表 format (格式化),表⽰可以 定制输出⽂本的格式。

2025-08-24 00:25:06 489

原创 2 C++之缺省参数及函数重载注意点

• 全缺省就是全部形参给缺省值,半缺省就是部分形参给缺省值。C++规定半缺省参数必须从右往左 依次连续缺省,不能间隔跳跃给缺省值。 • 带缺省参数的函数调⽤,C++规定必须从左到右依次给实参,不能跳跃给实参。因为参数匹配实参是从左往右开始匹配的。 • 函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须函数声明给缺省 值。3函数重载C++⽀持在同⼀作⽤域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数个数不同或者 类型不同。这样C++函数调⽤就表现出了多态⾏为,使⽤更灵

2025-08-23 09:57:35 252

原创 C++之命名空间域及参考文档

定义命名空间,需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中 即为命名空间的成员。命名空间中可以定义变量/函数/类型等。• namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,不同的域可以定义同名变量,所以下 ⾯的rand不在冲突了。• C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。==局部域和全局域除了会影响==

2025-08-23 09:51:29 440

原创 3 算术,赋值,单目操作符

C语言中的算术操作符包括加减乘除和取模运算(+ - * / %)。整数除法会舍弃小数部分,要得到浮点结果至少需要一个浮点操作数。取模运算%仅适用于整数,结果符号由第一个操作数决定。赋值操作符支持复合赋值(如+=)和连续赋值。单目操作符++和--分别表示自增和自减,分为前置(先运算后赋值)和后置(先赋值后运算)两种形式。注意整数除法与浮点数除法的区别,以及取模运算对操作数类型的限制。

2025-08-22 19:51:04 297

原创 C语⾔数据类型和变量

C语言数据类型与变量摘要 本文介绍了C语言中的基本数据类型和变量概念。主要内容包括:1.字符型(char)、整型(int)、浮点型等数据类型的分类及存储方式,重点讲解了负数的补码计算方法;2.布尔类型在C99中的引入;3.sizeof操作符的用法及特性;4.数据类型的符号问题和取值范围;5.变量的创建、初始化及分类(全局变量和局部变量),以及extern关键字的使用。文章还说明了不同整型类型的存在意义,以及如何通过头文件查询各类型的取值范围,为程序员选择合适的数据类型提供了参考。

2025-08-22 19:40:12 783

原创 1 C语言初步认识

C语⾔中有⼀批保留的名字的符号,⽐如: int 、 if 、 return ,这些符号被称为保留字或者关键 字。• 关键字都有特殊的意义,是保留给C语⾔使⽤的 • 程序员⾃⼰在创建标识符的时候是不能和关键字重复的 • 关键字也是不能⾃⼰创建的。

2025-08-22 19:21:52 527

原创 C语言之带你认识结构体不一样的用法!

通过一个很简单的实例说明了怎么通过嵌套同一个结构体对象去管理不同类型的结构体对象,其实这就是多态的思想,其实还有很多用C语言实现多态和继承的玩法,有兴趣的小伙伴可以多去了解了解,虽然说现在有C++,python这种天然支持多态继承的语言,但是对于学习嵌入式的小伙伴来说,这种思想和玩法还是很值的去学习的,上层可以用统一的接口和数据结构去管理不同的设备,底层封装一下具体的实现方法。

2025-06-03 18:42:23 688

原创 C++的“声明优先“原则:让成员函数调用无视物理顺序

c语言要自己声明函数,告诉编译器我后面会实现这个函数,这样编译器在编译阶段就不会就不会报错,后面链接的时候在把对应的函数地址填上。c++中,类成员函数则是在编译阶段编译器首先把对应的成员函数记录在符号表中,告诉编译器这些函数最后都会实现,编译阶段就不会就不会报错,所以可以在类中实现成员函数任意顺序定义加函数复用,最后在链接阶段把对应的函数地址填上。说明:文中提及的编译阶段,链接阶段,符号表等词汇如果大家不太了解,可以先去学习一下编译器如何把源代码编译成一个可执行程序。

2025-05-24 18:45:50 540 1

空空如也

空空如也

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

TA关注的人

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