- 博客(77)
- 收藏
- 关注
原创 代码随想录(day10)——栈和队列
在遍历完成后,在此对栈进行一次检测,如果此时栈为空,则说明给定字符串中的括号的左半部分的数量大于右半部分,返回。在遍历过程中,出现了栈为空的情况,则说明字符串中的括号的右半部分的数量大于左半部分,因此,返回。对于上面给出的范例,不难看出,由于右括号多了若干个,因此也不满足有效括号的定义。位置的内容等于三种括号的左半部分,则向栈中压入这个括号的右半部分。的最后一个字符与给定字符串的字符不同,则将给定字符串的字符插入到。如果不相等,则说明括号不匹配,直接返回。随后,再去检测给定字符串中的字符,如果其不等于。
2024-03-30 16:48:55
909
原创 代码随想录(day9)——栈和队列
用于向外弹出元素。例如对于上题中的队列,如果需要让队列弹出元素,弹出的元素应该为。,由于需要返回并移除的栈顶元素正是队列中的最后一个,因此,让队列中的前。对于本题,需要利用两个栈来模拟实现队列,此处分别命名为。由于题目需要移除并且返回这个元素,因此先创建一个变量。向队列中插入元素即可。来存储队列中的第一个元素,随后,利用。在各自出元素时,栈弹出的元素为。但是对于栈来说,其弹出的元素为。保存栈弹出的元素,随后利用。是否为空,如果为空,则让。,直接利用队列中的接口。,直接利用队列中的接口。
2024-03-30 13:55:53
401
原创 进阶了解C++(6)——二叉树OJ题
对于题目要求的格式输出,不难发现,当一个结点的左子树的结点为空时,括号不输出。当一个结点的左子树的结点为空,但是右子树的结点不为空时,正常打印左,右结点的括号。对于图中的树,第二层只有两个结点,姑且可以人为创建两次入队列的操作,但是对于下面层的结点,例如结点的数量为。结点的左子树结点为空,但是结点的右子树结点不为空,此时正常对结点的左子树结点的括号进行打印。,如果不为空,则正常打印左结点的括号,如果为空,则不打印左结点的括号。结点的左,右子树结点都为空,因此判定为左,右子树都找不到结点,所以将。
2024-03-29 00:02:43
822
原创 代码随想录(day8)——字符串
对于多余的字符,分别为第一个字符前面的空格和最后一个字符后面的空格,以及两个单词之前非第一个空格。中倒置字符串一题极为相似,但是对于本题,单词之间的空格并不是只有一个,而是若干个。对于本题,题干中的条件看起来十分复杂,其实可以归结于一种分支情况,即每次都读取给定字符串。对于第二种方法,可以首先遍历一遍给定的字符串,并且创建一个变量。来进行的,所以,在遍历整体的字符串时,每次都遍历。由于对于字符串的反转,每次都是以。此时的字符串的大小就等于将所有的数字都改为。,因此,直接对剩余的字符全部进行反转即可。
2024-03-23 15:23:14
951
原创 代码随想录(day7)——哈希表
对于三数之和这道题,相对于两数之和的难度有明显的上升,如果说两数之和作为梦开始的地方,那么三数之和可以说是梦结束的地方。这是因为本题相对于两数之和只需要控制两个变量进行判断变成了需要控制三个变量,并且,题目中要求了答案中不可以包含重复的三元组,例如。虽然文章的标题为哈希表,但是对于三数之和,以及后面的四数之和,使用双指针的方法能更加容易的解决问题。,要么数组中同时存在正数,负数,所以,如果数组的第一个数已经。再排序完成后,由于题目要求需要找到三个数的和。的元组的数量,对于这个问题,可以抽象的看成,查找在。
2024-03-20 18:45:19
739
原创 进阶了解C++(5)——搜索二叉树
而对于合适的值的选择,需要同时满足两个条件:大于待删除结点的左子树根结点存储的值,小于待删除结点的右子树根结点存储的值。对于搜索二叉树,其单个结点的结构与二叉树相同,即:一个用于存储数值的变量,两个指针变量,一个指向其左结点,一个指向其右结点。在删除一个结点之前,首先要找到这个结点,以及这个结点的父结点,对于这类操作在插入中已进行了解释,因此不再过多叙述。对于拥有两个叶子结点的父结点的删除,文章本处选择替换删除法,即:先找到一个合适的值用于替换待删除结点的值,随后进行删除。,因此,无法在外部直接进行访问。
2024-03-19 20:58:01
636
原创 代码随想录(day6)——哈希表
但是在题干中,提到了在求快乐数的过程中,将这个数替换为每个位置上的数字的平方和的过程是无限循环的,例如文章给定一个数。因此,如果运算次数够多,对于任何一个数,均存在一个无限循环。,假设,每进行一次上方的运算,都会得到一个属于上面区间中的不同的数值,那么,在进行。如果对这个最大的数值进行一次上面的操作,则不难得出,这个数是一定小于。中出现过,如果出现过,则说明进入了上图中非快乐数的死循环,返回。的,因此,对于这个数据在求解快乐数时产生的数据的范围一定是。,只有在给定字符串长度想的的情况下才进行下一步的判断。
2024-03-17 16:18:43
1033
原创 代码随想录(day4)——链表
本题较为简单,在题干中可以看到,系统给定的样例存在空链表,因此,为了避免空链表造成的访问错误,本题也采用人为添加哨兵位头结点的方式。在演示了上述过程后,不难看出,如果想要交换两个结点需要在这两个结点中,靠前一个结点的前一个结点最为起始结点开始操作,对于上述链表,如果想要对。结点后,进行下一次交换操作的起始结点应该为链表中的第四个结点。因此,对于链表中结点个数为奇数个的情况,应该检查结点的下下个结点是否为空。但是,这种情况只适用于链表中的结点为偶数个。结点操作后,下一次进行操作的起始结点的位置在链表中的第。
2024-03-14 21:53:00
979
原创 代码随想录(day3)——链表
在进了了上面的删除后,此时链表中,所有需要删除的头结点都已经被删除。因此,为了解决上述问题,可以在给定的链表的头结点之前,人工添加一个哨兵位头结点。对于本题,难点就在于对于头部结点的删除,以及给定链表为空时,如何进行遍历。对于删除结点函数,需要注意,按照删除结点的逻辑,在遍历时,能遍历到的最后一个结点便是链表中倒数第二个结点。在此处,考虑到遍历链表的过程中,需要不断访问不同的结点,因此,再设置一个专门用于遍历链表的结点。,如果不检查,在检查结点的值这一条件是否满足删除所对应的条件时,由于。
2024-03-12 23:57:50
916
原创 代码随想录(day2)——数组
由于数组中存在负数,并且,题目中给出了给定的整数数组是按照非递减顺序排序的,因此,在抛去两个元素相等的情况下,数组中的第一个元素,一定是数组中最小的负数,数组中最后一个元素,绝对是数组中最大的一个正数。对于滑动窗口,起始可以看作一种特殊的双指针,对于之前的双指针,针对于目标都是单个具体的元素,但是对于滑动窗口,两个指针表示一个区间的起始位置和终止位置。如上图所示,对于螺旋矩阵的四个边,需要分四次进行处理,为了降低临界条件对于复杂度的影响,在处理螺旋矩阵的第一行时,只向里面填充四个元素,即。
2024-03-09 23:33:26
995
原创 C及C++每日练习(3)
中给出了详细的解释,这里只进行大概的说明:对于常量指针,表示指针指向的内容为常量,不能通过解引用的方式来修改指向的内容,但是可以改变指针的指向,即可以指向另一个常量。对于指针常量,表示指针本身就是一个常量,因此,不能改变指针的指向,但是可以通过解引用的方式来改变指针所指向的内容。函数,其需要打印的变量的入栈参数是从右向左入栈的,并且从高地址进行入栈,因此,三个变量入栈的顺序为。是将四个字节的内容以十进制的方式进行打印,因在打印时,首先打印后进入的内容的前四个字节的内容,即。
2024-03-08 22:38:54
765
原创 代码随想录(day1)
但是由于上述移除元素的过程,将这些元素整体向前移动了一位,因此,为了针对这种特殊情况,需要将。由于数组是一块连续空间,因此,在删除数组中的元素时,并不能直接进行删除,例如删除下列给出数组中值为。题目中要求,需要在不开辟额外空间的情况下,额外修改数组,删除数组中数值等于。对于上述过程,看作一次移除元素,由于移除了一次元素,因此需要将数组的长度。对于数组中的删除,其实是对于元素的覆盖,例如,删除上面数值为。,表示需要查找的元素在数组的右半部分,此时需要更新。,表示需要查找的数在数组的左半部分,此时需要更新。
2024-03-06 23:43:40
1137
原创 C及C++每日练习(2)
对于代码的前两行,都是创建一个常量字符串,只不过采取的放肆不同,不过需要注意,在第一行代码中,由于是一个完整的字符串,因此,在字符串的末尾带有字符串的结束标志。表示指针指向的内容是常量内容,因此,指针指向的内容不能被修改,也就是说,不能通过解引用的方式来改变指针指向的内容,但是,可以改变指针本身的指向。解引用,修改指向的内容,由于指针式常量指针,即指针指向的内容是常量,可以修改指针的指向,但是不能更改指针指向的内容,因此错误。,因此,这句代码表示的含义是,解引用,拿到数组中第一个数,随后对这个数。
2024-03-05 20:12:50
5937
7
原创 C及C++每日练习(1)
针对此题目,需要注意,不同类型的变量在进行运算时,会出现自动提升的机制,即表示数据范围小的类型会自动提升到表示范围大的类型,在题目给出的类型中,,则分为算术右移和逻辑右移,对于题目,一般默认采用算术右移,即右边丢弃,左边补上符号位,负数补。个队伍,每个队伍均有三名选手,对于每个选手都定义了一个水平值,为了方便表示,这里将水平值定义为。所以,解决题目的重点有两个,一是将选手的水平值排列成升序序列,此问题比较简单,直接调用。,因此,并不符合循环的判断条件,因此不会进入循环,所以直接返回。
2024-03-02 14:45:55
4698
6
原创 进阶了解C++(4)——多态
此时,在监视窗口中进行查看,子类对象的虚表中并没有出现新的虚函数的函数指针,但是在内存窗口中,却出现了一条新的地址,对于这个新的地址,一般认为就是子类中新加入的虚函数。对于如何获取虚表指针,本文提供一种方法:由于虚表指针存储在一个类的前四个字节,因此,只需要初始化出一个该类的对象,首先获取这个对象的指针,在将这个指针强转成。是靠后的,因此,在子类中,存在着两张虚表,这两个虚表分别有着自己独立的地址。而对于紫线连接的两个虚函数,由于虚函数并未在子类中发生虚函数的重写,因此,父类,子类中俩个虚函数的地址相同。
2024-02-29 23:32:21
1284
1
原创 进阶了解C++(3)——多态
对于第一种情况,称之为协变,即:子类重写虚函数时,子类中的虚函数的返回类型与父类中的虚函数的返回类型不同。此时的输出符合多态调用。但是,按照前面给出的关于多态的定义,虚函数的重写需要满足返回类型,函数名,参数都相同。通过对于可以发现,被重写的虚函数,在父、子虚表中函数指针指向的虚函数是不同的。对于上述给出代码,其想要达到的目的是,通过函数输入的参数不同,来输出不同的票价,例如参数输入学生,则输出半价票。多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。
2024-02-27 20:45:27
785
1
原创 进阶了解C++(2)——复杂的继承
在上篇文章中,给出了关于继承这部分的相关知识,例如继承的定义,继承与默认成员函数等。如果只是想掌握继承的使用方法,则可以忽略文章中第二部分的内容。假设上图给出的结构代表一个继承体系,根据上面对与数据冗余和二义性的介绍,上图中,在。对于菱形继承,其存在着一个问题,即数据冗余和二义性。对于这种一个子类有两个或者两个以上的直接父类的关系,叫做多继承。造成数据冗余和二义性的源头上,例如图中,造成上述问题的源头是因为。通过上面给出的图片可以看出,此时编译器并不知道,需要访问的变量。类继承过来的内容从而造成数据冗余。
2024-02-23 23:50:43
973
原创 进阶了解C++(1)——继承
此处发生两次析构的原因如下:第一次析构时因为显式调用了析构函数,第二次析构可以看作编译器的一种特殊情况,即:析构函数的调用顺序为先子后父,也就是调用了子类的析构函数后,编译器会自动去调用父类的析构函数。通过上面给出的现象,给出继承体系中关于默认成员函数的规则:对于子类中的定义的成员变量,会根据变量的类型来进行作用。对于子类中继承的父类的成员变量,则会去父类中调用相应的构造函数等。在之前类与对象中的文章中提到过,这种行为被称为函数重载,即函数名相同,参数类型或者参数个数不同的两个成员函数所构成的关系。
2024-02-23 14:50:07
711
1
原创 C++(18)——适配器概念以及stack、queue、优先队列的模拟实现
在对的相关实现原理进行介绍前,首先来总结之前介绍的两种容器:的优缺点:对于,在前面对其进行模拟实现的文章中提到,可以将看作之前数据结构中的顺序表,其特点是存储空间在物理以及逻辑上的连续性。因此,借由连续性可以得出,的优点在于通过下标可以对空间中的内容进行随机访问。并且缓存命中较高对于其缺点,则是头部或者中间进行插入、删除元素时的效率过低,以及一次性开辟较多空间时带来的损耗对于,同样提到,可以将其看作成带哨兵位头结点的双向循环链表,其特点是存储空间在逻辑上连续,但是在物理上不连续。
2024-02-20 22:13:17
921
原创 C++(17.5)——list模拟实现扩展
在上篇文章中,实现了的大部分功能以及部分迭代器。本片文章将对剩下的功能进行补充。对于上篇文章中实现的迭代器只能使用于非类型的对象。对于类型的遍历,则需要额外编写类型的迭代器。对于与非类型的变量的区别,是类型的对象不能修改。因此,实现迭代器的第一种方法,便是将非迭代器的相关代码进行复制然后进行改动,基于类型本身的性质,只需要将函数的返回值类型改为在完成上述步骤后,还需要在中,引入__,并且为了方便书写,利用函数将其改写为。
2024-02-01 21:48:18
826
1
原创 C++(17)——list的模拟实现
需要注意的是,在定义链表的起始时,并不能定义成哨兵位头结点,因为哨兵位头结点并没有保存数据,在访问链表时,需要从第一个保存数据的结点开始访问。这个自定义类型,而是这个类型的指针,而指针是一个内置类型,因此,不能直接完成对于指针的重载。的结构可以近似的看为链表,由于链表的空间不连续,因此,在使用迭代器进行访问时,对迭代器。在删除任意位置的结点前,首先需要找到这个结点的前结点和后结点的地址,为了方便表达,用。中,由于这两种数据结构的空间是连续的,因此,在实现其迭代器功能时,通常先利用。获取下一个结点的地址。
2024-02-01 16:10:54
2066
原创 C++(16)——vector的模拟实现
前面的文章中,给出了对于的模拟实现,本篇文章将给出关于的模拟实现。对于类,主要是针对于字符型变量这一种数据类型,但是对于,要同时适用于不同的数据类型,对于这一点,可以利用之前中的模板参数来实现。在中的源代码中,类中的成员变量分别为。三个变量的类型都是迭代器。其中表示开头,表示已有内容的结尾,表示开辟空间的结尾。通过上述信息,可以给出对于的构造函数,直接初始化为即可。因为三个成员变量的类型是由内置类型经过后的。
2024-01-29 01:40:47
910
1
原创 C++(15)——vector
中同样可以使用迭代器对内容进行访问,这一部分内容将在下面介绍迭代器的部分统一给出。会通过向容器的末端插入元素的方式来达到扩容的目的,并且会同时改变容器的。对于二者的差距,表现为是否可以修改迭代器指向的内容,例如,对于非。函数的构造是利用迭代器进行构造的。并且,如果不人为给出扩容时插入的元素,则默认插入。虽然都可以达到改变容量的效果,但是却又一定的差别。,但是会影响容器中的内容,以及容器的。的相关函数,以及部分函数的使用方法。函数的作用,此处先引入一个新的函数。其作用可以看作顺序表中的尾插。
2024-01-25 14:11:57
967
原创 C++(14.5)——再谈拷贝构造与深浅拷贝
上篇文章中,通过模拟的方式完成了类对象中常用的函数。在本篇文章中,将通过一个例子来进一步说明拷贝构造与深浅拷贝。注:本文需要使用上一篇文章中模拟实现关于类的函数上述代码的目的是将中存储的网址进行分隔。但是当运行代码时,编译器会显示错误:对于通过上述代码,不难得出其整体逻辑为:函数返回类型的对象作为右操作数用来给赋值。由于函数的返回值不是引用返回,所以,函数并没有返回本身,而是返回的一个临时拷贝,为了方便描述,这里命名为。
2024-01-23 15:53:50
942
2
原创 C++(14)——string的模拟实现
在介绍引用时,提到,引用返回相对于指针返回有两个有点,一是速度更快,二是可以修改返回值。中提到了初始化列表的概念,但是从上出给出的三个成员变量不难看出,三个变量全是内置类型,因此,对于内置类型的初始化,直接在函数内部进行,由于。以及其相关函数的使用,为了更清楚的了解这些函数的作用,本篇文章通过模拟实现的方式来加深对于函数作用原理的理解。对于第一组变量,通过前面对于模板的了解得知其会去自动调用模板函数,对于第二组变量,在没有第一、二种。对于第一种情况的删除,并不需要真正的将字符一个一个进行删除,只需要将。
2024-01-20 23:12:34
949
1
原创 C++(13)——string
类型的对象或者字符串或者字符,在不给定参数的情况下,在给定的上述三个类型中,从另一个。此函数的使用方法与上一小节中的方法相同,只是参数的类型发生了改变,故不再赘述。函数的两个参数如上述代码所示,此函数的主要作用是根据一个已有的。find_first_of函数,其大体意义如下:给定一个。如果需要将上述对象中所有在字符串中出现的字母,即。类型的对象的内容分离,在进行分离时,常常会和。主要用于对一个已有的。为范围内的内容生成一个新的。类型的对象进行分隔。类型的对象出现时替换为。例如:给定一个字符串。
2024-01-17 22:08:21
503
原创 C++(12)——string
上篇文章中,介绍了中一些函数的应用。本篇文章将介绍其他中相关函数的应用。对于本部分标题中的函数,其作用为在已有类型的对象的第个位置插入另一个对于本部分标题中的函数,其作用为在已有类型的对象的第运行结果如下:对于本部分标题中的函数,其作用为在已有类型的对象的第个位置插入另一个另一个常量字符串的前运行结果如下:对于本部分标题中的函数,其作用为在已有类型的对象的第个位置插入个连续的字符。例如在一个类型的对象的第个位置插入两个连续的字符运行结果如下:此外,本函数经常用做在。
2024-01-17 19:31:19
1055
原创 C++(11)——string
文章将对上述图片中某几个常用的函数进行介绍,其他函数的使用方法可以通过上方网址进行查阅。对于二者的不同点,可以认为第一种可读可写,但是第二种只能读。,是用于反应这个对象中字符串的长度的。进行扩容时,扩容后的大小并不一定等于预设的值,通常会大于这个值。的大小只和该类型能够存储多少内容有关,与对象中是否有内容无关。只能改变空间,并不能影响对象中的内容。类对象进行缩容时,并不能缩小到这个对象的最小容量。上面说到,对于第一种方式,不光可读,而且可写,因此,让。进行扩容后,发现,此时扩充的部分的值全部为。
2024-01-15 16:46:46
901
1
原创 C++(10)——模板
在编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用。比如:当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然后产生一份专门处理double类型的代码,对于字符类型也是如此。而对于本篇文章的主题模板,便是泛式编程的基础。但是这种做法同样存在缺点,即只能针对一种单一的类型,如果需要存储两种不同类型的数据,则需要将上述代码进行一次复制,再改写。的类型的过程称之为模板的推演,把推演后,编写函数的过程称之为模板实例化。
2024-01-13 01:18:32
1098
原创 C++(9.5)——浅谈new和delete的实现原理
此处可以看出来,针对自定义类型,在释放空间时,并不能区调用。时就提到,当成功的开辟空间后,返回值会返回这块空间的起始地址。不难发现,两个全局函数只能开辟空间,并不能像操作符一样调用构造函数或者析构函数。针对自定义类型会去调用自定义类型的构造函数,在构造函数中,再开辟一次空间。中,面向对象的编程并不能在失败用返回值进行处理,而是需要抛异常,对。对于这两个关键字开辟空间或者释放空间的功能的原理,是借助。一样释放掉开辟的空间,而是释放掉空间中的资源,也就是指针变量。开辟空间,调用构造函数对空间进行初始化。
2024-01-12 22:21:48
1378
原创 C++(9)——内存管理
在上面的使用方法中,同样无法完成对于开辟空间的初始化。如果想初始化开辟的空间,例如将开辟的一个类型为。等函数完成的,在数据结构中,经常在创建一个关于数据结构的单个结点时使用。但是,这些函数针对于自定义类型并不能解决初始化的问题。来完成开辟自定义类型空间时的初始化问题。,其动作过程也可以分为两步: 调用自定义类型的析构函数、释放空间。,只能开辟空间,并不能对开辟的空间进行初始化。通过结果可以得知,在开辟空间时调用了自定义类型。在C语言中,对于内存的管理通常是使用。不难发现,在上述代码中,开辟了。
2024-01-12 17:22:59
1091
原创 C++类与对象基础(8)
在之前关于流插入、流提取这两个运算符进行运算符重载的时候就提到过,由于这两个运算符在重载时,需要保证两个参数的顺序,因此,需要把此运算符重载作为全局函数而非成员函数,但是,成员函数在类中访问限定符为私有的情况下,全局函数不能访问成员变量,因此,需要采用友元的方式,让全局函数可以访问成员变量。3.比如上述Time类和Date类,在Time类中声明Date类为其友元类,那么可以在Date类中直接访问 Time类的私有成员变量,但想在Time类中访问Date类中私有的成员变量则不行。
2024-01-10 22:05:01
794
原创 C++类与对象基础(6)
取地址操作符重载是默认构造函数,他的性质与构造函数类似,当不人为编写上述两个重载时,编译器会自动生成,当认为编写两个重载时,编译器会去调用已经编写好的。这是因为,对于双操作数的运算符,第一个参数是左操作数,第二个参数是右操作数,之前的文章中多次提到,对于成员函数来说,通常会有一个隐藏的参数,即。,为了避免此问题,可以将运算符重载的声明放在类之外,即作为一个全局函数,而非一个成员函数。需要注意的时,这两个函数不光类型不同,其参数类型也不同,对于。可以正常运行的原因。封装在一个类的成员函数中,进行调用的。
2024-01-08 22:29:14
986
原创 C++基础(4)——类与对象(默认成员函数)
由于C++规定自定义类型传值或者值拷贝需要调用拷贝构造,因此在第一次传参后,并没有直接去调用拷贝构造,而是编译器额外新生成一个拷贝构造函数,并且去调用新生成的拷贝构造函。通过对上述日期类和栈类的调用,会发现,在日期类进行传值调用或者说进行浅拷贝时,并不会出现错误,而对于栈这个类则会报错。函数时,首先需要传递参数,此时传递参数的方式为传值拷贝,因为,会调用拷贝构造函数,由于拷贝构造函数的参数是类型对象的引用,因此参数。上面提到,两个对象中的指针指向了同一块空间,因此,本次清理时,会造成错误,
2023-11-23 20:21:26
945
原创 C++基础(3)——类与对象
构造函数定义如下:构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务并不是开空间创建对象,而是初始化对象。
2023-11-16 19:25:20
314
原创 C++基础(2)——类和对象
这是因为,在每次调用时,类中的变量都会接收不同的值,而函数除了传递的形式参数没有任何变化,因此,在类中,变量是独立存储的,而函数,则是在一个公共空间中存储的。从上面给出的代码不难看出,利用C++对栈的相关代码进行改写时,不但让函数中的参数数量减少,并且还化简了C语言中与栈相关的功能函数的函数名。而在C++中,因为类的作用域(对于类的作用域将在文章后部给予相关解释,本处只是提出这个概念关系,并且可以在类中定义函数,因此,可以在不同的类中,同时定义。因此,对于上述无成员变量的类的对象(a),大小为1字节。
2023-11-12 22:15:15
445
原创 C++基础——对于C语言缺点的补充(2)
这是因为在这种返回类型下,返回值并不能确定,如果编译器在函数结束后直接清理掉栈帧,则返回空,如果编译器在函数结束后,并不会立即清理掉栈帧,则返回还能有返回值。运行程序,编译器会报错。这是因为在存在一个不含参数的函数与另一个有参数,且参数有缺省值的情况下,同时运行两个函数会造成二义性,即:编译器不能判断在。运行此代码时,并没有错误,不难观察到,上下的给的代码唯一的差距就是第二次给出的代码的引用前加了。,但是这两个函数的返回值类型,以及参数类型都不同,此时符合上方函数重载的定义,构成了函数重载。
2023-11-06 20:53:11
426
原创 C++基础——对于C语言缺点的补充(1)
在了解了命名空间冲突这一概念后,会发现,在C语言中,当需要定义的变量数量较多时,容易发生命名空间冲突这样的错误,在C语言中,也并没有提供解决命名空间冲突这一问题的方法。输入、输出这两个功能在日常的测试中使用频率很高,不采用命名空间展开,在使用时,使用方法较为繁琐,但是展开命名空间并不一定安全,为了解决上面的两个问题,引出在命名空间这一章节中说到,命名空间的展开存在一种部分展开的方式。虽然命名空间的展开可以达到简化访问命名空间中变量的作用,但是,并不能轻易展开命名空间,例如C++中自带的命名空间。
2023-11-04 23:19:26
197
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人