- 博客(35)
- 收藏
- 关注
原创 C++类和对象(下)
无论是否显示写初始化列表,每个构造函数都有初始化列表;无论是否在初始化列表显示初始化,每个成员变量都要走初始化列表初始化;class Timepublic:Time(int hour)//是构造函数但是要传值则不是默认构造函数private:int _hour;class Datepublic:, _t(12), _ref(x), _n(1)// 如果不写“_t(12)”则编译器调用其默认构造函数,报错error C2512: “Time”: 没有合适的默认构造函数可⽤。
2024-11-29 11:01:46 1291
原创 C++类和对象(中)
析构函数与构造函数功能相反,析构函数不是完成对对象本身的销毁,比如局部对象是存在栈帧的,函数结束栈帧销毁,他就释放了,不需要我们管,C++规定对象在销毁时会自动调用析构函数,完成对象中资源的清理释放工作。构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务并不是开空间创建对象(我们常使用的局部对象是栈帧创建时,空间就开好了),而是对象实例化时初始化对象。默认成员函数就是用户没有显式实现,编译器会自动生成的成员函数称为默认成员函数。1,2,3都不写编译器自动构造打印的结果。
2024-11-29 11:01:12 649
原创 C++类和对象(上)
以下面栈的代码为例class为定义类的关键字,Stack为类的名字,中为类的主体,注意类定义结束时后面分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。为了区分成员变量,一般习惯上成员变量会加一个特殊标识,如成员变量前面或者后面加或者m开头,注意C++中这个并不是强制的,只是一些惯例,具体看公司的要求。
2024-11-28 17:48:18 595
原创 C++基础
1.定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。2.namespace本质是定义出一个域,这个域跟全局域各自独立,不同的域可以定义同名变量,所以下面的rand不在冲突了。3.C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找一 个变量/函数/类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。
2024-11-25 17:32:07 656 1
原创 C++模板初阶
类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<>中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。当我们显示实例化模板时,我们必须在所有使用的文件中包含显示实例化的代码,或者将它们放在一个单独的头文件中,并确保这个头文件被所有需要实例化的文件包含。显示实例化是程序员在代码中明确指定模板参数的类型,告诉编译器要实例化模板的特定版本。因此,通常显示实例化用于特定的模板参数,这些参数在多个源文件中需要,或者需要特别优化。
2024-08-10 15:37:27 864
原创 C++类与对象
类关键字:使用class关键字来定义一个类。类名:遵循命名规则,首字母大写。类的成员:包括数据和函数成员。访问修饰符:public、private 和 protected,用于定义类成员的访问级别。public:// 构造函数MyClass(int val) : privateValue(val) {}//初始化列表, 下面会讲// 析构函数// 成员函数private:// 私有成员这个例子中,MyClass是一个包含一个私有成员变量和两个公共成员函数setValue和。
2024-08-06 15:55:11 1115
原创 C++基础
在C++中,使用namespacenamespace 名称 {// 声明或定义变量、函数、类等 }在这个例子中,函数Print有一个参数number,它的默认值是0。这意味着如果你调用Print()而没有任何实参,函数将使用默认值0。引用的声明与指针类似,但它不需要使用星号。引用在声明时必须被初始化,一旦初始化之后,它就不能再绑定到另一个变量上。类型 &引用名 = 变量名;int a = 10;// 声明引用ref,并将其初始化为变量a的引用在这个例子中,ref是a。
2024-08-06 15:54:44 1125
原创 排序算法--快速排序
快速排序是一种由英国计算机科学家Hoare于1962年提出的排序算法,也就是Hoare法,后续有人认为Hoare法难以理解,又发明了“挖坑法”,“前后指针法”等(这些方法都叫快速排序),但其基本思想和复杂度等均与Hoare法大同小异,此篇博客我们重点讲解Hoare法。快速排序的基本思想是分治法。其核心是选择一个基准值(key),然后将待排序的数组分成两部分,使得左侧的所有元素都不大于基准值,而右侧的所有元素都不小于基准值。这个过程称为“划分”。
2024-07-29 14:48:29 915
原创 排序算法--堆排序
堆排序的基本思想是,将待排序的元素构建成一个最大堆或最小堆。然后,将堆顶元素与堆中最后一个元素交换,并从堆中移除这个最大或最小元素,再调整剩余的堆,使其满足堆的性质。建堆有向上调整建堆和向下调整建堆两种,使用向上调整建堆的时间复杂度为O(nlogn),而向下调整建堆的时间复杂度为O(n),所以我们选择向下调整建堆(向下调整详细请看我发布的堆博客)构建最大堆的时间复杂度是O(n),每次调整堆的时间复杂度是O(logn),由于需要调整n-1次,所以总的时间复杂度为O(nlogn)。
2024-07-28 11:07:42 303
原创 排序算法--选择排序
选择排序的基本思想是,通过在未排序的序列中找到最小(或最大)元素,并将其放置在已排序序列的起始(或末尾)位置。这个过程会一直重复,直到整个序列排序完成。选择排序不具有稳定性,即在排序过程中,相等元素的相对顺序可能会发生改变。这意味着如果有两个相同的元素,它们在排序后的序列中的相对位置可能与排序前不同。选择排序的时间复杂度为O(n^2),因为它需要对数组中的每个元素进行n-1次比较(n是数组的长度),且这个过程需要重复n-1次。选择排序的空间复杂度为O(1),因为它是一个原地排序算法,不需要额外的存储空间。
2024-07-28 11:05:25 528
原创 排序算法--插入排序
插入排序是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常是通过循环和比较来完成的。
2024-07-27 19:23:42 294
原创 数据结构--队列(图文)
这里和单链表结构一致。// 链式结构:表示队列}QNode;将队列的首尾指针封装成一个结构体,可以方便函数调用,统一接口。再使用一个整型size记录元素个数,利于其他函数功能实现。// 队列的结构int size;}Queue;
2024-06-29 16:48:18 645
原创 数据结构--栈(图文)
栈是一种基本的抽象数据类型,具有后进先出的特点。在栈这种数据结构中,元素只能在一端进行插入和删除操作,这一端被称为栈顶(Top),而另一端则称为栈底(Bottom)。
2024-06-26 23:14:31 919 2
原创 数据结构--双向链表(图文)
双向链表相较于单链表的优势在于可以快速访问和操作节点的相邻元素,尤其在需要频繁插入或删除元素的场景中,它提供了更高效的数据操作方式。双向链表常用于实现高级数据结构,如栈、队列、列表等,并且在某些编程语言的标准库中,如C++的STL和Java的LinkedList,都提供了双向链表的实现。双向链表在每个节点处都维护了两个指针,一个指向前一个节点(称为前驱节点),另一个指向下一个节点(称为后继节点)。:头节点的后继指针指向尾节点,尾节点的前驱指针又指回头节点,这样的双向链表形成一个环。情况一:链表只有头节点。
2024-06-26 23:14:10 1188
原创 数据结构--单链表(图文)
从前向后遍历整个链表,如果 plist->data == x,就说明找到了,返回 plist 此时的值,如果plist = NULL了,就说明这个链表中没有该数据,则返回空。在单链表中,每个元素(称为节点)包含两部分:一部分是存储数据的数据域,另一部分是存储下一个节点地址的指针域。先将指定位置的的下一个位置保存起来,让指定位置的next指针指向保存位置的下一个位置,然后释放掉保存的位置也就是指定位置之后的数据。:链表的最后一个节点,其指针域通常为空(NULL),表示链表的结束。在指定位置后直接插入即可。
2024-06-21 08:50:32 805 1
原创 数据结构--顺序表(图文)
顺序表的插入和删除操作可能需要移动大量的元素,尤其是在插入或删除中间的元素时,时间复杂度为O(N),其中N是表中元素的数量。在顺序表中,数据元素通常存储在连续的内存空间中,这使得通过索引可以直接访问到表中的任意元素。:顺序表可以是静态的,也可以是动态的。:由于元素存储是连续的,顺序表支持随机访问,即可以直接通过索引来访问元素,这一点与链表不同,链表需要遍历才能访问到指定位置的元素。对比静态顺序表,动态顺序表更有优势,同样在项目中,动态顺序表的应用远远大于静态顺序表,下面我们就来实现动态顺序表。
2024-06-19 08:47:04 699 2
原创 C语言--文件操作
通常,文件描述符与标准输入输出设备相关联,例如标准输入的文件描述符是0,标准输出的文件描述符是1。上述代码从名为"example.txt"的文件中读取字符串"姓名:张三,年龄:25",并将其存储在变量。是一个格式化字符串,后面的参数按照格式化字符串中的格式进行解析并读取文件中的数据。是C语言中常用的两个函数,用于向文件写入格式化的输出和从文件读取格式化的输入。的作用是:当文件读取结束的时候,判断是读取结束的原因是否是:遇到文件尾结束。函数用于改变文件指针的位置,使其指向文件的特定位置。
2024-06-19 08:46:33 1400
原创 C语言--动态内存管理
函数中,我们动态分配了存储学生信息的内存空间,并初始化了结构体成员,最后打印出学生的信息。请注意,使用完柔性数组后,我们需要手动释放内存以避免内存泄漏。柔性数组是C语言中的一种特殊用法,允许在结构体的末尾定义一个长度不定的数组。柔性数组只能作为结构体的最后一个成员,并且其大小在运行时动态确定。在这个例子中,我们定义了一个包含柔性数组的。成员是一个柔性数组,长度不定。
2024-04-07 11:47:48 272
原创 C语言--qsort函数
函数声明:qsort函数的声明位于<stdlib.h>这里,base是指向待排序数组的第一个元素的指针,num是待排序元素的数量,size是每个元素的大小(以字节为单位)。compar是一个函数指针,指向的函数用于比较两个元素的大小。比较函数:比较函数的形参也是类型,这使得qsort函数可以对任何类型的数据进行排序。如果第一个参数小于第二个参数,返回小于0的值。如果第一个参数等于第二个参数,返回0。如果第一个参数大于第二个参数,返回大于0的值。
2024-04-05 12:19:14 738 1
原创 C语言--内存函数汇总
可以处理源和目标内存块的重叠情况,它会确保不会在未初始化的内存中读写数据,相比。不检查源和目标内存块是否重叠,如果它们重叠,可能会导致未定义的行为。函数也用于复制内存块,但其行为与。
2024-03-31 11:23:13 297 1
原创 C语言--atoi函数(附模拟实现)
函数是 C 语言中的一个标准库函数,它的全称是 “ASCII to integer”,它接受一个字符串参数,并返回对应的整数。函数只接受 ASCII 字符的字符串。如果字符串中包含非 ASCII 字符,或者包含不能转换为数字的字符,那么。会忽略输入字符串中的空白字符(例如空格、换行符等),然后从第一个非空白字符开始,读取连续的数字字符,直到遇到非数字字符为止,将这一段数字字符转换为对应的整数值。类型的指针,指向要转换的字符串。函数返回值是转换后的整数值。,它的参数是一个指向字符串的指针。
2024-03-19 19:29:08 517 1
原创 C语言--字符串函数汇总(附模拟实现)
是 C 语言中的一个字符串操作函数,它用于将一个字符串分解为一系列标记,每个标记由一个特定的分隔符分隔。函数的模拟实现通常基于一个循环,遍历字符串中的每个字符,直到遇到空字符为止。函数的第一个参数是要分割的字符串,第二个参数是分隔符。会修改原始字符串,所以如果你需要保留原始字符串,你需要先复制一份再进行操作。如果找到子字符串,它会返回指向子字符串第一个字符的指针;如果没有找到,它会返回。,模拟实现可能会更加复杂,因为它需要处理复制特定数量字符的情况。请注意,这个模拟实现没有处理空字符串的情况,即空字符串(
2024-03-17 13:49:33 1629 1
原创 C语言---指针
例如,你可能有一个链表或树,其中每个节点都是一个包含两个指针(一个指向下一个节点,一个指向前一个节点)的结构。此外,对于指针变量来说,其值为所指向变量的内存地址,所以改变指针的值意味着改变它所指向的内存位置。当你在结构体中定义一个指向某种类型数据的指针时,你可以通过该指针间接访问结构体中的数据。当你有一个指向数组的指针时,你可以通过解引用该指针来访问数组中的元素。指针是C语言中的一个重要概念,它本质上是一个变量,存储的是另一个变量的内存地址。你可以对指针进行算术运算,例如增加或减少指针的值。
2024-02-16 18:56:18 1829 1
原创 C语言---结构体
结构体是一种自定义的数据类型,可以用来存储不同类型的变量。它允许我们将不同类型的数据组合在一起,以便于管理和操作。结构体可以包含多个成员变量,每个成员变量可以是任意数据类型。结构体定义包括结构体名称和结构体成员变量。结构体定义通常放在函数外部,以便在程序中的任何位置都能使用它。以上是对C语言中有关结构体的讲解,阅读过后如有任何地方出错,请随时联系我,希望得到各位读者的建议和肯定。
2024-02-08 19:24:23 399
原创 C语言---常用操作符讲解汇总
C语言中的操作符是编程语言的基础,它让我们可以对数据进行各种操作。下面我会详细地讲解C语言中的各种操作符,希望对你有所帮助。
2024-02-07 19:16:24 498 1
原创 C语言---递归
递归是C语言中一个非常有用和强大的特性,它允许函数自己调用自己。这种方法在处理某些类型的编程问题时非常有用,尤其是那些可以分解为多个相似或更小问题的情况。
2024-02-06 19:51:17 647 1
原创 C语言--扫雷游戏(简易版)
11×11的二维数组可以容纳更多的信息,包括雷区、显示区和额外的信息区。除了雷区和显示区之外,额外的信息区可以用来存储一些额外的信息,比如标记已经排查的方块,或者统计周围的雷的数量等。这样可以更好地实现扫雷游戏的逻辑,比如在排查雷的过程中,需要记录周围雷的数量,以便于判断是否需要重新排列游戏的状态等。首先需要创建一个存储雷区的数组,大小为ROWS行COLS列(11行11列)。这个数组可以用来记录雷的位置,初始化时,所有元素均为0表示没有雷。函数来实现游戏的交互界面,根据用户的选择调用相应的函数。
2024-01-24 13:37:34 473 2
原创 C语言---函数(精讲版)
除了库函数,您还可以创建自己的函数。自定义函数由函数头和函数体组成。函数头包括函数的返回类型、函数名和参数列表,函数体包括一系列的语句和操作。在使用函数之前,需要提供一个函数的声明。函数的声明包括函数的返回类型、函数名和参数列表。函数的定义包括函数声明和函数体。示例// 函数声明int main()return 0;// 函数定义以上就是我为各位带来的【C语言—函数】通过学习“函数”的相关知识,可以有效提高程序的可读性和灵活性,并使数据处理更加简单和方便。
2023-12-16 12:03:30 179 1
原创 C语言---数组
文章介绍了以下内容1.数组的声明和初始化 2.数组的访问 3.数组的遍历 4.数组的长度和越界访问 5.数组作为函数参数 6.变长数组
2023-12-10 12:34:48 1660 1
原创 C语言---分支和循环
文章共介绍了以下内容分支语句(if语句),多重分支语句(if-else if-else语句),选择语句(switch语句),循环语句,关系操作符,逻辑操作符,条件操作符,break和continue语句,循环的嵌套,goto语句,生成随机数
2023-12-03 11:57:40 1102 2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人