
C++
C++的相关知识
又偷吃我氮泵_
心中有火 眼里有光
展开
-
C++中引用类型的简单剖析
前言对于习惯使用C语言进行开发的同学们,在看到C++中出现的&符号,可能会陷入误区,因为在C语言中&符号表示了取地址符,但其实&在C++中却有着不同的意义与用途——引用。一:引用的简介1.1 引用概念引用就是给已经存在的变量取了一个别名,引用和它引用的变量共用同一块内存空间。比如:李逵,在家称为"铁牛",江湖上人称"黑旋风"。引用的声明方法:类型& 引用变量名 = 引用实体(引用类型必须和引用实体是同种类型)代码演示:void TestRef(){ int原创 2020-10-10 16:35:35 · 374 阅读 · 0 评论 -
C/C++中的关键字:extern的用法解析
前言在C/C++中,extern 关键字可以用于变量或者函数的声明前,还可以用于进行链接指定。一:extern 用于变量或函数的声明前二:extern 用于链接指定原创 2020-10-05 09:39:38 · 984 阅读 · 0 评论 -
C++类型转换(static_cast、reinterpret_cast、const_cast、dynamic_cast)
前言当赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化。C语言中的类型转换形式:隐式类型转换和显示类型转换。C语言风格的类型转换格式简单,但可能造成数据精度的丢失以及代码不够清晰等问题,并且转换的可视性比较差。一:C++强制类型转换为了弥补C语言的缺陷,C++提出了自己的类型转化风格,由于C++要兼容C语言,所以C++中还可以使用C语言的转化风格。C++引入了四种命名的强制类型转换操作符:static_cast、reinterpre原创 2020-09-21 17:55:51 · 204 阅读 · 0 评论 -
C++设计模式:单例模式(饿汉模式+懒汉模式)
前言设计模式(Design Pattern)是一套经过分类的,被反复使用的,代码设计经验的总结。 为什么会产生设计模式这个概念呢?随着时间的沉淀,以及前人的总结,我们发现代码设计也是有规律的,一类特定的问题会被一种特定的模式解决,这就衍生出了设计模式的概念。使用设计模式的目的:为了代码的可重用性以及可靠性。设计模式是软件工程的基石脉络,如同大厦的结构一样,设计模式使代码编写真正工程化。一:单例模式单例模式即一个类在全局中(进程)只能创建一个实例。...原创 2020-09-21 00:15:29 · 492 阅读 · 0 评论 -
C++:特殊类的设计
前言掌握常见特殊类的设计方式,比如:只能在堆上创建对象的类、只能在栈上创建对象的类、不能被拷贝的类、不能被继承的类、只能创建一个对象的类。一:设计一个只能在堆上创建对象的类类实例化一个对象会调用构造函数或拷贝构造函数。设计思路:将类的构造函数私有化,防止他人调用拷贝在栈上生成对象。将类的拷贝构造函数声明为delete,防止拷贝构造在栈上生成对象。提供一个静态的成员函数,在该静态成员函数中完成堆对象的创建。代码演示:// 设计一个只能在堆上创建对象的类#include<iostr原创 2020-09-20 10:01:39 · 206 阅读 · 0 评论 -
C++:内存泄露(概念+危害+解决)
前言内存泄露(memory leak)是我们常常听说的一个名词,那么什么是内存泄露呢?内存泄露有什么危害呢?内存泄露应当怎样解决呢?今天我们一起来整理一下内存泄露相关的知识,对以上问题有一个明确的认知。一:什么是内存泄露1.1 内存泄露的概念内存泄露:由于疏忽或者错误(异常安全)导致程序未能释放已经不再使用的内存的情况。内存泄露并非是指内存在物理上的消失,而是指程序失去了对该内存的控制,导致的资源浪费。1.2 内存泄露的分类堆内存泄露(Heap Leak)通过malloc,realloc原创 2020-09-19 13:31:56 · 2443 阅读 · 0 评论 -
C++:基于RAII思想的智能指针
前言C++没有垃圾回收机制,new或者malloc的资源都需要我们手动进行释放。但有时也会发生忘记释放的问题,这就会造成内存泄漏或异常安全的问题。C++就引入了智能指针对上述问题进行解决。一:RAIIRAII 是一种利用对象生命周期来控制程序资源(如内存、文件句柄、网络连接、互斥量等等)的简单技术。在对象构造时获取资源,接着控制对资源的访问使之在对象的生命周期内始终保持有效,最后在对象析构的时候释放资源。我们实际上把管理一份资源的责任托管给了一个对象。不需要显式地释放资源。采用这种方式,对象原创 2020-09-17 18:55:26 · 306 阅读 · 0 评论 -
C++异常:异常体系
前言C语言传统的处理错误的机制:终止程序(比如:assert): 用户难以接受,发生内存错误就会终止程序。返回错误码: 系统的很多库的接口函数都是通过把错误码放到errno中,表示错误。需要程序员自己根据错误码去查找对应的错误。C标准库中setjmp和longjmp组合。实际中C语言基本都是使用返回错误码的方式处理错误,部分情况下使用终止程序处理非常严重的错误。今天我们主要来探究一下C++中处理异常的机制。一:C++异常概念异常是面向对象语法处理错误的一种方式。当一个函数发现自己无法处理原创 2020-09-13 11:40:38 · 301 阅读 · 0 评论 -
C++11:新特性(右值引用、移动语义、lambda表达式、线程库)
前言C++98是C++标准的第一个版本,以模板的方式重写C++标准库,引入了STL(标准模板库)。C++11则带来了数量可观的变化,其中包含了约140个新特性(正则表达式、基于范围for循环、auto关键字、新容器、列表初始化、标准线程库、右值引用和移动语义、lamber表达式),以及对C++03标准中约600个缺陷的修正,这使得C++11更像是从C++98/03中孕育出的一种新语言。相比较而言,C++11能更好地用于系统开发和库开发、语法更加泛华和简单化、更加稳定和安全,不仅功能更强大,而且能提升程序原创 2020-09-11 21:30:16 · 461 阅读 · 0 评论 -
C++海量数据处理:位图和布隆过滤器
前言有一道非常经典的题目:给40亿个不重复的无序的无符号整数,再给一个无符号整数,如何快速判断这个数是否在这40亿个数中。关于这道题目我们首先想到的解法就是排序二分查找,或者借助关联式容器进行求解,但是40亿个数据的数据量是非常巨大的(16G),没有办法放入内存中,所以在面对这种海量数据处理的时候,我们今天来学习位图和布隆过滤器的相关知识,用来解决海量数据处理的问题。一:位图位图其实就是哈希结构的变形,同样通过映射来处理数据,采用直接定址法存储数据,只不过位图本身并不存储数据,而是通过存储一个比特位原创 2020-09-05 10:03:07 · 429 阅读 · 0 评论 -
STL关联式容器:unordered_map和unordered_set
前言在C++98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到 O(logN),即最差情况下需要比较红黑树的高度次,当树中的结点非常多时,查询效率也不理想。在C++11中,STL又提供了4个unordered系列的关联式容器,这四个容器与红黑树结构的关联式容器使用方式基本类似,只是其底层结构不同,本文中只对unordered_map和unordered_set进行介绍。一:unordered_map和unordered_setunordered_map/unordered_s原创 2020-09-03 09:33:55 · 926 阅读 · 0 评论 -
高效的搜索方式:哈希
前言顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素时,必须要经过关键码的多次比较。顺序结构查找时间复杂度为O(N),平衡树查找时间复杂度为O(logN),搜索的效率取决于搜索过程中元素的比较次数。有一种理想的搜索方法:可以不经过任何比较,一次直接从表中得到要搜索的元素。 如果构造一种存储结构,通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立一一映射的关系,那么在查找时通过该函数可以很快找到该元素。一:哈希哈希表(Hash table,也叫散原创 2020-08-18 22:35:23 · 1088 阅读 · 0 评论 -
STL关联式容器:map和set(基本操作+模拟实现)
前言在初阶阶段,我们已经接触过STL中的部分容器,比如:vector、list、deque等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。那么我们今天继续探索STL中的另一类容器——关联式容器:map。关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是<key, value>结构的键值对,在数据检索时比序列式容器效率更高。一:map...原创 2020-08-01 00:14:02 · 353 阅读 · 0 评论 -
面向对象程序设计的三大特性(三):C++中的多态
前言在我们系统的学习了封装和继承之后,那自然少不了面向对象程序设计的另一大特性——多态,C++中的多态又是怎样的呢?下面带大家来一起梳理C++中多态的相关知识。1. 多态的概念顾名思义,多态就是多种形态。比如,买票这个行为,普通人买票时是全价买票,学生买票时是学生价买票,军人买票时是优先买票。多态:不同的对象去完成某个相同的行为时会产生出不同的状态。在继承中要构成多态的两个条件1.必须通过基类的指针或者引用调用虚函数2.被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写#inc原创 2020-07-05 00:00:16 · 397 阅读 · 0 评论 -
面向对象程序设计的三大特性(二):C++中的继承
前言众所周知,面向对象程序设计有三大特性:封装、继承、多态。在之前的学习中我们对C++中的封装有了一定层次的认知,那么C++中的继承是怎样实现的呢?今天就带大家来简单梳理一下C++中的继承。1. 继承的概念继承机制是面向对象程序设计使代码复用的重要手段,它允许程序员在保持原有类(基类、父类) 特性的基础上进行扩展,增加新的功能,这样产生的新类叫做 派生类(子类),继承展现了面向对象程序设计的层次结构,继承是类设计层次的复用。举个栗子:#include<iostream>#incl原创 2020-07-02 18:45:37 · 440 阅读 · 0 评论 -
STL容器适配器:stack、queue、priority_queue
前言容器适配器是一个封装了序列容器的类模板,它在一般序列容器的基础上提供了一些不同的功能,之所以称之为容器适配器,是因为它可以通过适配容器的现有接口来提供不同的功能。简单的理解容器适配器,其就是将不适用的序列式容器(包括 vector、deque 和 list)变得适用。STL中的三大容器适配器:stack、queue、priority_queue。一:deque(双端队列)在学习容器适配器之前我们首先了解一个叫做deque的序列容器。deque(双端队列): 是一个双端操作,任意位置O(1)插原创 2020-06-29 19:15:20 · 5337 阅读 · 0 评论 -
STL序列式容器:list(基本操作+模拟实现)
前言list类是STL中封装的链表模板类,并且底层实现是以带头双向链表作为基础进行封装的,甚至一些 STL 版本中(比如 SGI STL),list容器的底层实现使用的是带头双向循环链表list 容器中各个元素的前后顺序是靠指针来维系的,每个元素都配备了两个指针,分别指向它的前一个元素和后一个元素,list容器中的元素还可以分散存储在内存空间里(逻辑结构连续,物理结构分散)。list的优点:1.在任意位置插入删除数据的效率高2.不存在扩容的问题(拷贝数据、释放空间的代价)2.list支持前后原创 2020-05-26 01:28:23 · 418 阅读 · 0 评论 -
STL序列式容器:vector(基本操作+模拟实现)
前言vector类是STL中的另一大容器,经过封装,vector是一个可变长度并且拥有各种功能的顺序表,在其内部可以利用数组实现。vector和string在物理与逻辑结构上十分相似,不过vector是一个模板类,我们可以在其中存放任意类型的数据。vector的优点:1.可以通过下标进行随机访问2.在尾部插入或者删除元素时更加高效3.大小可以动态改变...原创 2020-05-23 12:08:26 · 554 阅读 · 0 评论 -
STL序列式容器:string(基本操作+模拟实现)
前言STL(Standard Template Library-标准模板库),是C++标准库的重要组成部分,STL是C++中的优秀作品,有了它的陪伴,许多底层的数据结构以及算法都不需要自己重新造轮子,站在前人的肩膀上,健步如飞的快速开发。这篇博客就来带大家梳理一下STL中string类的相关知识。C语言中管理字符串的缺陷:C语言对于字符串的增删查改操作不能很好的支持C标准库中提供的库函数...原创 2020-05-13 18:15:27 · 251 阅读 · 0 评论 -
C++中的函数模板和类模板
前言在我们进行大型程序的编写时往往会遇到一类问题,同一个函数或类我们希望多种类型数据传入时都能完成类似或者相同的功能,但是在C语言中我们很难做到这一点因为我们往往在换了一个数据类型后就要重新写一遍函数,这样耽误我们大量的时间,那么有没有一种语法在C++中能够使让我们的代码成为一种模板,不同的数据类型传入也依然能够执行类似的功能呢?正所谓世界是由懒人创造的,于是在C++中引入了模板这一概念,同时...原创 2020-05-05 21:19:43 · 1012 阅读 · 4 评论 -
C/C++中的内存管理
前言我们最初熟知的内存开辟方式:int val = 20: 在栈空间上开辟4个字节char array[10]: 在栈空间上开辟10个字节的连续空间上述开辟空间的方式有两个特点:空间开辟大小是固定的。数组在申明的时候,必须指定数组的长度,它所需要的内存在编译时分配。但是对于空间的需求,不仅仅是上述的情况,有时候我们需要的空大小在程序运行时才能知道,那此时静态的开辟空间的方式就...原创 2020-05-02 20:36:39 · 2145 阅读 · 3 评论 -
C++中的类和对象(三:再认识类和对象)
前言C++中的类和对象(一:初识类和对象)https://blog.youkuaiyun.com/Outtch_/article/details/105413571C++中的类和对象(二:六个默认成员函数)https://blog.youkuaiyun.com/Outtch_/article/details/105646143经过了以上两个部分的学习,相信大家对类和对象有了一个初步认识,今天这篇博客再带大家深入了解...原创 2020-04-29 23:12:38 · 288 阅读 · 0 评论 -
C++中的类和对象(二:六个默认的成员函数)
前言在我们构建一个类之后即使我们在其中不定义任何的成员函数,编译器也会自动生成6个默认的成员函数1、构造函数2、析构函数3、拷贝构造函数4、赋值运算符重载函数5、对普通对象取地址运算符重载6、对常对象取地址运算符重载这些函数完成了类的基本功能:包括对象的初始化,对象销毁后的清理工作等。当然这些自动生成的成员函数功能有限有时候或许无法达到预期的效果,因此我们可以对其进行重载让其能够...原创 2020-04-24 20:46:43 · 393 阅读 · 0 评论 -
C++中的类和对象(一:初识类和对象)
面向过程和面向对象的初步认识C语言是基于面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。类的定义class为定义类的关键字,Person为类的名字,{}中为类的主体,注意类定义结束时后面的分号。类中的元素称为类的成员:类中的数据称为类的属性或者成员变量; 类中的函数称为类的...原创 2020-04-13 20:30:21 · 326 阅读 · 0 评论 -
C++支持函数重载的原理
前言从C语言过渡到C++之后,C++不仅兼容了C的绝大多数语法,而且还对C语法有了许多改进,其中有一个亮点就是C++可以支持函数重载。面对新的名词我们就产生了许许多多的疑惑函数重载是什么呢?为什么C++支持函数重载而C不支持函数重载?C++是怎样支持函数重载的呢?我的这篇blog就来解决大家这些疑问吧!...原创 2020-04-05 12:13:53 · 399 阅读 · 0 评论