
从0开始学习c++
文章平均质量分 92
阿白逆袭记
( ̄. ̄)
展开
-
搜索二叉树的认识以及底层实现
所谓的搜索二叉树其实就是具有特殊规则要求的二叉树。搜索二叉树要求我们每一个子树都应该满足其左孩子节点当中存储的值都应该小于父节点当中存储的值,其右孩子节点当中存储的值都应该大于我们父节点当中存储的值。搜索二叉树结构如下图所示:只要我们满足这样的规则就说明我们的二叉树是一颗搜索二叉树。原创 2024-09-17 16:57:35 · 1194 阅读 · 0 评论 -
C++当中的多态(三)
编译器会自动将继承A的虚函数表当中对应的函数地址进行覆盖得到一个完整的派生类虚函数表A,同样的对于读书与B类的虚函数进行重写的时候,也会对相应的函数地址进行覆盖得到一个完整的派生类虚函数表B。同时我们A的虚函数表被D类所继承,如果D类对A类进行虚函数的重写操作,会直接使用新的虚函数地址覆盖我们原有的虚函数的地址。思考一下:我们的虚表可以进行修改吗?使用基类A的指针进行访问C类重写的函数,调用的应该是C类当中的重写之后的虚函数,使用基类B的指针进行访问C类重写的函数,调用的应该也是C类当中重写之后的虚函数。原创 2024-09-12 21:21:28 · 1008 阅读 · 0 评论 -
C++当中的多态(二)
相信大家在刚开始遇到这三种概念的时候都会产生疑惑。重载,重写,重定义很像诶,那么这三者有什么区别呢?我们需要注意什么吗?函数重定义的概念在我们的继承章节当中提到过。当我们的派生类存在跟我们基类函数名完全相同的函数的时候,就构成了函数的隐藏。对于函数隐藏来说我们并不要求参数类型一致,不管我们参数相不相同,只要函数分别在基类跟派生类当中,只要不满足我们重写的要求的同名函数都可以构成函数的隐藏。之前我们介绍的都是多态的基本的使用方法。原创 2024-09-12 12:11:01 · 665 阅读 · 0 评论 -
C++当中的多态(一)
所谓的多态在我们的生活当中其实很常见。举一个简单的例子:当我们需要买票的时候有很多种不同的票可以供我们购买,如果你是学生就可以享受半价票的优惠,如果你是VIP用户就可以享受八五折的优惠,如果你是烈士家属就可以享受优先购票的权利.......那么像这种针对于同一个窗口,但是由不同的人,来进行相同的购票操作,最终得到不同的结果的现象就叫做多态。多态实际上就是不同继承关系的类对象,在调用同一个函数,做出了不同行为的现象。比如我们上面编写的代码当中学生类以及VIP类等都继承了购票窗口类。原创 2024-09-11 22:16:20 · 1025 阅读 · 0 评论 -
C++当中的继承(二)
每一次调用基类的构造函数的时候都会对我们 的静态成员变量进行++操作,这样不论是创建我们的基类对象还是创建我们的派生类对象都会进行统计,我们这个类型的对象个数也就被统计出来了。当我们产生该种继承方式的时候就会出现数据冗余和二义性的问题,因为我们会发现在类B和类C当中都继承了类A,所以我们类A当中的数据自然也就复制了一份到我们的类B和类C当中了,那么派生类D在继承类B和类C的时候又会将类B和类C当中的数据复制一份到我们的类D当中。所谓的虚继承就是专门应对我们菱形继承所带来的问题所引入的概念。原创 2024-09-10 18:38:43 · 976 阅读 · 0 评论 -
C++当中的继承
在C++当中继承是一个非常重要的语法。我们可以使用继承快速的进行代码的复用以及对代码进行扩展操作。首先我们来进行学习继承的基本语法。原创 2024-09-10 18:37:48 · 910 阅读 · 0 评论 -
模板相关知识的补充
我们之前没有产生类似的报错的原因是:我们之前仅仅是使用该模板参数创建了一个对象,对于该对象我们仅仅是调用了其中的成员函数,成员函数的使用方式和语法跟我们成员变量的语法已经内部类的使用语法不会产生冲突,(成员变量的使用语法跟内部类的使用语法产生了冲突)所以就没有出现上述的报错情况。还记得我们上一篇博客当中讲到的:仿函数吗?我们可以对于仿函数进行控制,使得我们得仿函数可以发挥类似于函数的作用。但是如果如果我们不小心传成了指针呢?我们会发现程序运行的结果出现了异常,我们期望的是可以输出12<15的结果。原创 2024-09-05 17:15:22 · 1138 阅读 · 0 评论 -
priority_queue和reverse_iterator的底层实现
对于priority_queue顾名思义是一个名叫优先级队列的类。但是仅仅通过这个优先级我们并不能判断其具体的用法以及功能。但是如果我们说到优先级队列的本质上应该是一个堆呢?我们的优先级队列实质上是使用堆进行实现的,其功能就是对我们插入的数据进行构建,构建成为一个堆的形式。堆顶的元素永远是数组数据当中最大或者最小的,因此我们可以通过和最后一个数据的交换就可以实现对数组的排序。那么我们就不难想到我们优先级队列应当拥有的函数接口:首先我们需要拥有一个数据的插入接口push,以及一个数据的删除接口pop。原创 2024-09-05 12:11:27 · 637 阅读 · 0 评论 -
栈和队列的学习以及实现+双端队列的底层原理
但是相信大家肯定会有一个疑惑:我记得我们在使用stack栈的时候不需要传两个参数呀?我们只需要传入一个参数不久可以了吗?我们仔细观察一下stack和queue的模板参数就会发现:在系统库实现的过程当中我们设置了一个默认的模板参数deque。这个默认参数的实现就使得我们不需要手动传入参数就可以正常使用stack。我们同样可以设置一个默认的模板参数。难道这个默认的模板参数只能选择deque吗?我们选择其他的数据容器行不行呢?我们测试一下会发现是完全可以的。原创 2024-09-01 19:05:57 · 861 阅读 · 0 评论 -
list类底层逻辑实现
list的底层逻辑是一个双向带头链表。那么list的底层其实就跟我们之前实现的带头双向链表相同,都是开辟一个一个单独的节点,最后再通过指针将各个单独的节点链接起来即可。我们来类比之前编写的双向带头链表实现具体的内容。原创 2024-08-31 20:21:14 · 1111 阅读 · 0 评论 -
list的使用及其相关知识点
作为数据容器之一的list和其他容器的使用上有很多相似的地方,比如都有大致相同的构造函数,大致相同的头插尾插,头删尾删函数。因此对于重复的内容我们就不在赘述,直接介绍关于list和其他数据结构容器不相同的使用方法。原创 2024-08-28 21:06:06 · 1323 阅读 · 0 评论 -
vector相关功能的底层实现
如果是经常编写C++代码的同学,相信大家肯定对于vector都不陌生。但是对于vector的底层逻辑大家真的熟悉吗?在本次的博客当中我们将会向大家介绍关于vector底层的逻辑,以及在实现底层逻辑需要注意的事项。查阅相关的文档我们会发现,和我们之前编写的string有所不同。vector采用的是三个指针的形式进行表示的vector内存的大小以及容量的。就像上图中所显示的那样,其中的start / finish / end_of_sotrage 才是vector类当中的私有变量。原创 2024-08-28 09:40:12 · 817 阅读 · 0 评论 -
类和对象练习:ClassDate
对于C++类的使用练习原创 2024-04-14 13:33:58 · 627 阅读 · 0 评论 -
C++学习——vector类的使用
vector是C++中的部分内容,中文偶尔译作“容器”,但并。它是一个多功能的,能够操作多种数据结构和算法的和。vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的,能够增加和压缩数据。实质上vector的作用等同于数据结构当中的顺序表。因为vector是使用模板实现的,所以我们可以通过传入指定的参数,进行存储各种类型的数据。原创 2023-09-09 16:57:12 · 365 阅读 · 0 评论 -
C++学习——认识什么是STL以及string类的使用
在C++语言当中我们还引申加入了很多的额外的功能,比如我们现在需要进行学习的字符串string。大家可能会很好奇为什么会新加入一个字符串呢?我们C语言当中不是已经有过字符串了吗?我们再来详细的观察上面的代码:变量名ch前面的char表示的是ch的类型也就是字符类型,后面的 [ ] 表示的是我们代表一个数组,所以实质上在C语言当中的字符串实质上就是一个字符数组。并不是真正意义上的字符串。并且我们经常会遇到针对于字符串的修改等操作,所以在C++当中我们就专门定义了一个类,用于管理字符串相关的一系列的操作。原创 2023-08-07 07:25:31 · 140 阅读 · 0 评论 -
C++学习——模板
模板是在C++当中经过引入了函数的重载之后所诞生的一种新的功能。想要详细的了解模板的好处就需要从函数重载的例子开始说起。//根据函数重载的例子来了解模板的好处void swap(int& a, int& b) //交换函数1a = b;b = tmp;void swap(double& a, double& b) //函数重载2a = b;b = tmp;void swap(char& a, char& b) //函数重载3a = b;b = tmp;//写一个模板。原创 2023-08-03 21:57:18 · 309 阅读 · 0 评论 -
C++内存管理(动态内存开辟)
我们在C语言当中想要使用堆区的空间的时候就需要使用malloc函数进行手动的申请,但是我们在申请的时候需要手动进行计算,经过计算之后还需要进行判空操作,并且还不能进行任意值的初始化。这一切看起来在学习完C++当中的动态开辟之前显得很正常,但是在学习完C++当中的动态内存开辟之后我们就会感绝倒C语言的麻烦之处,接下来我们就来认识一下C++当中的动态内存开辟操作符,并将它和C语言当中的malloc函数进行对比吧。原创 2023-08-02 21:16:41 · 1186 阅读 · 0 评论 -
C++学习——类和对象(三)
同样的我们先使用函数体初始化不具有默认参数的成员变量:我们会发现编译器依旧会产生报错,之后我们再来使用初始化列表进行初始化:上面三种成员变量我们只可以使用初始化列表进行初始化,这也是初始化列表产生的意义。在我们正常的程序编写的过程当中,我们比较推荐使用初始化列表进行初始化我们对象的成员变量,这是因为不管你是否使用初始化列表,对于自定义类型成员变量,一定会先使 用初始化列表初始化。所以为了减少我们的区分,我们可以直接使用初始化列表进行初始化操作。原创 2023-07-26 10:51:53 · 173 阅读 · 1 评论 -
C++学习——类和对象(二)
紧接着我们上一部分类和对象的讲解之后,我们再来学习一下类当中的几大特点,以及使用方法。原创 2023-07-19 12:14:13 · 272 阅读 · 0 评论 -
C++学习——类和对象(一)
我们之前学习的C语言属于面向过程的编程方法。举一个简单的例子来说:面向过程的编程就是一步一步的分解一件事情的过程。比如我们想要做一份西红柿炒鸡蛋,按照面向过程的思想来看就是先去买西红柿,之后再洗西红柿,之后会打鸡蛋,接着将我们的西红柿和鸡蛋放到锅里炒,放上各种调料,最后就成为了一份西红柿炒鸡蛋。这样一步一步将一件事情逐步分解,最后达到我们想要的目的的就是面向过程的编程思想。而对于我们的面向对象的编程思想按照同样的例子来说就是:我们家楼下有一个饭店,我们只要拿钱就可以去餐厅里面点一份西红柿炒鸡蛋。原创 2023-07-16 16:31:48 · 196 阅读 · 0 评论 -
初识C++(二)
在初识c++(一)当中我们已经向大家介绍了四个c++和C语言不同的使用方法。接下来我们再来向大家介绍另外的一些新的c++语言的使用方法。原创 2023-04-20 21:49:05 · 370 阅读 · 0 评论 -
初识c++语法(一)
我们在C语言的基础之上进行c++语言的学习。对于我们的c++语言来说,c++兼容C语言,所以我们以前编写的C语言的程序在c++平台上也是可以运行的。唯一不同的就是我们的c++对于我们C语言的部分语法做出了优化以及引入了面向对象的概念。所以在刚开始学习c++的时候我们可以从了解c++新增的语法入手,学习c++语言的特点。原创 2023-04-19 23:02:43 · 383 阅读 · 0 评论