- 博客(36)
- 收藏
- 关注
原创 今日分享:C++ -- 多态
本文系统介绍了C++多态的核心概念与实现机制。主要内容包括:1)多态的定义与价值,通过买票、扫码红包等案例说明"同一行为不同表现"的特性;2)实现条件,需通过基类指针/引用调用虚函数,且派生类必须重写虚函数;3)虚函数与重写规则,包括协变、析构函数重写等特殊情形;4)override和final关键字的作用;5)抽象类与纯虚函数的接口规范功能;6)多态底层原理,重点解析虚函数表的结构与内存分布;7)静态绑定与动态绑定的区别。文章通过代码示例和内存分析,深入浅出地阐述了多态的实现原理和应用
2025-10-21 22:00:00
657
原创 今日分享C++ ---继承
摘要:本文介绍了C++继承机制及其应用。继承是面向对象程序设计中代码复用的重要手段,允许派生类在基类基础上扩展功能。文章详细讲解了继承定义、访问权限控制(public/protected/private继承)、派生类对象与基类对象的转换规则、作用域与成员隐藏、派生类默认成员函数实现要点等核心概念。特别分析了菱形继承问题及其解决方案(虚继承),对比了继承(is-a)与组合(has-a)的适用场景,建议优先使用组合降低耦合。文中通过示例代码演示了继承的实际应用,帮助读者深入理解这一重要特性。
2025-09-21 23:00:00
1071
3
原创 今日分享:C++ deque与priority_queue
本文介绍了C++中stack、queue和priority_queue的底层实现与使用。重点分析了deque作为stack和queue底层容器的优势:支持高效头尾操作,空间利用率高但遍历效率低。priority_queue默认使用vector容器,通过堆算法实现,支持大堆/小堆结构。文章详细讲解了priority_queue的构造、成员函数及模拟实现,包括仿函数在堆调整中的作用。对于自定义类型,需重载比较运算符才能使用priority_queue。通过具体代码示例展示了这些容器的操作方法,帮助开发者根据需求
2025-09-13 14:09:34
903
1
原创 今日分享:C++ Stack和queue(栈与队列)
本文介绍了C++中的容器适配器stack和queue,重点讲解了它们的概念、使用方法和底层实现原理。stack作为后进先出(LIFO)结构,默认使用deque作为底层容器,支持push、pop、top等操作;queue作为先进先出(FIFO)结构,默认使用deque或list作为底层容器,支持push、pop、front等操作。文章还提供了模拟实现代码,并分析了标准库选择deque作为默认容器的原因。此外,还通过最小栈、栈的弹出压入序列、逆波兰表达式求值等实际案例展示了stack的应用。最后总结了容器适配器
2025-09-08 23:46:06
843
原创 今日分享:C++ string 类模拟实现
我们接下来要实现的string类主要是 其构造 拷贝构造 赋值运算符重载 析构函数。相信坚持下来的你一定有了满满的收获。❤️。
2025-08-26 22:31:31
711
原创 今日分享:C++ string类
这篇文章详细介绍了C++中的string类,包括其基本概念、常用接口和操作方式。string类是basic_string模板类的实例,用于处理单字节字符序列。文章重点讲解了string的构造方法、容量操作(如size、capacity)、访问遍历(如operator[]、迭代器)以及修改操作(如append、erase)。通过代码示例演示了字符串的扩容机制、迭代器使用和常见修改操作。最后提醒读者注意string类与C风格字符串的转换,并建议使用reserve预分配空间以提高效率。整体内容全面,适合C++初学
2025-08-20 00:27:31
762
原创 今日分享:C++模板(全详解)
【C++模板:泛型编程的诗意之美】 C++模板是泛型编程的核心,通过类型参数化实现代码复用。函数模板可自动推导类型生成对应函数,类模板则能创建通用数据结构。模板特化(全特化/偏特化)处理特殊类型场景,而非类型模板参数支持编译期常量。 关键点: 模板分函数模板(template<typename T>)和类模板 实例化方式:隐式(自动推导)和显式(指定类型) 类模板需在类外定义成员函数时添加模板参数列表 分离编译时建议声明与定义放在同一文件 模板像万能模具,让同一套逻辑适配不同数据类型,在严谨与灵
2025-08-15 20:27:51
1020
原创 今日分享:C++内存管理[特殊字符]
【C++内存管理精要】本文生动讲解了C++内存管理的核心知识:1. 内存五大分区:栈(函数局部变量)、堆(动态分配)、数据段(全局/静态变量)、代码段和内存映射段,通过实例题巩固理解。2. 动态内存操作对比:C语言(malloc/free)与C++(new/delete)的关键差异,特别是new/delete会调用构造/析构函数。3. 底层机制:揭秘operator new通过malloc实现空间申请,失败时抛出异常的特性。4. 内存泄漏:明确其危害(系统性能下降)及防范措施(RAII/智能指针)。全文贯穿
2025-08-13 16:35:55
922
原创 C++编程之旅-- -- --static成员+友元+内部类(全详解)
本文介绍了C++中static成员、友元和内部类的特性与应用。static成员属于类而非对象,需在类外初始化,常用于对象计数;友元(函数/类)可突破封装访问私有成员,但会破坏封装性;内部类是定义在另一个类中的独立类,可访问外部类的静态成员。这些机制提供了灵活的类间交互方式,但需谨慎使用以避免过度破坏封装性。文章通过代码示例展示了各类特性的具体用法和注意事项,帮助开发者理解这些高级面向对象编程概念。
2025-08-13 00:01:52
689
原创 C++编程之旅-- -- --默认成员函数(全详解)
如果一个类是没什么也没有,就叫做空类。空类并非什么也没有,它占一个字节。编译器会自动生成6个默认成员函数。默认成员函数:指没有显式实现(自己写),编译器生成的成员函数。
2025-08-08 23:54:06
964
原创 C++编程之旅-- -- --类与对象的奇幻征途之初识篇(一)(了解类的基本用法,计算类大小,分析this指针)
本文介绍了C++中类的基本概念和使用方法。主要内容包括: 面向对象与面向过程的区别:C++通过对象交互组织程序,隐藏实现细节 类的定义方式:使用class关键字,包含成员变量和成员函数 访问限定符的作用:public、protected、private实现封装 类的作用域和实例化:使用::操作符定义成员,类实例化后才分配内存 类对象大小计算:主要计算成员变量总大小,考虑内存对齐 this指针:编译器自动生成的隐含参数,指向当前对象 文章通过洗衣服等生活实例和代码示例,帮助理解面向对象编程思想,并详细说明了类
2025-08-08 17:11:36
611
原创 C++编程之旅-- -- --始探门庭的求知漫溯(二)
本文介绍了C++中引用、内联函数和auto关键字的使用。引用是变量的别名,必须初始化且不能更改指向,常用于函数参数和返回值以提高效率。内联函数通过函数体替换调用来减少开销,适合短小频繁调用的函数,但不适用于递归或过长函数。auto关键字用于自动类型推导,可简化复杂类型声明,但需注意初始化要求和使用限制。这些特性共同提升了C++代码的效率和可读性,替代了传统宏定义的部分功能。
2025-08-06 18:19:40
591
原创 C++编程之旅-- -- --始探门庭的求知漫溯(一)
本文摘要:C++是基于C语言发展而来的面向对象编程语言,由Bjarne Stroustrup于1982年创建。文章介绍了C++的发展历程、63个关键字、命名空间(namespace)的用途及三种使用方法,以及C++特有的输入输出方式(cout/cin)。重点讲解了缺省参数的分类(全缺省/半缺省)和使用规则,并详细阐述了函数重载的概念及其实现原理(通过名字修饰区分同名函数)。C++通过命名空间解决命名冲突,通过函数重载支持同名函数,这些特性使其比C语言更具灵活性和扩展性。
2025-08-04 20:07:38
665
原创 【数据结构】-----排序的艺术画卷
本文介绍了排序的基本概念、应用场景及常见排序算法实现。排序是将记录按关键字大小排列的过程,分为稳定/不稳定、内部/外部排序。排序算法广泛应用于数据处理、成绩管理和商业比较等领域。重点讲解了插入排序(直接插入和希尔排序)、选择排序(直接选择和堆排序)以及交换排序(冒泡排序)的实现原理和特性。这些算法各有特点:直接插入排序在接近有序时效率高,希尔排序通过分组预排序优化性能;选择排序通过找最值元素实现排序;冒泡排序通过相邻元素比较交换实现排序。文章通过代码示例展示了各算法的实现细节,并分析了它们的时间复杂度、空间
2025-08-01 18:53:56
1199
原创 【数据结构】二叉树初阶详解(二):实现逻辑与代码拆解(超详版)
本文介绍了二叉树的基本概念和常见操作实现。二叉树是一种递归定义的数据结构,包含空树或由根节点及其左右子树组成。文章详细讲解了二叉树的各种遍历方式(前序、中序、后序、层序)的递归实现,以及节点个数计算、查找特定值节点、判断完全二叉树等操作的实现方法。所有操作都基于二叉树的递归特性,通过函数递归调用或借助队列(如层序遍历)来实现。代码示例展示了如何使用指针操作和条件判断来处理二叉树的各种情况,包括空树处理、递归终止条件等基本编程技巧。这些操作是理解和应用二叉树数据结构的基础。
2025-07-26 20:08:07
716
原创 【数据结构】二叉树初阶详解(一):树与二叉树基础 + 堆结构全解析
本文系统介绍了树结构及其在计算机科学中的应用,重点讲解了二叉树的概念、特性和实现。首先阐述了树的基本概念和术语,包括根节点、子树、度、层次等。然后详细分析了二叉树的定义、满二叉树和完全二叉树等特殊类型,并推导了二叉树的性质公式。在实现层面,文章对比了顺序存储和链式存储的优缺点,特别强调了堆这种完全二叉树的顺序存储结构,通过图示和代码示例展示了堆的构建、插入、删除等核心操作。最后,文章深入解析了堆调整算法,从最后一个非叶子节点开始向上调整的完整过程,帮助读者掌握将普通数组转化为有效堆结构的关键技术。
2025-07-19 23:15:44
1091
原创 【数据结构】栈和队列
栈的话就到此为止了。只要将头文件与源文件弄好就行了,记得加#include"Stack.h"哟!队列中的各个指针要好好体会,不然很容易让人蒙圈。如果有疑问也可以留言,如果我写的有问题也请大佬指正。
2025-07-17 19:37:27
1064
原创 用 C 语言实现经典扫雷游戏:从底层逻辑到完整代码
ROW 和 COL ,ROWS 和 COLS 控制着棋盘大小 ,与棋盘上标志着坐标。EASY_COUNT 控制着雷的数量。int i = 0;for (i = 0;i < rows;for (j = 0;j < cols;j++)printf("--------扫雷------\n");int i = 0;for (i = 0;i <= col;i <= row;for (j = 1;
2025-07-11 16:23:14
862
原创 三子棋游戏设计与实现(C 语言版)
摘要:本文介绍了一个基于C语言实现的人机对战三子棋游戏。采用模块化设计,将功能分为数据层(二维数组存储棋盘)、逻辑层(初始化/落子/胜负判断)和交互层(菜单控制)。电脑AI具有三种策略:优先获胜、封堵玩家、随机落子。游戏支持胜负判断(行/列/对角线三连)、平局检测、战绩统计和再玩选项。通过多文件组织实现工程化,使用彩色输出增强交互体验。核心算法包括随机数生成、棋盘状态检测和智能决策,完整呈现了从需求分析到代码实现的全过程。(149字)
2025-07-10 16:22:24
1028
原创 【数据结构】顺序表和链表
概念:链表是一种物理存储上非连续、非顺序的数据结构,其数据元素的逻辑顺序是通过节点间的指针链接实现的。4.注意:慎用assert断言。顺序表、链表、栈、队列和字符串。3.静态顺序表 ,动态顺序表。物理存储结构并不要求连续。2.功能:增删查改。2.功能:增删查改。
2025-07-06 00:28:22
947
原创 【数据结构】时间复杂度与空间复杂度
本文介绍了算法效率的评估标准,重点分析了时间复杂度和空间复杂度。时间复杂度衡量算法执行速度,使用大O渐进表示法,常见复杂度包括常数阶O(1)、线性阶O(n)、对数阶O(logn)、平方阶O(n²)和指数阶O(2ⁿ)等。空间复杂度衡量算法临时占用存储空间大小,同样采用大O表示法。通过多个案例(如冒泡排序O(n²)、二分查找O(logn)、递归阶乘O(n)、斐波那契递归O(2ⁿ)等)具体说明了复杂度计算方法,并强调评估时应考虑最坏情况。空间复杂度分析则关注算法运行中额外申请的空间,如递归调用栈空间O(n)或动态
2025-07-04 21:12:39
986
原创 程序环境和预处理
摘要:本文详细介绍了C语言程序的编译执行过程,包括翻译环境和执行环境。翻译环境通过预处理、编译、汇编和链接四个阶段将源文件转换为可执行程序,其中链接器整合目标文件和库文件。执行环境涉及程序载入、启动、运行和终止。文章还讲解了预定义符号(如__FILE__、LINE)、预处理指令(如#define宏定义、条件编译)的使用方法和注意事项,包括宏函数的安全编写、#和##操作符的应用,以及如何避免宏的副作用和头文件重复包含问题。这些知识对理解C程序编译机制和编写健壮代码至关重要。
2025-06-30 23:14:24
692
原创 C语言文件操作
摘要:本文介绍了文件的基本概念、分类及操作方式。文件可分为程序文件(如.c、.obj、.exe)和数据文件,由路径、主干和后缀组成文件名。文件类型包括文本文件和二进制文件,分别以ASCII字符和二进制形式存储。文件操作涉及缓冲区、文件指针(FILE结构体)及打开/关闭函数(fopen/fclose),不同打开模式(r/w/a等)对应不同操作权限。文件读写分为顺序读写(fgetc/fputc等)和随机读写(fseek/ftell等),文件结束需通过返回值而非feof预判。文本文件用EOF/NULL判定结束,二
2025-06-27 23:23:43
678
原创 字符(串)函数与内存函数。
本文介绍了C语言中常用的字符串处理函数和内存操作函数。主要内容包括:1. 字符串函数:strlen(求长度)、strcpy(复制)、strcat(连接)、strcmp(比较)、strstr(查找子串)、strtok(分割)等,详细说明了函数原型、使用注意事项并提供了模拟实现代码;2. 字符分类和转换函数;3. 内存操作函数:memcpy(内存复制)、memmove(安全内存移动)、memcmp(内存比较),分析了函数特性和实现原理。文章通过生动的语言讲解了这些"宇宙究极无敌"的函数,强调
2025-06-24 20:05:50
821
原创 从原理到细节:数据在内存中的存储探究。
以上是我们之前了解的数据类型。数据类型所需的内存空间大小直接影响其适用范围。以整型(int)为例,在32位系统中通常占用4字节,可表示的整数范围为-2147483648至2147483647。不同类型的数据在内存中的存储和解读方式存在差异。1.大端:数据的高位字节存放在低地址,低位放高地址。2.小端:数据的低位字节存放在高位字节,高位放低位。
2025-05-16 11:04:33
927
原创 C语言——实用调试技巧篇
bug 原译有昆虫的意思。而为什么将bug定为计算机程序中的错误呢?这里有个历史典故:1947 年,美国海军的马克二号计算机出现故障,工程师格蕾丝・赫柏(Grace Hopper)排查发现是一只飞蛾钻进计算机继电器,造成短路引发错误。她将飞蛾取出,在日志中记录 “debugging”(排除故障 ,原意为 “捉虫子” )。从此,“bug” 就逐渐被用来指代计算机程序或系统中的错误 ,“debug” 也成了调试程序、排除错误的术语。在我们vs2022里debug与release所在处。
2025-05-15 13:05:33
964
原创 C语言——指针篇
不是它指向的是其首个字符的地址,就像我们之前了解的内存单元,char*所指向的字符串的每个字符都有一个地址,你一个指针怎么能把所有的地址给表示出来呢。野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)指针变量在定义时如果未初始化,其值是随机的,简而言之,就是指针指向了我们不知道的地方。数组名表示的是数组首元素的地址,也就是说数组与指针有相似处,可以用数组名以指针的方式用,也可以指针以数组的方式用。其实这个指针就是套娃,一级指针就是将数据的地址存起来,二级指针就是将一级指针的地址存起来。
2025-05-14 20:42:36
1017
原创 c语言———函数篇
自定义函数,从字面上的意思,我们就能知道这是由我们自己定义的函数。而想要定义自己的函数就要了解规则。ret_type fun_name(形式参数)ret_type是函数返回类型,fun_name是函数名,()是参数的使用地。定义函数我们需要根据我们想写的函数了解所需的这些函数相关的东西。举例一个加法函数int z = 0;z = x + y;return z;int b = 0;//输⼊//调⽤加法函数,完成a和b的相加。
2025-01-04 23:52:29
871
原创 c语言——数组
这个连续增长与数组的类型有关,当数组类型为int类型,每个数组中的元素在内存中都有一个地址,因为int类型是4个字节,所以随着下标增长,地址也很会变(以4个字节一次一次变)每一个元素都有一个下标,这都是从0开始数的,比如就像上面有10个元素,它们的下标不是1到10而是0到9,这是与我们习惯上不同的一个点需要牢记。一维数组中将其中数据看作元素,二维数组则是将一位数组看作元素,依次类推,多维数组则是将前一个数组看作元素的数组。type指定数组存放数据类型,这类型可以是我们常见的类型也可以是我们自定义的类型。
2024-11-26 22:37:21
2169
原创 C语言——分支和循环
在switch中很重要(一定要加上)如果没有遇到break关键字,程序会继续执行后续的case语句中的代码,直到遇到break或者整个switch语句结束。for循环是我们更常用的循环,它将循环的初始化、条件判断和变量更新集中在一个地方,使得代码结构紧凑,对于已知循环次数的情况非常方便。使用到break可以直接永久终止循环,使用到continue则是终止本次循环后面的代码不执行,直接进入下一次循环再次进行条件判断。表达式,不能是变量或表达式的结果,且这些常量表达式的值必须是唯一的,不能有重复的情况。
2024-11-25 22:25:59
1861
原创 C语言——操作符(预算符)详解
因为8进制0~7,只需用三个2进制的数就行 如:2进制的 01101011:01换成1,101换成5,011换成3得8进制0153,0开头的数字,会被当做8进制。依照2进制转8进制,16进制只需要4个2进制的数就行了,还是2进制的01101011,0110换成6,1011换成b,16进制表示要在前加0x,所以得0x6b。如果值的类型和变量的类型不一致,会将赋值号右边的值转换为左边变量的类型。内存中存储的是补码的2进制,所以在参加移位时,移动的都是补码。进制我们通常听说有2进制、8进制、10进制、16进制。
2024-11-02 11:49:24
1780
原创 入门博客的第一天
大家好,我是2024级的一位在校大一学,来自人文渊薮之地,文章节义之邦———江西省。至于具体在哪,这可不兴说。许是曾经对计算机这类专业好找工作的印象,便走上了编程这一条路。如今,网上传着这行情下滑,但我仍相信随着时间的推移,我将拿到我想要的。
2024-10-24 07:50:19
190
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅