C++
文章平均质量分 74
C++学习路径和相关知识点
海盗船长没有船y
这个作者很懒,什么都没留下…
展开
-
指针与引用相关面试题
1.指针和引用的差别?非空区别。在任何情况下都不能使用指向空值的引用。一个引用必须总是指向一个对象。不存在指向空值的引用这个事实意味着使用引用的代码效率会更高。合法性区别。在使用引用之前不需要检测它的合法性。相反,指针则应该总是被测试,防止其为空。可修改区别。指针和引用的一个重要区别是指针可以被重新赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被指定的对象,以后不能改变,但是指定...原创 2020-05-02 20:59:50 · 64 阅读 · 0 评论 -
设计模式之单例模式(Singleton)
概念单例模式(Singleton Pattern)属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。注意:1、单例类只能有一个实例。2、单例类必须自己创建自己的唯一实例。3、单例类必须给所有其他对象提供这一实例。介绍意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。主要解决:一个全局使用的类频繁地创建与销毁。何时使用:当原创 2021-03-22 16:01:34 · 471 阅读 · 0 评论 -
设计模式之抽象工厂模式(AbstactFactory )
概念抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。介绍意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。主要解决:主要解决接口选择的问题。何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。如原创 2021-03-22 15:07:50 · 425 阅读 · 0 评论 -
设计模式之Factory 模式
1.模式功能定义创建对象的接口,封装了对象的创建使得具体化类的工作延迟到了子类中2.为什么使用Factory 模式1.为了提高内聚和松耦合,我们经常会抽象出一些类的公共接口以形成抽象基类或者接口。这样我们可以通过声明一个指向基类的指针来指向实际的子类实现,达到了多态的目的。图1 factory模式结构示意图2.Factory 模式不单是提供了创建对象的接口,其最重要的是延迟了子类的实例化图2 factory模式结构示意图图 2 中关键中 Factory 模式的应用并不是只是为了封装对原创 2021-03-21 23:54:04 · 2155 阅读 · 70 评论 -
C++中四种cast转换
C++中四种类型转换是:static_cast, dynamic_cast, const_cast, reinterpret_cast1、const_cast用于将const变量转为非const2、static_cast用于各种隐式转换,比如非const转const,void*转指针等, static_cast能用于多态向上转化,如果向下转能成功但是不安全,结果未知;3、dynamic_cast用于动态类型转换。只能用于含有虚函数的类,用于类层次间的向上和向下转化。只能转指针或引用。向下转化时,原创 2020-07-29 00:17:48 · 1530 阅读 · 0 评论 -
并查集的原理及实现
并查集原理在一些应用问题中,需要将n个不同的元素划分成一些不相交的集合。开始时,每个元素自成一个单元素集合,然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复用到查询某一个元素归属于那个集合的运算。适合于描述这类问题的抽象数据类型称为并查集(union-findset)。并查集一般可以解决一下问题:查找元素属于哪个集合沿着数组表示树形关系以上一直找到根(即:树中中元素为负数的位置)查看两个元素是否属于同一个集合沿着数组表示的树形关系往上一直找到树的根,如果根相同表明在同一个集合,否则不原创 2020-07-28 23:11:22 · 801 阅读 · 0 评论 -
通俗易懂学习C++智能指针
智能指针是干什么的?智能指针主要用于管理在堆上分配的内存,它将普通的指针封装为一个栈对象。当栈对象的生存周期结束后,会在析构函数中释放掉申请的内存,从而防止内存泄漏。什么是内存泄漏?内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。内存泄漏有什么危害?长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死。原创 2020-07-23 17:41:05 · 2711 阅读 · 32 评论 -
C++之继承相关问题——菱形继承&继承
一文理解什么是继承1. 什么是菱形继承?菱形继承的问题是什么?菱形继承:菱形继承是多继承一种特殊的继承方式。如下如所示为一菱形继承即两个派生类继承同一个基类,同时两个派生类又作为基本继承给同一个派生类。这种继承形如菱形,故又称为菱形继承。菱形继承的问题:菱形继承主要有数据冗余和二义性的问题。由于最底层的派生类继承了两个基类,同时这两个基类有继承的是一个基类,故而会造成最顶部基类的两次调用,会造成数据冗余及二义性问题。如下图所示,在Assistant的对象中Person成员会有两份。class P原创 2020-07-21 15:34:51 · 697 阅读 · 0 评论 -
C++中priority_queue优先队列
优先队列的概念优先队列包含在头文件中。优先队列是由二项队列编写而成的,可以以log(n)的效率查找一个队列中最大值或最小值(最大值和最小值是由你选择创建的优先队列的性质决定的),这在很多场合可以派上很大的用处,例如prim算法如果结合优先队列可以产生出很好的效果。priority_queue的模板生命是带有三个参数的:priority_queue<type,container,function>;//type是数据的类型//container为实现优先队列的底层容器//functi原创 2020-05-15 09:47:26 · 291 阅读 · 0 评论 -
unorder(哈希-海量数据处理)
1. unordered系列关联式容器1.1 unordered_map1.1.1 unordered_map的文档介绍unordered_map是存储<key, value>键值对的关联式容器,其允许通过key快速的索引到与其对应的value。在unordered_map中,键值通常用于惟一地标识元素,而映射值是一个对象,其内容与此键关联。键和映射值的类型可能不同。在内部...原创 2020-05-01 20:37:02 · 712 阅读 · 4 评论 -
C++之STL标准模板库——从入门到精通
STL的本质通俗说:STL是Standard Template Library(标准模板库),是高效的C++程序库,其采用泛型编程思想对常见数据结构(顺序表,链表,栈和队列,堆,二叉树,哈希)和算法(查找、排序、集合、数值运算…)等进行封装,里面处处体现着泛型编程程序设计思想以及设计模式,已被集成到C++标准程序库中。具体说:STL中包含了容器、适配器、算法、迭代器、仿函数以及空间配置器。S...原创 2020-04-30 18:21:37 · 2297 阅读 · 46 评论 -
STL之空间配置器
1. 什么是空间配置器空间配置器,顾名思义就是为各个容器高效的管理空间(空间的申请与回收)的,在默默地工作。2. 为什么需要空间配置器我在前面在模拟实现vector、list、map、unordered_map等容器时,所有需要空间的地方都是通过new申请的,虽然代码可以正常运行,但是有以下不足之处:空间申请与释放需要用户自己管理,容易造成内存泄漏频繁向系统申请小块内存块,容易造成内存...原创 2020-04-29 22:23:52 · 429 阅读 · 1 评论 -
C++特殊类设计+类型转换
特殊类设计1. 请设计一个类,只能在堆上创建对象实现方式:将类的构造函数私有,拷贝构造声明成私有。防止别人调用拷贝在栈上生成对象。提供一个静态的成员函数,在该静态成员函数中完成堆对象的创建class HeapOnly { public: static HeapOnly* CreateObject() { re...原创 2020-04-29 00:58:56 · 720 阅读 · 5 评论 -
C++11知识点总结(全面解析C++11经常考到的知识点)
1. C++11简介相比于C++98/03,C++11则带来了数量可观的变化,其中包含了约140个新特性,以及对C++03标准中约600个缺陷的修正,这使得C++11更像是从C++98/03中孕育出的一种新语言。相比较而言,C++11能更好地用于系统开发和库开发、语法更加泛华和简单化、更加稳定和安全,不仅功能更强大,而且能提升程序员的开发效率。2. 列表初始化2.1 C++98中{}的初始化...原创 2020-04-28 17:43:22 · 4817 阅读 · 6 评论 -
C++11智能指针
1. 为什么需要智能指针?malloc出来的空间,没有进行释放,存在内存泄漏的问题。异常安全问题。如果在malloc和free之间如果存在抛异常,那么还是有内存泄漏。这种问题就叫异常安全。2. 内存泄露2.1 什么是内存泄漏,内存泄漏的危害什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后...原创 2020-04-28 17:11:50 · 621 阅读 · 1 评论 -
AVL树和红黑树(map和set的底层实现)
map和set的概念及使用map和set的底层结构map和set其底层都是按照二叉搜索树来实现的,但是二叉搜索树有其自身的缺陷,假如往树中插入的元素有序或者接近有序,二叉搜索树就会退化成单支树,时间复杂度会退化成O(N),因此map、set等关联式容器的底层结构是对二叉树进行了平衡处理,即采用平衡树来实现。AVL树AVL树的概念二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉...原创 2020-04-26 11:26:06 · 1200 阅读 · 3 评论 -
map和set的概念及使用
什么是关联式容器?关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是<key, value>结构的键值对,在数据检索时比序列式容器效率更高什么是键值对?用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value,key代表键值,value表示与key对应的信息STL中对键值对的定义:template <class T1,...原创 2020-04-20 21:42:38 · 5743 阅读 · 1 评论 -
二叉树由浅至深(下)
5. 二叉搜索树5.1 二叉搜索树概念二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树int a [] = {5,3,4,1,7,8,2,6,0,9};5.2 二叉搜索树操作5.2.1 二叉搜索树的查找...原创 2020-04-16 17:42:48 · 196 阅读 · 1 评论 -
什么是多态?如何实现?只看这一篇就够了
1. 多态的概念1.1 概念多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。2. 多态的定义及实现2.1多态的构成条件多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。那么在继承中要构成多态还有两个条件:必须通过基类的指针或者引用调用虚函数被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写2.2 ...原创 2020-04-12 20:00:12 · 97517 阅读 · 14 评论 -
继承
1.继承的概念及定义1.1继承的概念继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。 class Person{public: void Print() { ...原创 2020-04-12 15:20:50 · 239 阅读 · 0 评论 -
一文了解stack和queue类的实现
1. stack的介绍和使用1.1 stack的介绍stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。stack的底层容器可以是任何标准的容器...原创 2020-04-07 14:40:20 · 337 阅读 · 0 评论 -
一文了解STL容器deque类
1.queue类的介绍和使用1.1 queue的介绍deque是双端队列不规则的首字母缩写,双端队列是动态大小的序列式容器,其可以像两端进行伸缩。特定的库可以以不同的方式实现deque,但通常都是一种动态数组。不论在何种情况下,它都允许通过、随机访问迭代器直接访问单个元素,可以根据需要动态的伸缩。因此,deque提供了一些与vector相似的功能,但deque在头部和尾部进行数据插入和删...原创 2020-04-06 23:35:57 · 230 阅读 · 0 评论 -
list类
1.list的介绍和使用1.1 list的介绍list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效。与...原创 2020-04-05 22:56:31 · 1482 阅读 · 0 评论 -
vector类
1.vector的介绍和使用1.vector的介绍vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为...原创 2020-03-04 14:22:19 · 680 阅读 · 0 评论 -
String类总结
1.string类介绍string是表示字符串的字符串类该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操 作。string在底层实际是:basic_string模板类的别名,typedef basic_string<char, char_traits, allocator> string;不能操作多字节或者变长字符的序列。在使用stri...原创 2020-03-04 00:52:56 · 383 阅读 · 0 评论 -
指针总结
指针的概念指针就是个变量,用来存放地址,地址唯一标识一块内存空间。指针的大小是固定的4/8个字节(32位平台/64位平台)。指针是有类型,指针的类型决定了指针的±整数的步长,指针解引用操作的时候的权限。指针的运算。字符指针在指针的类型中我们知道有一种指针类型为字符指针 char*使用方式:#include<iostream>using namespace std;...原创 2020-02-24 15:41:06 · 170 阅读 · 0 评论 -
结构体
结构体的声明结构的基础知识结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量结构的声明struct tag{ member-list;}variable-list;例:typedef struct student{ int sid; .//学号 char name[20]; //姓名 int age;//年龄 char tel[15];//电...原创 2020-02-23 20:11:45 · 537 阅读 · 0 评论 -
数组大小分配(动态内存分配)
在使用数组的时候,总是有一个问题,数组应该有多大?在很多情况下,我们无法确定要使用多大的数组。一般申请大于估计数目的固定大小,这样程序在运行时就申请了固定的大小,你觉得数组定义足够大,但是如果某种原因,数组的个数增大或减小,你又必须重新修改程序,扩大数组的存储范围。这种分配固定大小内存分配的方法称为静态内存分配。但是这种分配方法存在比较严重的缺陷,特别是处理某些问题时,在大多数情况下会浪费大量的...原创 2020-02-22 21:31:40 · 5487 阅读 · 4 评论 -
static有什么作用?
关键字static的作用是什么函数体static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值在模板内的static全局变量可以被函数内所有函数访问,但不能模板外其他函数访问在模板内的static函数只可被这一模块内的其他函数调用,这个函数的适用范围被限制在声明他的模板内在类中static成员变量属于整个类所拥有,对象的所有对象...原创 2020-02-15 23:25:18 · 1423 阅读 · 2 评论 -
模板(下)——(类模板)
类模板声明类模板类模板的成员函数被认为是函数模板,也称为类属函数。声明类模板的一般格式如下:template 类型形参表class 类名{ 类声明体;};template 类型形参表返回类型 类名 类型名表::成员函数1(形参表){ 成员函数定义体;};template 类型形参表返回类型 类名 类型名表::成员函数2(形参表){ 成员函数定义体;};……t...原创 2019-10-01 21:42:38 · 220 阅读 · 0 评论 -
模板(上)——(函数模板)
模板概述C++有两种模板机制:函数模板和类模板。模板中的参数也称为类属参数。模板、模板类、对象和模板函数之间的关系:函数模板函数模板是对一组函数的描述,他不是一个真实的函数,编译系统并不产生任何执行代码。当编译系统在程序中发现有与函数模板中相匹配的函数调用时,便产生一个重载函数,该重载函数的函数体与函数模板的函数体相同,该重载函数就是模板函数。声明模板函数声明函数模板格式:temp...原创 2019-09-30 23:15:41 · 224 阅读 · 0 评论 -
运算符重载(看完这篇彻底掌握重载问题)
运算符重载概述什么是运算符重载运算符重载:用同一个运算符完成不同的运算功能。C++运算符重载的相关规定如下:1.不能改变运算符的优先级。2.不能改变运算符的结合性。3.默认参数不能和重载的运算符一起使用,也就是说,在设计运算符重载成员函数时不能使用默认函数。4.不能改变运算符的操作数的个数。5.不能创建新的运算符,只有已有运算符可以被重载6.运算符作用于C++内部提供的数据类型...原创 2019-09-27 21:05:40 · 9417 阅读 · 1 评论 -
友元
友元提供了一种突破封装的方式,有时提供了便利。但是友元会增加耦合度,破坏了封装,所以友元不宜多用。友元函数声明友元函数友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加friend关键字。格式如下:class Myclass{ public: …… friend void add(int n ); ……}友元...原创 2019-09-15 16:54:16 · 253 阅读 · 1 评论 -
析构函数
什么是析构函数当对象结束其生命周期,如对象所在的函数已调用完毕时,系统会自动执行析构函数。在C++语言中:析构函数名应与类名相同,只是在函数名前面加一个位取反符 ~ ,例如 ~ stud( ),以区别于构造函数。它不能带任何参数,也没有返回值(包括void类型)。只能有一个析构函数,不能重载。如果用户没有编写析构函数,编译系统会自动生成一个缺省的析构函数,它也不进行任何操作。所以许多简单的类...原创 2019-09-13 15:45:54 · 469 阅读 · 0 评论 -
C++内存管理(new与delete)
1.new与deletenew 与delete运算符一起使用,以达到直接进行动态内存分配和释放的目的。运算符new返回指定类型的一个指针,如果分配失败(如没有足够的内存空间),则返回0。例:double *p;p = new double;系统自动根据double类型的空间开辟一个内存单位,并将地址放在p中。运算符delete的操作是释放new请求到的内容。需要注意以下几点:(...原创 2019-09-12 21:04:11 · 333 阅读 · 1 评论 -
指针和数组的关系
在C++中,数组与指针密切相关,几乎可以互相使用。数组名可以认为是常量指针,它指向存放数组第一个元素的内存地址。指针可以完成任何涉及数组下标的操作。实际上,数组下标表示法在编译期间将转化为指针表示法,所以用指针方式来书写数组下标表达式可以节省编译时间。例如,对于下面的数组定义:char name[10]="Smith";name等于&name[0]。如果再定义一个字符指针:ch...原创 2019-09-08 21:54:57 · 218 阅读 · 0 评论 -
C++入门知识(二)
6.引用1.什么是引用?引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。**类型& 引用变量名(对象名) = 引用实体;**void TestRef(){ int a = 10; int& ra = a;//<====定义引用类型 printf("%p\n", &a); p...原创 2019-08-01 16:04:16 · 254 阅读 · 0 评论 -
C++入门知识(一)
一、#命名空间在C/C++中,变量、函数和类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染namespace关键字的出现就是针对这种问题的。1.命名空间的定义定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。//1....原创 2019-07-31 16:18:28 · 253 阅读 · 0 评论