c++
文章平均质量分 88
2023框框
这个作者很懒,什么都没留下…
展开
-
C++复习
c++复习总结原创 2023-03-30 23:08:02 · 50 阅读 · 0 评论 -
c++11 右值引用和移动语义
这里需要说明的是,对于返回局部对象的函数,就算只是调用函数而不接收该函数的返回值,也会存在一次拷贝构造或移动构造,因为函数的返回值不管你接不接收都必须要有,而当函数结束后该函数内的局部对象都会被销毁,所以就算不接收函数的返回值也会调用一次拷贝构造或移动构造生成临时对象。移动赋值是一个赋值运算符重载函数,该函数的参数是右值引用类型的,移动赋值也是将传入右值的资源窃取过来,占为己有,这样就避免了深拷贝,所以它叫移动赋值,就是窃取别人的资源来赋值给自己的意思。而对于左值引用返回的函数来说,这些函数返回的是左值。原创 2022-10-21 17:30:26 · 753 阅读 · 0 评论 -
c++11 入门基础
在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了C++98称为C++11之前的最新C++标准名称。不过由于TC1主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。从C++0x到C++11,C++标准10年磨一剑,第二个真正意义上的标准珊珊来迟。原创 2022-10-20 22:55:58 · 751 阅读 · 0 评论 -
二叉搜索树
现代写法,利用传参时调用用拷贝构造函数初始化tree,swap函数交换两个根节点的指针,tree调用析构函数时释放交换后根节点指针的资源,原理就是更好的复用。由于二叉搜索树中,每个结点左子树上所有结点的值都小于该结点的值,右子树上所有结点的值都大于该结点的值,因此对二叉搜索树进行中序遍历后,得到的是升序序列。注意:这里的传引用参数,用的非常秀,对root的修改就等于对父节点的右子树指针或者左子树指针的修改。我们使用替换法,找到一个满足大于cur的所有左子树,小于cur的右子树的A节点,cur与A节点替换。原创 2022-09-29 15:13:03 · 373 阅读 · 0 评论 -
C++ 【多态】
多态是指不同继承关系的类对象,去调用同一函数,产生了不同的行为。在继承中要想构成多态必须通过基类的指针或者引用调用虚函数。被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写。两个条件缺一不可!!1、在虚函数的后面写上 =0 ,则这个函数为纯虚函数。包含纯虚函数的类叫做抽象类(也叫接口类),抽象类不能实例化出对象。//抽象类(接口类) class Car {public ://纯虚函数 virtual void Drive() = 0;int _a;};Car c;......原创 2022-08-07 21:30:03 · 581 阅读 · 8 评论 -
C++【继承】
继承(inheritance)机制是面向对象程序设计使代码可以复用的重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称为派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,而继承便是类设计层次的复用。例如,以下代码中Student类和Teacher类就继承了Person类。//父类 class Person {public :} protected : string _name = "张三";......原创 2022-08-05 18:45:23 · 88 阅读 · 0 评论 -
C++ 【模版进阶】模版分离编译 模版特化
一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式。模版分离编译会存在链接不上的问题,有两种解决方案,推荐使用模版声明和定义不分离。1、模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生。2、增强了代码的灵活性。1、模板会导致代码膨胀问题,也会导致编译时间变长。2、出现模板编译错误时,错误信息非常凌乱,不易定位错误。httpshttpshttps。...原创 2022-07-31 00:30:25 · 275 阅读 · 12 评论 -
C++ STL 【priority_queue】
原文priority_queue的介绍1、priority_queue是一个堆,它存储的容器的第一元素就是最大/最小值。2、优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容类,queue提供一组特定的成员函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的顶部(堆顶弹出)。3、底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。成员函数函数作用empty()检测容器是否为空size()返回容器中有效元素个数front().........原创 2022-07-29 23:04:08 · 271 阅读 · 1 评论 -
C++ STL 【stack&queue】模拟实现
但是,deque有一个致命缺陷不适合遍历,因为在遍历时,deque的迭代器要频繁的去检测其是否移动到某段小空间的边界,导致效率低下,而序列式场景中,可能需要经常遍历,因此在实际中,需要线性结构时,大多数情况下优先考虑vector和list,deque的应用并不多,而目前能看到的一个应用就是,STL用其作为stack和queue的底层数据结构。与vector比较,deque的优势是头部插入和删除时,不需要搬移元素,效率特别高,而且在扩容时,也不需要搬移大量的元素,因此其效率是必vector高的。......原创 2022-07-29 15:25:32 · 301 阅读 · 0 评论 -
C++ STL【list】(二)
10和2本质都是int类型,(int,Data)在选则无参的(),(intputIterator,intputIterator),(size_t,T),通过对比并且size_t是整型家族,必然选择了(size_t,T)。迭代器的玩法和string类似,只是迭代器不仅可以是源生迭代器,还能是自定义的迭代器,通过iterator类去分装节点指针,重载*、++等运算符,让它们像指针一样使用,所以链表的迭代器与源生的迭代器的操作结果就可以不相同了。删除所有的节点,不包含头节点。...原创 2022-07-24 23:26:32 · 351 阅读 · 0 评论 -
C++STL【反向迭代器】
Iterator是哪个容器的迭代器,reverse_iterator就可以适配出哪个容器的反向迭代器。源码的设计追求对称,我们设计可以不按源码走,在容器实现rbegin(),rend()时,要按照反向迭代器的设计风格去实现。反向迭代器其实就行对正向迭代器进行封装,源生迭代器,为了实现运算符的结果不同,正向迭代器也对源生迭代器进行了封装。反向迭代器根正向迭代器区别就是++、–的方向是相反的所以反向迭代器封装正向迭代器即可,重载控制++、–的方向。注意这里只涉及反向迭代器的内容。.........原创 2022-07-24 21:26:52 · 382 阅读 · 0 评论 -
C++ STL【list】(一)
list文档介绍1list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。2.list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。3.list与forward_list非常相似最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效。4.与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。...原创 2022-07-23 22:03:51 · 149 阅读 · 0 评论 -
C++ STL 【vector】
vector的文档介绍1 vector是表示可变大小数组的序列容器。2. 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。3. 本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为每当一个新的元原创 2022-07-22 22:35:28 · 356 阅读 · 0 评论 -
C++STL【string】下模拟实现string
缺省参数就可以少写一个无参构造函数,若不传参默认生成空字符串。空字符串是有大小的包含了’\0’。注这里需要先申请空间,如果申请空间失败会抛异常跳到处理异常,不会执行后面的代码,所以先申请空间,发生错误时就不会影响到原有的对象。析构函数需要我们写,因为string类对象都需要开辟动态内存的资源,动态开辟的空间需要我们手动清理。现代写法一、不能判断自己给自己赋值,自己给自己赋值影响也不是很大,就是最后的空间地址发生了变化。注意end()返回的迭代器执行末尾’\0’。...原创 2022-07-20 02:39:09 · 97 阅读 · 0 评论 -
C++STL【string】中
作为返回值,它通常用于表示不匹配。C语言中,字符串是以’\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。有关字符串的题目基本以string类的形式出现,而且在常规工作中,为了简单、方便、快捷,基本都使用string类,很少有人去使用C库中的字符串操作函数。1、当n大于对象当前的size时,将size扩大到n,扩大的容量用字符c填充,若c未给出,则默认为’\0’。.原创 2022-07-18 20:51:35 · 456 阅读 · 0 评论 -
C++STL【string】上
详细介绍stringAPI1、字符串是表示字符序列的类2.标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作单字节字符字符串的设计特性。3.string类是使用char(即作为它的字符类型,使用它的默认char_traits和分配器类型(关于模板的更多信息,请参阅basic_string)。4.string类是basic_string模板类的一个实例,它使用char来实例化basic_string模板类,并用char_traits。...原创 2022-07-15 23:24:25 · 581 阅读 · 0 评论 -
C++模板初阶
2、代码的可维护性比较低,其中一个重载函数出现错误可能意味着所有的重载函数都出现了错误。那我们能否告诉编译器一个原创 2022-07-13 22:11:35 · 83 阅读 · 1 评论 -
C++内存管理
让我们先来看看下面这段代码:1.栈又叫堆栈,非静态局部变量/函数参数/返回值等等,栈是向下增长的。2.内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存,做进程间通信。(Linux课程如果没学到这块,现在只需要了解一下)3.堆用于程序运行时动态内存分配,堆是可以上增长的。4.数据段–存储全局数据和静态数据。5.代码段–可执行的代码/只读常量。malloc、calloc、realloc和free详细介绍C语言内存管理方式在C++中可以继续使用,但有些地方就无原创 2022-07-13 14:42:20 · 130 阅读 · 4 评论 -
C++类和对象(三)
在创建对象时,编译器会通过调用构造函数,给对象中的各个成员变量一个合适的初始值:虽然通过调用上述的构造函数后,对象中的每个成员变量都有了一个初始值,但是构造函数中的语句只能将其称作为赋初值,而不能称作为初始化。因为初始化只能初始化一次,而构造函数体内可以进行多次赋值。接下来验证一下:const 修饰的变量必须在定义前初始化。1.2初始化列表初始化列表 :以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个成员变量后面跟一个放在括号中的初始值或表达式。注意事项:一、每个成员变量在初始化列表中原创 2022-07-12 15:04:17 · 613 阅读 · 1 评论 -
C++类和对象(二)
如果一个类中什么成员都没有,简称为空类。空类 中什么都没有吗?并不是的,任何一个类在我们不写的情况下,都会自动生成下面6个默认成员函数。他们是特殊的成员函数,特殊的点非常多,如果我们不实现,编译器会自己生成一份默认的,如果实现,编译器则不会生成一份默认的。为什么要有构造函数?我们要写一个公有的成员函数让成员变量进行初始化。每次实例化一个对象,都要调用该成员函数,是不是很麻烦呢?那能否在对象创建时,就将信息设置进去呢?构造函数是一个特殊的成员函数,名字与类名相同, 创建类类型对象时由编译器自动调,保证每个数原创 2022-07-11 19:30:20 · 401 阅读 · 3 评论 -
c++类和对象(一)
C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。C++是基于面向对象的,关注的是对象,将一件事拆分成不同的对象,靠对象之间的交互完成。在C语言中,结构体中只能定义变量,但在C++中,结构体内不仅可以定义变量,还可以定义函数。例如:但上面结构体的定义,在C++中更喜欢用class来代替。其中class为定义类的关键字,className为类的名字,{}中为类的主体,注意定义结束时加上后面的分号。类中的元素称为类的成员:类中的数据称为类的属性或者成员变量,类中的函数称原创 2022-07-08 23:57:13 · 191 阅读 · 0 评论 -
C++———入门
C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机,20世纪80年代,计算机界提出OOP(object oriented programming:面向对象) 思想,支持面向对象的程序设计语言应运而生。1982年,Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语言。为了表达该语言与C语言的渊源关系,命名为C++。因此,C++是基于C语言而产生的,它既可以进行C语言的原创 2022-07-08 16:52:04 · 255 阅读 · 0 评论 -
C++——extern “C”
这里的库指的是:静态库/动态库有时候在C++工程中可能需要将某些函数按照C的风格来编译,在函数前加“extern C”,意思是告诉编译器,将该函数按照C语言规则来编译。原创 2022-07-07 22:16:08 · 278 阅读 · 2 评论 -
c++——多态
文章目录1.多态的概念1.1概念1.2静态的多态与动态的多态2.多态的定义及实现2.1多态的构成条件2.2虚函数2.3虚函数的重写2.3.1函数重写的两个例外:2.3.2虚函数重写的补充知识2.4. C++11 override和final2.4.1 final关键字2.4.2 override关键字2.5 重载、覆盖(重写)、隐藏(重定义)的对比3. 抽象类3.1 概念3.2 接口继承和实现继承4.多态的原理4.1虚函数表4.2多态的原理5. 动态绑定和静态绑定5.单继承和多继承关系的虚函数表5.1 单继原创 2022-04-19 19:22:34 · 942 阅读 · 0 评论 -
c++——继承
文章目录1.继承的概念及定义继承的概念继承的定义定义格式继承方式和访问限定符继承基类成员访问方式的变化默认继承方式2.基类和派生类对象赋值转换3.继承中的作用域4.派生类的默认成员函数5.继承与友元(简单了解即可)6.继承与静态成员7.复杂的菱形继承及菱形虚拟继承菱形虚拟继承菱形虚拟继承原理8.继承的总结和反思9.笔试面试题9.笔试面试题1.继承的概念及定义继承的概念继承(inheritance)机制是面向对象程序设计使代码可以复用的重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,原创 2022-04-17 10:23:08 · 119 阅读 · 0 评论