- 博客(11)
- 收藏
- 关注
原创 C++中关于菱形继承当中的两个小问题
所以在创建Postgraduate对象的时候,底层中Person类并没有存放在Student和Teacher中。如果想要避免这个问题,我们可以在继承方式关键字的前面加上virtual关键字。找不到Person的构造函数,但是明明有Person的构造函数。那么现在问题来了,virtual关键字应该加在哪里呢?而是被放在的一个公共的区域,一般是整个对象的最下面。在C++中菱形继承会产生数据冗余和二义性的问题。ABCDE是五个类,线表示他们之间的继承关系。,这样在E类中就不会产生这个问题。
2025-02-01 23:57:39
226
原创 vs2022中编译器报错”C1001内部编译器错误“的一种可能
但是vs2022做了一些升级,也就是尽管在这个类模板中的成员函数你不去调用它,编译器在检查时也能够发现问题!你不调用成员函数,语法错误就检查不出来,因为没有被实例化!也就是按理来说,就算这个成员函数出现了语法错误,只要不调用,编译器也发现不了。正常vs2022报错的时候,都会给出具体的原因,但是这种报错并没有给出具体原因。但是,这个成员函数没有被实例化,编译器知道有错误,但不知道具体是哪里的错误。类模板中的成员函数,在不调用的时候,并不会实例化!自己的一个判断语句少写了一个分号,补上就不会报错了。
2025-02-01 23:12:10
616
原创 C++继承中同名函数的一些问题
现在有一个Person类和一个Student类,Student是Person的子类,这两个类中有一个同名函数print。可能大部分人第一想到的就是构成函数重载关系,那么如果是这样的话,我运行后,结果应该是调用父类中的print。现在问题来了,这两个print函数构成什么关系?但是运行后发现,调用的是子类中的print?这样调用的就是父类中的print。说到这里,如果是运算符重载,
2025-01-31 19:17:54
355
原创 C++中模板的一些问题
因为array的[]访问实际上是调用了operater[]的运算符重载,调用了assert函数,所以无论是在越界读取还是修改时都会报错。而传统的数组实际上是指针的解引用,越界访问的报错是由于设计了标志位,当越界过多时,可能越界访问后仍然不会报错,所以arra。C++20以前的模板只允许用整形,C++20新增加了对于浮点型double的支持。所以在C++11中新增了一种新的容器就是静态数组arrey。可以看到arr[20]显然已经越界了,但是并没有报错。因为模板只有在实例化的时候才会编译,所以不会报错。
2025-01-30 18:57:39
167
原创 用C语言实现一个希尔排序
例如,对于增量序列 n/2, n/4, n/8,将数组分成 n/2 个长度为 2 的子数组,n/4 个长度为 4 的子数组,n/8 个长度为 8 的子数组,依此类推。例如,可以选择增量序列为 n/2, n/4, n/8, ..., 1,其中 n 是待排序数组的长度。较好的增量序列可以减少比较和移动的次数,从而提高排序的效率。根据不同的增量序列,希尔排序的时间复杂度可以是O(n^1.3)、O(n^1.5)或者O(n^1.7)等。希尔排序的关键在于选择合适的增量序列,不同的增量序列会对排序性能产生影响。
2024-11-07 16:30:58
362
原创 用C语言实现一个插入排序
当tmp比数组end下标中的数要小时,就让end下标的数据往后移一个下标,end减一,知道tmp大于或者等于数组中的数的时候,说明找到了tmp的位置,这时end下标中的数和end+1下标中的数是一样的,将end+1下标中的数据赋值于tmp,就完成了一次插入排序。插入排序是一种简单直观的排序算法,基本思路是将一个序列分为有序部分和无序部分,每次从无序部分中取出一个元素,插入到有序部分的适当位置,直到所有元素都被插入到有序部分为止。2. 将当前要插入的元素与已经排好序的元素进行比较,并找到合适的位置。
2024-11-07 15:42:16
353
原创 C/C++快速排序(非递归)
常规的用递归定义的快排,当递归层数特别多的时候,容易造成栈溢出的问题,用一个数据结构的栈来模拟快排中的递归就能很好的解决这个问题。接着将key值的右区间入栈后再把左区间入栈。(栈后进先出,先入右区间,再入左区间,那么先排序的就是左区间)就是当栈中没有区间的时候,也就意味着所有的数据都排完了,这时循环结束,完成快排。先快排一次,然后将key值左边的区间继续快排,再将key值右边的区间快排。然后在左区间出栈后继续将左区间的key值的右区间入栈,再将左区间入栈。用c写一个快排(我为了省事写栈的时候用了c++)
2024-11-05 22:47:22
310
原创 关于单链表中开辟新节点传递一级指针导致访问越界的问题
可以看到,如果我传递的是一个空链表,那么就直接将传递来的指针连接上新节点,否则就先找到这个链表的尾节点。于是我想到可能是回传时newnode节点的地址变了。我分别打印了返回前和返回后的地址,结果确实如此。在调试过后,发现在开辟新节点时候初始化的节点,在返回值的时候导致了数据的丢失。不难发现,返回时数据丢失了,导致在尾插代码中的tmp->next指针无法访问。这是返回前的newnode的节点中的数据,可以看到已经被初始化了。但是我用malloc开辟的空间是在堆区开辟的,不应该被自动回收。
2024-08-27 22:27:30
471
原创 C++中的引用
可以看到a的值并不是10,这是因为在test函数结束时局部变量的空间就被收回,这时我们再去打印a就属于非法操作。用引用作为形参,传参时相当于创建了一个姓名相同的参数 也指向实参的内存空间,所以在修改形参时,实参也会改变。C++推荐使用引用,因为语法方便,但是所有的指针操作都由编译器来完成了。2.如果函数的返回值是引用,那么它可以作为表达式的左值。引用的本质在C++的内部实现就是一个指针常量。所以引用做函数参数的优点就是可以简化指针。修改b的值的同时a的值也会改变。2.引用在初始化后,不可以更改。
2023-12-06 18:37:34
95
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅