平生的C++货架
文章平均质量分 90
平 生
眼有星辰大海 胸有丘壑万千 心有繁花似锦
展开
-
C++--23.类型转换
C语言中的类型转换 C++强制类型转换 为什么需要强制类型转换 RTTI C语言中的类型转换在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化,C语言中总共有两种形式的类型转换:隐式类型转换和显式类型转换。 1. 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败 2. 显式类型转化:需要用户自己处理 int i = 1; double d = 8.88; i =原创 2021-09-07 16:13:23 · 138 阅读 · 1 评论 -
C++--22.特殊类的设计
请设计一个类,只能在堆上创建对象我们分析,当一个类只允许在堆上创建对象,原本,正常创建对象一定会调用构造函数,或者拷贝构造,要使用构造函数或者拷贝构造去创建对象(别人调用拷贝构造会在栈上生成对象),是不能保证只在堆上创建的,所以我们需要将构造函数与拷贝构造声明私有,因为无法通过构造函数与拷贝构造创建,所以我们需要引入一个静态成员函数,在此函数中创建对象实现方式: 1. 将类的构造函数私有,拷贝构造声明成私有。防止别人调用拷贝在栈上生成对象。 2. 提供一个静态的成员函数,在该静态成员函数中原创 2021-09-07 14:52:45 · 183 阅读 · 0 评论 -
C++--21.智能指针
我们知道,C++中是没有gc的,new/malloc出来的资源,是需要我们自己去手动释放的,此时便会出现一些问题,1.忘记释放,2.发生异常安全,这些问题就会导致资源的泄露,就发生了严重的问题,所以,我们的智能指针出现了为什么需要智能指针? 内存泄漏 智能指针的使用及原理 C++11和boost中智能指针的关系 RAII扩展学习 为什么需要智能指针?其实归根结底就一点,为了防止内存泄漏,防止我们因忘记释放资源或者在malloc与free之间抛出异常,出现异常安全时资源的流失.原创 2021-09-06 19:12:45 · 477 阅读 · 3 评论 -
C++--20.异常
C语言传统的处理错误的方式 C++异常概念 异常的用法 自定义异常体系 标准库异常体系 异常的优缺点C语言传统的处理错误的方式传统的错误处理机制: 1. 终止程序,如assert,发生严重错误时,主动调用exit(xx);缺陷:用户难以接受。如发生内存错误,除0错误时就会终止程序。 2. 返回错误码,有些API接口都是把错误码放到errno中,缺陷:需要程序员自己去查找对应的错误。如系统的很多库的接口函数都是通过把错误码放到errno中,表示错误 3. C 标准原创 2021-09-03 20:29:27 · 210 阅读 · 0 评论 -
C++--19.C++11
在我们C++的发展历程中,拥有两个很关键的版本,一个是C++98,一个是C++11,在这一章中我们一起就来了解下C++11给我们增加了哪些重要的新特性吧C++11简介 列表初始化 变量类型推导 范围for循环 final与override 智能指针 新增加容器---静态数组array、forward_list以及unordered系列 默认成员函数控制 右值引用 lambda表达式 线程库 C++11简介在2003年C++标准委员会曾经提交了一份原创 2021-09-03 16:02:03 · 246 阅读 · 0 评论 -
C++--18.哈希应用
在我们上一章对哈希有一个大致的了解之后,我们在这一章来学习一下它的应用哈希的应用位图在我们了解位图之前,我们先来看一道经典的题目给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中?我们再看到这道题首先会有几个思路1.直接遍历,判断,O(N)2.排序后二分查找,O(NlogN)3.开辟一个42亿*4(因为整数的范围就在42亿)大小的哈希表/红黑树,然后依次映射进去,判断重复事实上这些方案在内存足够的情况下是可行的,但是在这里原创 2021-08-31 19:00:58 · 305 阅读 · 0 评论 -
C++--17.哈希
我们在之前一定听过哈希映射,哈希表这种神奇的东西,在这一章我们来深入探究一下,这种以空间换时间的重要思想unordered系列关联式容器 底层结构 模拟实现 哈希的应用 海量数据处理unordered系列关联式容器unordered_map与unordered_set 我们的set与map加上unordered之后,我们根据字面意思也可以进行理解,就是未排序的set与mapmap/set与unordered_map/unordered_set区别与联系1.他都可原创 2021-08-30 22:22:14 · 516 阅读 · 0 评论 -
C++--16.模拟实现set与map
在我们了解了AVLTree与红黑树之后,我们便可以去理解set与map的底层了,stl中的set与map就是用红黑树去实现的,那么他们到底是如何实现的呢?我们一起来了解下stl中的map与set源码框架map框架set框架我们其实按照一般的想法去理解,set与map应该是分别使用一棵二叉树来进行底层实现,但其实不是的,因为那样就会引起代码的冗余,我们的map与set仅仅是模型的参数不同,set是<k,k>模型,map是<k,value>模型,也仅仅只有参数不同..原创 2021-08-28 01:15:54 · 173 阅读 · 0 评论 -
数据结构--AVL树与红黑树
我们在上一章中初步认识到了set与map,了解了他们的使用,但是仅仅隐约的窥见了他们的底层实现,而这一章我们一起了解下他们的底层实现,以及数据结构较为复杂的部分,AVL树与红黑树set与map的底层结构 前面对map/multimap/set/multiset进行了简单的介绍,在其文档介绍中发现,这几个容器有个共同点是:其底层都是按照二叉搜索树来实现的,但是二叉搜索树有其自身的缺陷,假如往树中插入的元素有序或者接近有序,二叉搜索树就会退化成单支树,时间复杂度会退化成O(N),因此map、set等关原创 2021-08-26 22:02:19 · 1433 阅读 · 6 评论 -
C++14.--初识set与map
关联式容器 键值对 树形结构的关联式容器 关联式容器在初阶阶段,我们已经接触过STL中的部分容器,比如:vector、list、deque、forward_list(C++11)等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。那什么是关联式容器?它与序列式容器有什么区别? 关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是<key, value>结构的键值对,在数据检索时比序列式容器效率更高。键值对用来表示原创 2021-08-21 21:33:19 · 327 阅读 · 0 评论 -
数据结构--二叉树进阶
因为我们之前在学习数据结构的时候使用的是C语言,但是并不是所有的数据结构都适合使用C语言学习,如今我们了解了C++的基础语法,具备了学习这些稍微难一点的数据结构的前提,所以我们再次回顾数据结构,使用C++这一更加先进的武器,来解决更加复杂的问题二叉搜索树 二叉搜索树概念二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值 它的左右子树也原创 2021-08-20 22:24:13 · 419 阅读 · 0 评论 -
C++--12.多态
多态的概念 多态的定义及实现 抽象类 多态的原理 单继承和多继承关系中的虚函数表 多态的概念多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。举个简单的例子,比如我们去买票,普通人去买就是全价买票,学生去就是半价学生票,这就是两种不同的对象去调用买票这个函数时得到的不同结果,又称多态多态的定义及实现多态的构成条件多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Pe原创 2021-08-18 13:56:26 · 189 阅读 · 0 评论 -
C++--11.继承
继承的概念及定义 基类和派生类对象赋值转换 继承中的作用域 派生类的默认成员函数 继承与友元 继承与静态成员 复杂的菱形继承及菱形虚拟继承 继承的总结和反思继承的概念及定义继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用#i原创 2021-08-15 17:32:41 · 295 阅读 · 0 评论 -
C++--10.再次了解模板
非类型模板参数 类模板的特化 模板的分离编译 非类型模板参数模板参数分 类型形参与非类型形参。 类型形参即:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。 非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。我们先来看这样一段代码,这就是类型参数#define N 1000//类型参数template<class T>class Array{public:priv原创 2021-08-13 13:22:55 · 296 阅读 · 0 评论 -
C++--8.list类
我们在上一节中了解了vector这个容器,但是它有一些缺点vector缺点:1.头部和中部插入删除效率低,O(N)因为需要挪动数据2.插入数据空间不够需要增容,增容需要开辟空间,拷贝数据,释放旧空间,代价很大优点:支持下标的随机访问,间接就很好地支持排序二分堆算法等所以我们出现了list容器,可以弥补vector的一些缺陷list优点:1.list头部,中间插入不再需要挪动数据,效率高。O(1)2.list插入数据是新增节点,不需要增容缺点:不支持随机访问原创 2021-08-12 09:23:21 · 426 阅读 · 0 评论 -
C++--7.vector类
vector的介绍及使用vector深度剖析及模拟实现 vector的介绍及使用vector的文档介绍 1. vector是表示可变大小数组的序列容器。 2. 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。 3. 本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。原创 2021-08-11 03:42:40 · 472 阅读 · 0 评论 -
C++--6.string类
为什么学习string类? 标准库中的string类string类的模拟实现 为什么学习string类?C语言中的字符串 C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。 标准库中的string类string类1. 字符串是表示字符序列的类 2. 标准的字符串类提供了对此类对象的支持,其接口类似于原创 2021-08-09 09:40:13 · 188 阅读 · 0 评论 -
C++--5.STL简介
什么是STL STL的版本 STL的六大组件 STL的重要性STL的缺陷什么是STLSTL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。STL的版本原始版本 Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意运用、拷贝、修改、传播、商业使用这些代码,无需付费。唯一的条件就是也需要向原创 2021-08-06 04:58:01 · 335 阅读 · 0 评论 -
C++--4.初步了解模板
泛型编程 函数模板 类模板泛型模板在我们了解泛型编程之前,我们先来看看下面的代码void Swap(int& left, int& right) { int temp = left; left = right; right = temp; }void Swap(double& left, double& right) { double temp = left; left = right; right = temp; }void Swap(原创 2021-08-06 01:39:49 · 98 阅读 · 0 评论 -
C++--3.内存管理
C/C++内存分布 C语言中动态内存管理方式 C++中动态内存管理 operator new与operator delete函数 new和delete的实现原理 定位new表达式(placement-new)C/C++内存分布对于内存分布而言,我们可以列一段代码,以及回答其相关的问题来了解int globalVar = 1;static int staticGlobalVar = 1;void Test(){ static int staticVar = 1;原创 2021-08-05 23:32:15 · 98 阅读 · 0 评论 -
C++--2.类和对象
1.面向过程和面向对象初步认识 2.类的引入 3.类的定义 4.类的作用域 5.类的实例化 6.类的访问限定符及封装 7.类的对象大小的计算 8.类成员函数的this指针9. 类的6个默认成员函数 10. 构造函数 11. 析构函数 12. 拷贝构造函数 13. 赋值操作符重载 14. 默认拷贝构造与赋值运算符重载的问题 15. const成员函数 16. 取地址及const取地址操作符重载 17. 再谈构造函数 18.C++11 的成员初原创 2021-08-04 08:13:50 · 196 阅读 · 0 评论 -
C++--1.基础知识
在这一章中,我们来认真学习一门全新的语言,C++,尽管可能会有些琐碎复杂,但只要我们认真细心,记好每一个细碎的知识点,将知识汇总成网状结构,慢慢来,就可以学好,不过,也正如那句话而言,C++不仅仅是一门语言,更是一种生活哲学,要想更加透彻的理解C++,还需循序渐进,慢慢体会1. C++关键字 2. 命名空间 3. C++输入&输出 4. 缺省参数 5. 函数重载 6. 引用 7. 内联函数 8. auto关键字(C++11) 9. 基于范围的for循环(C++11原创 2021-07-31 00:49:07 · 485 阅读 · 0 评论