- 博客(38)
- 收藏
- 关注
原创 C/C++类型转换
尽量避免不必要的类型转换,尤其是隐式转换。使用显式转换时,确保转换后的值在目标类型的有效范围内。对指针和函数指针的转换需格外谨慎。static_cast、reinterpret_cast、const_cast、dynamic_cast。RTTI、typeid、decltype。
2025-03-08 18:24:23
818
2
原创 C++特殊类设计
拷贝只会发生在两个场景:拷贝构造时和赋值时,因此想要让一个类不能被拷贝,只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。要想实现只能在堆上创建对象,首先要将构造函数私有化,同时拷贝构造和赋值重载需要强制删除(或者只声明不定义且设置为私有),提供一个static成员函数,在该函数中完成对象的创建并返回对象指针。把operator new强制删除,就可以禁止在堆上创建对象了。把父类的构造函数设置为私有的,那么在子类构造函数中将无法调用父类的构造函数,这就实现了父类不可被继承。单例模式,懒汉、饿汉
2025-03-06 16:50:42
1058
3
原创 C++模板
将声明和定义放到同一个 .hpp 文件中里面或者.h文件中(推荐使用)。在模板定义的位置显式指定要实例化的类型(不推荐使用)。模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生。增强了代码的灵活性。
2024-11-24 13:17:57
811
7
原创 C++智能指针
C/C++内存资源的分配与回收都是由开发人员在编写代码时主动完成的,好处是内存管理的开销较小,程序拥有更高的执行效率;弊端是依赖于开发者的水平,随着代码量的增加,极容易出现因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。为了在保证性能的前提下,又能使得开发者不需要关心内存的释放,进而使得开发者能够将更多的精力投入到业务上,自C++11开始,STL正式引入了智能指针。auto_ptr、unique_ptr、shared_ptr的原理特性与使用。
2024-10-11 16:06:58
737
9
原创 C++11
引用都是取别名,不开空间。左值引用给左值起别名;右值引用给右值取别名。引用都是通过指针实现的。移动语义、完美转发、可变参数、lambda表达式、包装器
2024-06-01 15:04:30
1089
11
原创 Linux 信号
信号产生后,默认处理动作有TermIgnCoreStepContTrem:终止进程。Ign:忽略这个信号。Core:终止进程并进行核心转储(Core Dump)。Step:暂停进程。Cont:让暂停的进程继续执行。大部分信号的默认处理动作是Trem和Core普通的终止进程不会做别的事情。core:除了终止进程,还会进行核心转储core dump),生成core文件,core文件中存储的是程序出错的相关信息,有助于找出问题所在。核心转储功能默认是关闭的(可使用。
2024-04-28 18:18:16
1097
14
原创 进程间通信
管道是Unix中最古老的进程间通信的形式,它是一个把两个进程连接起来的数据流。管道通信是基于文件实现的,它的生命周期是随进程的,进程退出,则对应的管道销毁。管道是单向的,只能一个进程写数据,另一个进程读数据,要想实现双向通信,需要创建两个管道。
2024-04-22 18:11:56
821
13
原创 C++多态
多态,虚函数,虚函数的协变与析构函数的重写,override与final,重载、重写(覆盖)、重定义(隐藏)的对比,抽象类,接口继承与实现继承,多态的原理,单继承与多继承的虚函数表,动态绑定(动态多态)与静态绑定(静态多态)。
2024-03-31 20:00:45
1209
15
原创 C++继承
继承(inheritance) 机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类(父类 / 基类)特性的基础上进行扩展、增加功能,这样产生的新的类,称为派生类/子类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们所接触的复用都是函数复用,而继承是类设计层次的复用。基类的私有成员无论何种继承方式在子类中都是不可见。基类的其他成员在子类中的访问权限=该成员在基类中的访问权限 和 子类继承方式 中权限较小的。多继承可以认为是C++的缺陷之一
2024-03-26 16:32:30
1026
18
原创 C/C++内存管理
C和C++的内存管理方式的主要区别在于在申请自定义类型的空间时,new 会调用构造函数delete 会调用析构函数而malloc 与 free 不会。
2023-12-13 14:36:48
236
16
原创 类与对象(下)
初始化列表:构造函数体中的语句只能将其称为赋值,而不能称作初始化,成员变量在初始化列表定义并初始化。explicit禁止隐式类型转换:explicit只能禁止隐式的类型转换,无法禁止强制的类型转换。static静态成员:静态成员变量一定要在类外进行初始化,静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区,没有隐藏的this指针,不能访问任何非静态成员。友元、内部类、匿名对象
2023-11-26 23:47:06
267
23
原创 类与对象(上)
类主体:成员函数、成员变量class为定义类的关键字name为类的名字{ }中为类的主体,注意类定义结束时后面分号不能省略。类体中内容称为类的成员类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者 成员函数。this指针的使用
2023-10-27 22:01:45
362
11
原创 常见排序算法详解
所谓排序,就是使用一定的方法使一段可排序的序列变得有一定的顺序(递增或递减)。假定在待排序的序列中,存在多个具有相同的关键字的元素,若经过排序,这些元素的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。 数据元素全部放在内存中进行排序。数据元素太多,无法同时全部放进内存中进行排序。因此,需要将待排序的数据存储在外存(磁盘)上,排序时再把数据一部分一部分地调入内存中进行排序,在排序过程
2023-10-07 23:15:49
2112
8
原创 树、二叉树、堆及其应用(堆排序、top-k问题)
目录 需要注意的是:树形结构中,子树之间不能有交集。如上图一中B节点和A节点有交集,图二中A节点和C节点有交集,图三中C节点和D节点有交集,因此三个结构都不是树形结构。树结构相对线性表比较复杂,要存储表示起来就比较麻烦,既然保存值域,也要保存结点和结点之间的关系,实际中树有很多种表示方式如:双亲表示法,孩子表示法、孩子双亲表示法以及孩子兄弟表示法等。其中最常用的是孩子兄弟表示法。
2023-09-23 18:34:13
716
7
原创 栈和队列OJ题
暴力遍历无法保证括号的匹配顺序,虽然左右括号数量相同,但是它们的顺序不对,不能相互匹配,所以也是无效的,因此,暴力遍历的方法是不行的。一个栈专门同来进数据(push),另一个栈专门用来出数据(pop)。每次进数据都压入push栈,出数据都从pop栈出,若pop栈为空,则把push栈的数据都压入pop栈后再出数据。要始终保证至少一个队列为空(若两个队列都为空,则只能执行判空和压入数据的操作),这样在出数据时,把不为空队列(假设有n个数据)的前n-1个数据移动到空队列中,再出最后一个数据。
2023-08-25 10:05:51
285
18
原创 栈和队列详解
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守“先进后出/后进先出”的原则。队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有“先进先出/后进后出”的特点。
2023-08-12 18:58:58
584
14
原创 自定义类型:结构体、枚举、联合
结构体是一些值的集合,这些值称为成员变量。每个成员可以是不同类型的变量。结构体变量可以再声明时直接定义,也可以在结构体声明之后,需要用的时候再定义。结构体变量的初始化可以在定时结构体变量时就初始化,也可以需要用的时候再初始化。int b;int b;
2023-07-22 16:24:37
121
5
原创 快速幂算法
首先要知道取模运算的运算法则:可以发现多个因数相乘再取模等同于每个因数先取模再相乘。而b^p表示p个b相乘,在这里,我们可以利用规则三设计一个循环程序循环p次,每次使用一个b,在每次运算时让每个因数先对k取模,再相乘进行解题。数学中有a^b=(a^2)^b/2=(a*a)^b/2(b为偶数)、a^b=a^(b-1)*a=(a*a)^(b-1)/2*a(b为奇数)这样的降幂操作
2023-06-26 14:34:04
149
4
原创 深度剖析数据在内存中的存储
大、小端(大、小端字节序)指的是数据在电脑上存储的字节顺序,顾名思义,其是以字节为单位存储(具体存储方式与电脑本身有关)。大端存储:把数据的低字节内容存放到高地址高字节内容存放在低地址处;小端存储:把数据的高字节内容存放到高地址低字节内容存放在低地址处。知道了大小端的存在,那么前边1在存储时出现的问题就迎刃而解了,可以看出我用的电脑是小端存储。
2023-06-12 15:13:12
182
4
原创 不同进制下的乘法表
观察代码可以发现,我们仅在打印最后结果时进行了进制转换,但在打印i、j时没有进行进制转换,因此问题应该出在打印i,j的时候,打印i、j时也应该进行进制转换才行。结果完全符合要求,且把代码改进到了最简,代码运行效率也能有所提升,最主要的是,能锻炼自己发现问题、改正问题、在此基础上再优化的能力。达到了题目要求的效果。虽然到这里已经解决了题目,但是,观察代码会发现,要用两个函数、还要分类讨论,太过麻烦,因此可以对其进行改进,使其更简洁。可以发现,打印结果与题目实例相同,但是一组结果对上了,代码就没问题了吗?
2023-06-02 17:43:16
969
8
原创 二进制中1的个数
例如:输入:5输出:2(以为二进制下5为00000000000000000000000000000101上述方法进行了大量的取模以及除法运算,取模和除法运算的效率比较低,且当n为负数时也得不到想要的结果。排除上述暴力方法,也可以找到一些巧妙的方法求解。
2023-05-28 20:23:20
93
4
原创 C语言编程推理
一道很经典的推理题,详细推理过程自己随便假设一个为真,顺着往下推即可,经过推理可得A第三、B第一、C第五、D第二、E第四。四个嫌疑犯,分别假设每一个为凶手,进行推理,则可推出C为凶手,具体推理过程可自行实践。有四个人,则可利用循环把每个人遍历一遍,再用上述条件加以限制即可。----->kill!---->kill!
2023-05-27 18:17:28
281
8
原创 函数递归经典题目
借助B柱子,把A柱子上的n片圆盘到C柱子上,且C柱子上圆盘从上到下是按照从小到大排列。若设出走到n阶的走法是f(n),则由上述可得f(n)=f(n-1)+f(n-2),且f(1)=1,f(2)=2。如果设把n个盘子从一根柱子上移动到另一根柱子上所需的总步数是f(n),则由上述可得。f(n)=f(n-1)+1+f(n-1)=2*f(n-1)+1,且f(1)=1。f(n)=f(n-1)+f(n-2),递归终止条件为n=1或n=2。即递归规律为f(n)=2*f(n-1)+1,递归中止条件为n=1。
2023-05-21 20:00:39
171
3
原创 拿捏扫雷小游戏
define I0 9//实际想要的行数#define J0 9//实际想要的列数#define I I0+2//游戏实现过程中用到的行数#define J J0+2//游戏实现过程中用到的列数//即游戏实现过程中用到的数组比实际想要的数组外围多出一圈,在进行找雷操作时可以避免麻烦#define thu 10//雷的个数//打印菜单//选择是否继续游戏//初始化数组//随机布雷//打印棋盘//扫雷//找雷//打印分割线//爆炸效果。
2023-05-13 15:29:50
115
5
原创 C语言实现三子棋
因为该程序设计的自定义函数较多,为了有更好的代码可读性,可以使用多文件进行封装实现。//初始化数组int i = 0;int j = 0;for (i = 0;i < x;j < y;j++)//打印菜单//是否继续游戏printf("******* 1.继续游戏 *******\n");printf("******* 0.退出游戏 *******\n");//打印棋盘for (i = 0;i < x;
2023-05-08 14:12:15
111
3
原创 破解扫雷小游戏
首先就是把数据存储到二维数组中,因为输入的数据全是字符,所以就要去除‘ \n ’的影响。考虑到边界上的特殊情况,对于四个角只能统计三个方位,对于除四个角外的四边界只能统计五个方位,并且每种情况的条件都不一样,因此单列出来的话费时费力,还容易出错。因此在初始化数组时可以在所需要的基础上多加一圈,并且都初始化为0,在输入数据时从第二行第二列开始输入,只输入内矩阵,最外圈不管。
2023-04-23 14:57:32
522
1
原创 含十六进制的各进制转换
编写程序的难点在于对自定义函数的使用和函数嵌套的使用,而且程序较长,在编写程序初期需要不断的试错、调试、修改才能达到要求,因此需要有极好的耐心才能一直坚持下去,最终使程序达到自己预期的效果。其中输出的十六进制数F74是从最高位开始输出的,而47F是从最低位开始输出的,因此函数嵌套的步骤是不可省略的,否则输出的就是所求结果的逆序数。与十进制以内进制间的相互转换的逻辑相同,含十六进制的进制转换也是要先转化为十进制数,再转化为所要的进制数。关于进制转换的一些基本逻辑和操作,我在《令人头疼的进制转换》(链接。
2023-04-16 16:10:41
400
1
原创 C语言打印图形
首先要知道一些有关矩阵的知识(因为在打印一些特殊三角形时,是以矩阵为基础的):主对角线上(即左上到右下)行数=列数、副对角线上(即左下到右上)行数+列数=n-1(行数、列数从0开始)。左侧有空格的先打印空格再打印“*”,打印空格时必须单个循环打印 ,因为当n为偶数时,偶数行空格数为奇数,当n为奇数时,奇数行空格数为奇数。同样可以看做是两个三角形,分开打印即可,在打印左侧空格时,可以打印双空格,因为每一行的空格数都是偶数。打印空格时必须单个打印,因为无论n是奇数还是偶数,图形的偶数行的空格数都为奇数。
2023-04-15 18:26:54
3595
2
原创 令人头疼的进制转换
在日常练习过程中我们经常能遇到求一个数各位数字的题,例如求十进制1234的各位数字,其解题逻辑为1234%10=4,然后1234/10=123,再123%10=3,然后123/10=12,再12%10=2,然后12/10=1,再1%10=1,直到1/10=0结束,所得余数依次为个位,十位,百位,千位。二进制1001110=1×2^6+0×2^5+0×2^4+1×2^3+1×2^2+1×2^1+0×2^0=78(十进制)二进制从最低位开始每一位的计算权重为2^0,2^1,2^2,2^3……
2023-04-08 16:11:55
358
2
原创 编程是什么?怎么学?
编程对我来说是一个即熟悉又陌生的概念,熟悉是因为学校在大一上开设了c语言课程让我们对编程有一定了解,陌生是因为c语言对于编程来说只算是开胃小菜而已,想要真正掌握编程,仅仅一门c语言是远远不够的。人类将需解决的问题的思路、方法和手段通过计算机能够理解的形式告诉计算机,使得计算机能够根据人的指令一步一步去工作,完成某种特定的任务。想要学好编程,就必须熟练掌握c语言,因为c语言是人与计算机交流的工具,就像英语汉语等不同语言是人与人之间交流的工具一样,只有掌握了c语言,才能让计算机理解并执行你的指令。
2023-04-01 16:48:47
162
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人