- 博客(25)
- 收藏
- 关注
原创 2025年12月29日的语法错误
总结:虽然结果看起来一样,但 cat test.txt 是"命令读取文件",而 cat < test.txt 是"Shell把文件内容喂给命令"。在简单查看文件时效果相同,但在复杂场景下工作原理不同。
2025-12-29 21:06:19
63
原创 linux的基本指令
下图的hello.c本来是在112_class文件中,但是使用命令 mv hello.c ../ ,也就是将hello.c文件移动到了其上级目录;即 cat < text.txt,就会显示txt中的内容,虽然看起来是一样的,但是底层不一行,具体可以参考链接下的我的另一篇文章;,所以你 键盘、显示器都是文件,所以你其实是在往键盘这个文件中写东西,然后显示器这个文件会自动拷贝一份你写的文件,然后输出;这样看来echo好像没什么用,其实不然,比如你前面用nano打开的写的文件你需要补充一点短小的内容,就可以用。
2025-12-29 21:04:30
753
原创 虚函数表(虚表)
首先需要明确的是虚函数就是放在虚函数表中的,这里的虚函数本质是指针,而虚函数表本质上是指针数组,所以虚函数的指针会放在里面;即使子类没有重写任何虚函数,子类也会有自己独立的虚表(内容与基类虚表相同,但是不同的副本)。虚函数是运行时绑定,也就是动态绑定,而普通函数是编译时绑定,静态绑定,所以虚函数指定是哪个,就在哪个对象的虚表中去找对应的韩式,故而实现了多态;虚表是编译期间生成的,存放在程序的可执行文件的只读数据段中。运行时直接使用,不会动态生成。
2025-12-26 19:03:38
921
原创 继承和多态
严格来说“被virtual修饰的函数”不一定就是虚函数(必须是非静态成员函数):构造函数不能是虚函数,普通成员函数才可以设为虚函数(此外还有如静态成员函数也不能是虚函数)。纯虚函数是在基类中声明为 virtual 返回类型 函数名(参数) = 0 的特殊虚函数,它没有(或不要求)基类实现,强制派生类必须重写该函数,从而使该类成为抽象类,无法实例化,用于定义统一的接口规范。class Shape { // 抽象类public:// 纯虚函数// 纯虚函数可以有函数体(可选)// 普通成员函数。
2025-12-25 21:28:37
623
原创 priority_queue(底层是堆)
自动排序 + 快速取极值优先队列是一种容器适配器,其特殊设计使得它的第一个元素始终是所包含元素中最大的(默认)
2025-12-25 17:24:03
293
原创 vector
注意:capacity的代码在vs和g++下分别运行会发现,vs下capacity是按1.5倍增长的,g++是按2倍增长的。遇到6: 3 ^ 6 = 5 (6被抵消,只记住5) 遇到7: 5 ^ 7 = 2 (记住5、7)遇到4: 2 ^ 4 = 6 (记住5、7、4)遇到7: 6^ 7 = 1 (抵消7,记住5、4)遇到5: 0 ^ 5 = 5 (记住4) 遇到6: 5 ^ 6 = 3 (记住5和6)注意:end返回的是最后一个数据的下一个位置的迭代器。遇到4:1^4=5(抵消4,记住5)
2025-12-23 21:44:47
349
原创 string/STL的基本认识
(1)string是表示字符串的字符串类(2)该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。(3)string在底层实际是:basic_string模板类的别名,string 是模板类针对char类型的特化:(4)不能操作多字节或者变长字符的序列。(5)在使用string类时,必须包含#include头文件以及using namespace std;2.2string类的常用接口(我们直接用在代码中看它的作用)2.2.1构造和析构函数。
2025-09-24 15:39:22
729
原创 代码方圆:模板之初构
(1) 模板就是一个万能模具,让你写一份代码,就能让编译器自动生成处理各种不同类型的具体 代码。(2)模板分为函数模板和类模板1.3泛型编程和模板的关系模板是泛型编程的基础函数模板是一个通用函数“配方”,它使用类型占位符(如T)来表示参数和返回值的类型,使得同一个函数能够处理多种不同类型的数据。
2025-09-24 11:37:10
275
原创 malloc/free和new/delete的区别
的共同点是:都是从堆上申请空间,并且需要用户手动释放。在申请空间后会调用构造函数完成对象的初始化,只会开辟空间,不会调用构造函数与析构函数,而。申请空间时,需要手动计算空间大小并传递,只需在其后跟上空间的类型即可,在释放空间前会调用析构函数完成。申请空间失败时,返回的是。申请的空间不会初始化,,因此使用时必须判空,申请自定义类型对象时,
2025-09-23 21:17:05
238
原创 C/C++内存管理修炼指南
以上就是程序的内存区域划分;想象一下,一个程序就像一个厨师,而内存就是他的大厨房。(栈)(1)位置:厨房里有一个固定的、不大的台面。(2)用途:厨师把正在做的菜的食材(局部变量)放在这里。比如切好的葱姜蒜。(3)特点:用完即清。这道菜做完(函数调用结束),台面就会被清空,食材扔掉。井井有 条,但空间小。(堆):(1)位置:厨房旁边一个超大的、可以自由使用的仓库。(2)用途:存放不常用但量大的食材。比如一整袋米、一大桶油(动态分配的大对象)。(3)特点:需要自己管理。
2025-09-23 21:12:13
753
原创 C++ static & const 成员函数面试题核心要点
静态成员函数不能直接调用非静态成员函数,因为缺少this指针,但可通过传入对象实例间接调用;非静态函数可以自由调用静态函数。const对象只能调用const成员函数以保护数据不被修改,而非const对象可以调用const成员函数。const成员函数内不能调用非const成员函数,否则会破坏const语义。这些规则体现了C++对对象访问权限的严格类型安全检查机制。
2025-09-21 21:27:42
428
原创 “内存对齐“相关面试题解答
(1)大小端决定了多字节数据(如整数)在内存中的存储顺序。你可以把内存地址想象成从左(低地址)到右(高地址)的格子。小端模式像“倒着放”:数据的低位字节(如个位)存在左边的低地址,高位字节存在右边。大端模式则像“正着放”:数据的高位字节(如百位)存在左边,更符合我们书写数字的习惯。(2) 使用联合体int main()unionint i;} test;// 设置一个int值{ // 检查低地址处的字节是否是最高位字节{ // 检查低地址处的字节是否是最低位字节else。
2025-09-20 12:22:21
819
原创 C++初窥:从青萍之末开始
简单来说命名空间就是为了解决大量在全局作用域中的函数,变量,类的命名冲突问题而产生的,用关键词namespace来定义。// 1. 正常的命名空间定义namespace bit // bit是命名空间的名字,一般开发中是用项目名字做命名空间名。// 命名空间中可以定义变量/函数/类型/结构体int val;在定义和声明函数的时候,为函数的参数指定一个缺省值,这个就叫做缺省参数,如果没有给函数的参数定义值,就用这个缺省参数。
2025-09-18 21:17:28
915
原创 二叉树第二弹---详解版
依然假设树的高度为H,树中有N个节点,如下图,对于这样的一个完全二叉树,我们要求它的N,N=2^0+2^1+...+2^(H-2)+1,再次使用错位相减法,N=2^(H1),H=logN+1(注意这里得log都是以2为底的)假设高度为H,树中有N个节点,则H和N的关系为,N=2^0+2^1+2^2+...+2^(H-1)=2^(H-1),使用错位相减法,如下图,H = log(N+1)(注意这里得log都是以2为底的)。同上,使用错位相减法,则使用向下调整法,时间复杂度为O(N) = N-log(N+1)
2025-09-13 17:35:52
381
原创 类和对象详解---中
①第一个参数必须是类类型对象的引用,可以有多个参数;如果不是,后面的参数必须有缺省值;②如果一个类显示实现了析构,并且释放了资源,呢就需要写拷贝构造;③传引用返回可以减少拷贝,但要保证返回对象,在当前函数结束后还在;④C++规定,自定义类型对象进行拷贝行为必须调用拷贝构造;
2025-03-24 20:24:44
237
原创 二叉树第一弹 -----详解版
树是一种非线性的数据结构,它是由n个有限结点组成的一个具有层次关系的集合。一个数据,比如说插入一个5,5<8,看8的左边,5>3,看3的右边,5<6,看9的左边,5>4,所以最终,5在4的右边。一层一层依次存储,会造成一定的浪费,此时它的物理结构是数组,逻辑结构是二叉树。: 一个节点含有子节点的根节点称为该节点的子节点。:以某节点为根的子树中的任一节点为该节点的子孙;: 一个节点含有的子树的个数称为该节点的度,如图A的度是3。: 度不为0的节点。: 若一个节点含有子节点,则为父节点,如图A是C的父节点。
2024-10-21 16:42:08
584
2
原创 用栈实现队列——C语言版本
这道题目前我知道的最简单的实现办法是,用两个栈,一个栈进行插入(pushst),另外一个栈实现队列的出队列操作(popset)。4.实现检查popst的栈顶元素操作,如果不为0的话放到myQueuePop中,实现队列的删除,如果不为0,就把pushst中的全部元素插入到popst中。首先最基本的是得有一个栈的接口,我们想要用栈实现队列,先需要了解一下队列的特点,也就是 "先进先出",而栈的特点是"后进先出"。3.实现在pushst栈中插入元素操作。1.定义元素为栈的结构体。5.进行队列的删除操作。
2024-10-16 22:23:10
274
原创 认识栈和队列
首先,栈是一种"线性表",底层究竟是什么,并没有明确的规定,但它只允许在固定的一端进行插入和删除,这个特殊的一端称为"栈顶",当然了另一端称为"栈底",栈里的数据遵循一个原则"后进先出借用我同学的一个比喻,就像羊肉串一样。
2024-10-15 22:05:30
429
原创 整数和浮点数在内存中的存储
同时,加法和减法也可以统⼀处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。对于32位的浮点数,最⾼的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M。那么,按照上⾯V的格式,可以得出S=0,M=1.01,E=2。反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。原因在于,使用补码,可以将符号位和数值域统⼀处理;S 表示符号位,当S=0时,V为整数;M 表示有效数字,M是大于等于1,小于2的。那么,S=1,M=1.01,E=2。
2024-08-20 11:45:59
193
原创 C语言版---------strcpy的模拟实现
strcpy把含有'\0'结束符的字符串复制到另一个地址空间,返回值的类型为char * ,例如strcpy(arr1, arr2);即为把数组arr2的内的字符串,复制到arr1中。注意:在字符串拷贝的过程中,'\0'也会被拷贝。
2024-08-09 22:19:39
229
1
原创 strlen的模拟实现
参数str接收⼀个字符串的起始地址,然后开始统计字符串中 \0。如果要模拟实现只要从起始地址开始向后逐个字符的遍历,只要不是。首先,我们要了解strlen这个库函数的。字符,计数器就+1,这样直 到 \0。之前的字符个数,最终返回长度。
2024-08-09 21:45:39
246
原创 【C语言】指针基础知识超详细第一弹!
指针的重要性:表示一些复杂的数据结构快速的传递数据,减少了内存的耗用【重点】,使函数返回一个以上的值【重点】,能直接访问硬件,能够方便的处理字符串,是理解面向对象语言中引用的基础总结:指针是C语言的灵魂概念: 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
2024-08-09 19:34:13
875
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅