- 博客(49)
- 收藏
- 关注
原创 【C++】——类和对象(中)—>赋值运算符重载+日期类的实现+const成员函数+取地址运算符重载
我们在对内置类型进行运算符的操作的时候,编译器是会将其转化为对应的指令,然后其完成运算的,那么对于我们的自定义类型,我们是否可以直接进行使用呢?下面我们通过代码来验证:可以看到对于自定义类型是无法直接使用赋值运算符的,这是因为我们的自定义类型,编译器是不知道如何进行运算的,就比如我们的日期类,我们知道每年有十二个月,但是编译器是不知道的,所以对于自定义类型,我们就需要自己根据实际情况去写。不过我们可以写一个函数来实现这个功能。
2025-07-23 03:29:28
576
原创 【C++】——类和对象(中)——默认成员函数
我们使用class和struct等关键字进行定义的类型下面我们就来看看编译器自动生成的构造函数是如何的:我们可以看到我们在定义类的时候我们没有写构造函数的,那么我们在实例化对象的时候,我们的编译器就会自动帮我们默认构造函数,但是其具体是初始化什么内容我们就不知道了,我们上面的代码对成员变量的初始化就没啥有要求了。还有一种情况就是我们的成员变量也是一个类,然后我们的成员变量有构造函数,那么我们这个类就可以不写构造函数了,那么其就会使用成员变量那个类的构造函数。
2025-07-18 19:37:38
1063
4
原创 【C++】——类和对象(上)
类和前面我们在C语言中学习到的结构体有点类似,其最大的区别就是我们的类可以定义函数,类的定义需要使用到关键字class。其定义如下:class是定义类的关键字,text是类的名称,{}中为类的主体,要注意的是最后的那个分号不可以省略。类中的内容称为类的成员,类中的变量称为类的属性或者成员变量,类中的函数被称为方法或者成员函数。C++中其也兼容C语言的大部分语法,所以我们的struct在C++中也升级成了类,其和C语言中的struct的最大区别就是其可以定义函数了。那么我们的类具体有和作用呢?
2025-07-10 21:33:03
935
8
原创 【C++】--入门(下)
引用是给已经存在的变量取一个别的名字,所以编译器是不会给引用再开辟空间的,它和其引用的变量共用一块空间。其语法如下:类型&引用别名=引用对象;那么在上面的引用中,b和c都是a的别名,就像我们生活中,土豆和马铃薯,番茄和西红柿这种情况,其就是名字不一样,但是指的是同一个事物。我们将其地址打印出来看看:可以看到其是使用的同一块空间的。
2025-07-06 01:21:29
917
9
原创 【C++】--入门
定义命名空间需要用到namespace关键字,然后后面跟命名空间的名字,然后接上一对{}即可,{}中即为命名空间中的成员。命名空间中可以定义变量\函数\类型等。namespace本质上是一个域,这个域和全局域是独立的,不同的域可以定义同名变量。C++中域有函数局部域,全局域,命名空间域,类型;域影响的是编译的时候语法查找一个变量\函数\类型出处(声明或定义)的逻辑,所以有了域隔离,那么名字冲突就解决了。局部域和全局域除了会影响编译查处逻辑,还会影响变量的生命周期,命名空间和类域不影响变量生命周期。
2025-07-02 22:06:33
813
5
原创 【数据结构】--排序算法(上)
我们在学习c语言的时候就已经接触过排序了的,我们当时学习数组的时,就学习过冒泡排序,我们的排序算法主要分为下面几种:我们先复习一下我们的冒泡排序:我们看看其时间复杂度,其两个循环嵌套,然后其最坏的情况就是其完全是逆序的,那么每一次都需要进行交换,那么我们的时间复杂度最坏的情况就是O(n*n),那么最好的情况就是其已经是升序的,那么我们的时间复杂度就为O(n),那么其平均情况下时间复杂度就为O(n^2)。
2025-06-26 22:49:06
923
4
原创 【数据结构】——二叉树--链式结构
文章摘要:本文详细介绍了链式结构二叉树的实现方法及其基本操作。主要内容包括:1)使用链表结构实现二叉树,每个节点包含数据域和左右孩子指针;2)三种遍历方式(前序、中序、后序)的递归实现方法;3)二叉树的插入、统计节点数、求叶子节点数、求第K层节点数、计算高度、查找特定值等操作;4)层序遍历的实现需要借助队列结构;5)判断完全二叉树的算法。文章通过代码示例和图解详细说明了各操作的实现原理,强调链式结构适用于各种二叉树形式,相比数组实现能有效减少空间浪费。
2025-05-31 18:04:24
1308
25
原创 【数据结构】——二叉树堆(下)
我们前面学习了树的概念和结构,还要树的一种特殊树--二叉树,然后我们学习了堆,知道了堆分为大堆和小堆,接下来我们就使用堆来进行一个排序。
2025-05-27 22:25:11
6174
15
原创 【数据结构】--二叉树--堆(上)
树是一种非线性的数据结构,他是由n(n>=0)个有限结点组成一个具有层次关系的集合。其叫做树,是因为他倒过来看就和一棵树差不多,其实际上是根在上,树枝在下的。树的特点:1、其有一个特殊的结点,称为根结点,根结点没有前驱结点。2、除根结点,其余的结点被分为M(M>0)个互不相交的集合,其中每个集合其又是一棵结构与树类似的子树,每棵子树的根结点有且只有一个前驱,其可以有0个或者多个后继。所以树是递归定义的。如上图所示,树的结构其倒过来就和我们现实生活中的树长得很像了。
2025-05-26 21:43:05
6572
13
原创 【数据结构】——栈和队列OJ
题目的要求很简单,就是要求我们判断其输入的括号字符串是否是有效的括号,那么我们要如何判断呢?我们可以这样,我们遍历出传入的字符串,然后我们创建一个栈,然后如果这个字符是组左括号,那么我们就让其入栈,然后如果是右括号,那么我们就取栈顶的元素和这个右括号进行对比,如果匹配那么就出栈,不匹配的话那么就说明这个字符串不是有效的括号,然后继续进行比较,直到字符串遍历完,那么我们字符串遍历完后,是否就表示我们的这个括号是有效的呢?
2025-05-13 23:53:36
6644
20
原创 【数据结构】——队列
概念:只允许在⼀端进⾏插⼊数据操作,在另⼀端进⾏删除数据操作的特殊线性表,队列具有先进先 出FIFO(First In First Out)。
2025-05-12 22:21:00
5956
14
原创 【数据结构】——栈
栈其实就是一种特殊的顺序表,其只允许在一端进出,就是栈的数据的插入和删除只能在一端进行,进行数据的插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的元素遵循先进后出LIFO(Last InFirst Out)的原则。栈的插入操作叫做进栈/压栈/入栈,入栈的位置也是在栈顶。栈的删除操作叫做出栈。出栈也是在栈顶。那么我们的栈是要如何进行实现呢?我们实现栈的话有两种:链表和数组。
2025-05-10 23:12:27
5763
10
原创 【数据结构】——双向链表
我们前面学习了单链表,其是我们链表中的其中一种,我们前面的单链表其实全称是单向无头不循环链表,我们的链表从三个维度进行分类,一共分为八种。1、单向和双向可以看到第一个链表,其只能找到其后一个节点,是没办法找到其前面的节点的,其遍历只能从左往右遍历。而我们的双向链表,其节点中,有三个元素,一比我们单向的多了一个,其就多了一共指向前一共节点的指针,我们的双向链表是可以寻找到前一个节点的,其是可以从左往右遍历,也可以从右往左边进行遍历。2、带头或不带头。
2025-05-09 01:28:58
6203
10
原创 【数据结构】——单链表练习(1)
那么根据题目的要求我们大致明白这道题要做什么,就是将一个链表中,和指定的值相等的元素的节点删除,然后返回删除后的新的链表,然后题目给我们传入的参数是链表的头节点和指定的元素。
2025-05-03 03:25:28
6326
18
原创 【初阶数据结构】——顺序表
在上面我们提到了动态顺序表,其有三个成员,第一个成员是一个指针,用来指向开辟的空间,然后第二个成员就是用来记录当前表中的有效元素的个数,第三个成员就表示当前表的容量。其定义如下:然后我们就使用我们的动态内存管理函数来开辟空间,如果忘记的可以往前复习一下,下面我们简单进行复习一下。malloc函数,其是可以申请一块连续的空间,返回的是这块空间的地址。calloc函数,其和上面的函数是一样的功能,就是其参数不一样,第一个参数是要开辟的元素个数,然后第二个参数是开辟的一个元素的大小。
2025-04-19 02:59:22
6226
3
原创 【初阶数据结构】——算法复杂度
数据结构(Data Structure)是计算机存储、组织数据的⽅式,指相互之间存在⼀种或多种特定关系的数 据元素的集合。没有⼀种单⼀的数据结构对所有⽤途都有⽤,所以我们要学各式各样的数据结构, 如:线性表、树、图、哈希等下面我们就要踏上学习数据结构的旅程了,我们这部分主要是通过C语言来学习初阶数据结构,后续我们学习C++的时候,就会继续高阶数据结构和算法。算法(Algorithm):就是定义良好的计算过程,他取⼀个或⼀组的值为输⼊,并产⽣出⼀个或⼀组值作为 输出。
2025-04-15 23:28:44
6103
4
原创 【C语言】预处理(下)(C语言完结篇)
在编译一个程序的时候,如果我们要将一条语句,编译或者放弃编译,那么我们可以使用条件编译,比如调试性的代码,我们在调试完后,将其删去又会很浪费,但是保留又会很难看,影响我们代码的可读性,那么我们就可以使用条件编译,在编译的时候不编译这些调试性代码。例如我们在开头使用了#define定义一个符号,如果我们没有注释或者删除这个符号,那么我们是可以编译里面的调试性代码的,反之就不可以编译。但是这个是不会影响代码的正常运行的。
2025-04-12 16:37:55
1006
4
原创 【C语言】预处理(预编译)(C语言完结篇)
这个关键字我们在前面的学习也已经遇到过了,下面我们来详细学习。其定义常量的语法如下:那么M就是我们定义的常量的名字,100是我们定义的常量的值。我们可以使用#define来定义各种类型的常量,我们使用其定义常量,对于常量的名字有个约定,就是对名字最好使用全部大写。这个定义常量,其本质上是替换,其在预处理后,会将程序中的M替换成100。所以我们使用#define定义常量的时候,末尾不要加分号,因为其会将这个分号也当成常量替换进我们的程序。如下:可以看到此时的编译器已经报错了。
2025-04-10 23:00:43
1054
5
原创 【C语言】编译和链接
在ANSI C的任何一种实现中,存在着两个不同的环境:1、翻译环境:在翻译环境中,其会通过编译和链接两个大的步骤,其中编译又分为了预处理(这 个我们后面还会详细讲解),编译和汇编,然后将源代码转换为可执行的机器指令(二进制指 令),然后生成可执行文件。2、运行环境:就是执行环境,在运行环境中会执行可执行程序,然后输出结果。下面我们将在翻译环境和运行环境下具体是干啥的。
2025-04-07 20:00:14
1352
8
原创 【C语言】文件操作(2)
在前面我们学习了文件的顺序读写的函数,那么当我们要读取某个指定位置的内容的时候,是否只能顺序的读取到这个内容?还有在对文件进行输入的时候,需要对指定的位置进行写入,那么此时应该怎么办呢?我们也可以使用函数来更改读写的位置的,从而实现随机读写。
2025-03-31 20:41:05
1106
5
原创 【C语言】文件操作
我们在电脑中的数据都是存储在电脑的内存中的,但是当我们关机,程序退出等,那么此时内存就会回收,那么数据就没了,那么等我们再次开机,运行程序的时候,就没办法再找到这个程序的,那么我们需要将这个数据可以一直保存着,那么我们可以使用文件,将数据进行保存。文件是存储在计算机上的信息集合,其可以分为很多种,比如:文本文档、图片、程序等程序文件包括了:源文件程序(后缀为.c),目标文件(windows环境下后缀名为.odj),可执行文件(windows环境下后缀名为.exe)。文件的内容是程序运行中读写的数据。
2025-03-31 11:25:33
1276
3
原创 【C语言】动态内存管理
C/C++程序内存分配的⼏个区域:1. 栈区(stack):在执⾏函数时,函数内局部变量的存储单元都可以在栈上创建,函数执⾏结束时 这些存储单元⾃动被释放。栈内存分配运算内置于处理器的指令集中,效率很⾼,但是分配的内 存容量有限。栈区主要存放运⾏函数⽽分配的局部变量、函数参数、返回数据、返回地址等。《函数栈帧的创建和销毁》2. 堆区(heap):⼀般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。分配⽅ 式类似于链表。3. 数据段(静态区):(static)存放全局变量、静态数据。
2025-03-24 20:33:23
1002
6
原创 【C语言】自定义数据类型:联合体和枚举
和结构体一样,联合体也是由一个或者多个成员组成,这些成员可以是不同的类型。联合体和结构体的不同的就是,其所有成员共用一块内存空间,所以联合体也称为共用体,那么因为其是所有成员共用一块内存空间,所以其空间大小应该是最大的成员,而且当我们对其中一个成员赋值的时候,其他成员的值也会发生变化。下面我们开始对联合体进行学习。
2025-03-23 18:15:43
602
1
原创 【C语言】使用结构体实现位段
前面我们学习了结构体,位段的声明和结构体是一样的,其区别如下:1、位段的成员必须是int 、unsigned int 、signed int 、在C99中位段的成员的类型也可以选择其他类型。2、位段的成员名后边有一个冒号和一个数字如下:那么这几个变量后面的数字表示啥意思呢?会不会是表示其二进制的位数呢?我们继续往下分析。
2025-03-20 22:57:43
909
2
原创 【C语言】自定义类型:结构体
我们前面学习操作符的时候已经接触过结构体了,下面我们回顾一下结构体的基本内容。创建结构体的语法如上所示:struct是创建结构体的关键字,然后tag就是我们结构体的名称,member-list是结构体的成员列表,列表包含了对结构体进行描述的变量,variable-list是创建结构体时需要同时创建的结构体变量。下面我们通过一个例子来理解:例如我们现在需要描述一个学生,那么学生的描述就有姓名、年龄、学号、性别等。那么此时单个变量的描述就没办法完整描述了。
2025-03-18 23:07:19
1073
5
原创 [C语言]数据在内存中的存储
在讲解操作符的时候,我们就讲过了下⾯的内容:整数的2进制表⽰⽅法有三种,即原码、反码和补码。有符号的整数,三种表⽰⽅法均有符号位和数值位两部分,符号位都是⽤0表⽰“正”,⽤1表 ⽰“负”,最⾼位的⼀位是被当做符号位,剩余的都是数值位。正整数的原、反、补码都相同。负整数的三种表⽰⽅法各不相同。直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。将原码的符号位不变,其他位依次按位取反就可以得到反码。反码+1就得到补码。
2025-03-16 20:55:56
814
1
原创 [C语言]内存函数的使用和模拟实现
前面我们学习了字符串函数,里面的strcpy函数和strncpy函数是实现拷贝字符串的功能,不同的是前者是将整个字符串拷贝,后者是可以指定拷贝的字符个数。但是我们的数据类型有多种,那么当我们需要拷贝的对象是其他的数据类型,这时候我们要咋办呢?那么有没有那么一种函数,可以实现对任何数据类型都可以实现拷贝功能的函数呢?有的兄弟,有的。我们接下来要学习的这个函数就是了。memcpy函数,它是对内存块的内容进行拷贝,无论内存存放的内容是什么类型,都可以通过内存来实现拷贝。
2025-03-12 23:14:59
1038
6
原创 字符和字符串函数(2)
看这个函数的名字和前面我们学习的一个函数很像,strcpy函数,那么其两者有啥联系吗?我们知道前者是将第二个参数的字符串拷贝到第一个参数的目标空间。而且其拷贝会将目标空间的内容给替换掉,那么我们只想拷贝一部分咋办?那么此时就学习带n的字符串函数,这个n就表示我们在拷贝的时候要拷贝的字符的数量。可以看到带n的函数比不带n的函数更加灵活,可以指定要操作的字符的数量。所以也叫带n的字符串函数为受限制函数,不带n的为不受限制的字符串函数。下面我们看看strncpy函数的原型:、
2025-03-10 21:05:07
806
4
原创 【c语言】字符函数和字符串函数(1)
c语言中有部分函数是专门做字符分类的,也就是一个字符是属于什么类型的字符,这些函 数的使用要包含一个头文件ctype.h中。其具体如下图所示:这些函数的使用方式都类似,下面我们通过一个函数来看其使用方式:islower函数是能够判断参数c是不是小写字母,如果参数c是小写字母那么就返回非0的整 数,如果不是小写字母就返回0。下面我们通过一个练习来学习:将字符串中小写的字母变成大写的字母。
2025-02-25 17:44:00
1238
7
原创 【c语言】指针 (完结)
前面我们在学习操作符的时候,我们学习了sizeof,知道其是计算变量所占内存的大小的,单 位是字节,如果操作数是数据类型的话,计算的就是这个类型的变量所占的内存空间的大小单 位也是字节。其计算的结果只与该变量的类型有关,与其存放的集体数据无关。还有就是对于要计算的是变量的大小,在语法的写法可以不写小括号,所以我们在阅读代码的 时候对于sizeof计算一个变量没有括号,这个写法也是可以的。
2025-01-13 23:40:41
1290
4
原创 【c语言】指针4(含qsort函数)
回调函数是什么呢?回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向 的函数时,被调用的函数就是回调函数。回调函数不是由该函数的实现方直接调用,而是在 特定的事件或者条件发生时,由另外一方调用的,用于对该事件或条件进行响应。
2024-12-14 00:37:43
789
3
原创 【c语言】指针3
前面我们学习了,指针数组,指针数组是一种数组,数组中存放的是地址(指针)那么数组指针是什么呢?是指针变量还是数组呢?其是指针变量。前面我们已经熟悉了:整型指针变量:存放的是整型变量的地址,能够指向整型数据的指针。浮点型指针变量:存放的是浮点型变量的地址,能够指向浮点型数据的指针。那么数组指针就应该是存放数组的地址的指针,能够指向数组的指针。那么数组指针的写法是咋样的呢?我们看下面两个写法:这里我们思考一下p1和p2都是数组指针吗?
2024-12-05 16:32:14
986
6
原创 【C语言】指针2
在上一章节我们在使用指针访问数组的内容的时候,我们有下面这样的代码在上述的代码中我们使用&arr[0]来取得数组首元素的地址,但是我们前面也说过,数组名字 其实也就是数组的地址,而且还是首元素的地址。那么是不是说&arr[ 0 ]=arr;呢?下面我们 通过测试看看。代码如下:输出结果:可以看到数组名和数组首元素地址打印出的结果是一模一样的,数组名就是首元素的地址, 那么如果数组名就是首元素地址那么有下面的代码,又该如何解释呢?
2024-11-27 01:11:18
1182
3
原创 【C语言】指针1
在学习内存和地址前,我们讲一个生活中的案例:我们在入学的时候都需要找到自己的宿舍,但是现在你所在的宿舍楼,有一百个房间,但是 每个房间都没有编号,而且每个宿舍都是一样的,只是在每个宿舍的门口贴了这个宿舍住的 人,那么我们要想找到我们是那个宿舍的是不是就只能一个一个找了,直到找到为止。这样 的效率就很低了。但是如果我们给每个宿舍都给上编号,然后和你说你的宿舍是那个编号那 么就不用一个一个找了。
2024-11-24 23:30:52
1185
4
原创 【C语言】操作符2(含操作符的应用)
定义:结构体的定义有两种方法:1、在创建结构体的时候在最后直接写出这个变量,注意后面的分号!!!2、和定义结构体有一点类似,使用struct关键字然后加上一个名字,然后再加上这个变量的 名字。初始化:结构体的初始化和数组差不多,也是使用大括号。第一个初始化就会按照结构体中的数据顺序的初始化,即第一个"zhangsan"就是name的,然 后20就是age的了,第二种就是指定初始化,这个就在要初始化的那个数据加.即可。
2024-11-19 23:11:11
1283
2
原创 【C语言】操作符1
上面的操作符有部分我们在前面的学习中已经见到和使用过了,如:算术操作符,赋值操作 符,单目操作符,关系操作符,逻辑操作符,条件操作符等。今天我们继续学习一部分,操作 符中有一些操作符和二进制有关系,我们先对进制和进制转换学习一下。
2024-11-17 16:10:54
1477
2
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人