
浅尝C++
文章平均质量分 96
记录C++学习过程
Jammingpro
recent target:5月更新完Java SE博客及C++设计模式博客
展开
-
【浅尝C++】多态机制=>重载重写隐藏的区别/抽象类/单继承与多继承的虚函数表/多态原理及虚函数表内存存储详谈
多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。例如:下图中Student类继承了Person类。两个对象在调用同一个函数takeBus时,一个执行的是Person中的getTickets,一个执行的是Student中的getTicket。这就是调用同一个函数takeBus,却产生了不同的行为。必须通过基类的指针或者引用调用虚函数被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写在讲述这两个条件之前,我们先来聊聊什么是虚函数↓↓↓下图说明了重载、重写、隐藏之间的不同之处。原创 2024-04-06 23:24:02 · 1101 阅读 · 0 评论 -
【浅尝C++】继承机制=>虚基表/菱形虚继承/继承的概念、定义/基类与派生类对象赋值转换/派生类的默认成员函数等详解
我们生活中也有继承的例子,例如:小明继承了孙老师傅做拉面的手艺。继承就是一种延续、复用的方式。C++为了提高代码的可复用性,引入了继承机制,概念如下↓↓↓继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。下图演示的继承的格式,其中Person是父类,也称作基类;Student是子类,也称作派生类。原创 2024-04-05 23:59:41 · 1149 阅读 · 0 评论 -
【浅尝C++】STL第四弹=>容器适配器底层实现原理/deque底层原理/stack、queue、priority介绍、常用接口示例及模拟实现
stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下操作:操作描述empty判空back获取尾部元素push_back尾部插入元素。原创 2024-04-03 21:25:35 · 834 阅读 · 0 评论 -
【浅尝C++】STL第三弹=>list常用接口使用示例/list底层结构探索/list模拟实现代码详解
list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效。与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。原创 2024-04-02 21:26:52 · 2418 阅读 · 0 评论 -
【浅尝C++】STL第二弹=>迭代器失效详解/vector常用接口使用示例/vector底层结构探索/vector模拟实现代码详解
vector就是一个可以自动扩大容量的数组,它与顺序表具有相同的性质,如适合随机访问、尾部插入删除效率高。关于顺序表的特点,可以查阅该篇文章→数据结构线性表(含顺序表及链表)介绍vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。本质讲,vector使用动态分配数组来存储它的元素。原创 2024-04-01 21:31:23 · 834 阅读 · 0 评论 -
【浅尝C++】STL第一弹=>STL简介/string常用接口使用示例/string模拟实现代码详解
STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。也就是说,我们可以通过调用STL提供的各种类、函数接口来使用常见的数据结构与算法,大大提高了代码的编写效率。原创 2024-03-31 20:12:56 · 786 阅读 · 0 评论 -
【浅尝C++】使用模板实现泛型编程第二弹=>非类型模板参数/模板特化/模板分离编译详解
【优点】模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生增强了代码的灵活性【缺陷】模板会导致代码膨胀问题,也会导致编译时间变长出现模板编译错误时,错误信息非常凌乱,不易定位错误🎈欢迎进入浅尝C++专栏,查看更多文章。如果上述内容有任何问题,欢迎在下方留言区指正b( ̄▽ ̄)d。原创 2024-03-29 19:33:46 · 879 阅读 · 0 评论 -
【浅尝C++】使用模板实现泛型编程第一弹=>函数模板/类模板/模板匹配原则/函数模板原理
class 类模板名//类内成员定义。原创 2024-03-28 19:27:08 · 964 阅读 · 0 评论 -
【浅尝C++】C/C++内存管理(含程序地址空间验证代码、new/operator new/malloc/delete/operator delete/free的区别与联系)
class Apublic:A()~A()cout << "C语言申请和释放单个内置类型" << endl;free(p1);cout << "C语言申请和释放多个内置类型" << endl;free(p2);cout << "C++语言申请和释放单个内置类型" << endl;delete p1;cout << "C++语言申请和释放多个内置类型" << endl;delete p2;原创 2024-03-27 20:52:21 · 1129 阅读 · 1 评论 -
【浅尝C++】类和对象第三弹=>static成员/友元/内部类/匿名对象
🏠专栏介绍:浅尝C++专栏是用于记录C++语法基础、STL及内存剖析等。🚩一些备注:之前的文章有点杂乱,这里将前面的知识点重新组织了,避免了过多冗余的废话。🎯每日努力一点点,技术变化看得见。原创 2024-03-26 20:53:03 · 1079 阅读 · 0 评论 -
【浅尝C++】类和对象第二弹=>类的6个默认成员函数/运算符重载详谈
如果我们写一个不含任何成员函数、成员变量的类,这个类什么成员都没有,则称这个类为空类。空类真的什么都没有吗?并不是!任何类在什么都不写的情况下,编译器会自动生成下图所示的6个默认成员函数。上面说的默认成员函数,就是用户没有显示实现,编译器会生成的成员函数称为默认成员函数。原创 2024-03-25 22:55:06 · 848 阅读 · 0 评论 -
【浅尝C++】类和对象第一弹=>类的定义/访问限定符/实例化/类对象大小计算/this指针
C++中通常定义一个类,将这个对象包含的操作(函数)和变量一并存在一起。来看一下定义格式。↓↓↓//类体:由成员函数和成员变量组成//Attention:这里一定要有分号class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。定义类的两种方法Function1:声明和定义全部放在类体中。原创 2024-03-24 21:32:23 · 981 阅读 · 0 评论 -
【浅尝C++】C++基础第三弹=>内联函数/auto关键字/范围for/nullptr(含如何查看内联函数展开效果)
在早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,但遗憾的是一直没有人去使用它。因为即使我们不加上auto关键字修饰,也能定义局部变量,何必多敲一个单词呢?C++11中,标准委员会赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。auto b = a;return 0;注意使用auto定义变量时。原创 2024-03-23 20:32:06 · 741 阅读 · 0 评论 -
【浅尝C++】C++基础第二弹=>函数重载与引用(含函数名修饰规则详解、权限缩小放大问题)
日常生活中,我们可以使用一句话表达不同的意思。“哦”既可以表示肯定,也可以表示疑惑。那如果想使用同一个函数名实现不同的功能,在C++中能够实现吗?那我们就得先来了解一下函数重载了。函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似、数据类型不同的问题。1.参数类型不同下面代码中,实现了两个同名的函数PrintNum,但两个函数的参数列表不同,一个参数为整型,一个参数为双精度浮点型。对于这原创 2024-03-22 20:34:41 · 1145 阅读 · 0 评论 -
【浅尝C++】C++基础第一弹命名空间/输入输出及缺省参数
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,后序接一对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量、函数和类型(类、结构体等)。//命名空间中可以定义变量/函数/类型。int val;命名空间可以进行嵌套,也就是说,一个命名空间中可以再定义命名空间。int a;同一个工程中,允许存在多个相同名称的命名空间,编译器最后会将同名的命名空间合并为一个。//test.h//add.h上面位于同一个工程不同头文件的命名空间N1将会被合并成一个。原创 2024-03-21 21:37:19 · 659 阅读 · 0 评论