![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
C++学习
C++学习笔记总结
cccccccoding.
这个作者很懒,什么都没留下…
展开
-
C++动态内存、智能指针及实现
这篇博客主要对于C++中的动态内存和智能指针。1.动态内存首先在C++中,共有三种请求堆空间的new方法:1.普通的new函数:这是我们经常使用的一种开辟堆空间的方式,这里想顺便再总结一下关于他的内部实现。在之前的博客STL源码剖析的读书笔记中其实也总结过关于普通的new的一些内部的做法,首先明确一点,在与C语言的malloc比较之前,我们先分清在C++中new首先是一个关键字。其次,从功能上看,new其实是与malloc类似的功能,都是开辟堆空间,但是在C++中由于引入了对象的概念,因此,当我们对原创 2021-12-16 20:15:31 · 1019 阅读 · 0 评论 -
C++多态以及通过C语言实现多态
最近要开始准备实习了,所以需要对之前学过的知识做一些总结和回顾,最近发的博客可能更多的是对一些概念的理解。通过C语言实现C++多态一.C++多态的原理在C++中,多态机制是通过虚表以及虚表指针来实现的。我们都知道,当要实现多态功能的时候,都会通过virtual关键字来讲基类中的函数变为虚函数,然后通过子类继承后重写就能够达到多态的效果。但是实际上,在其中,编译器也为我们做了很多的工作。1.当编译器发现基类中存在虚函数的时候,他会自动的生成一份虚表,在虚表中,存放的就是我们这些虚函数的入口地址。2原创 2021-12-16 17:58:37 · 1319 阅读 · 0 评论 -
计算机网络读书笔记(一)
一.计算机网络和因特网1.什么是因特网1.1 因特网的具体构成描述因特网是一个世界范围的计算机网络,在因特网中,所有接入因特网的设备都被称为主机或端系统。端系统通过通信链路和分组交换机连接到一起。不同的链路能够以不同的速率传输数据,链路的传输速率以比特/秒(bit/s)度量。当一台端系统要向另一台端系统发送数据时,发送端系统将数据分段,并为每段加上首部字节,由此形成的信息包用计算机网络的术语来说称为分组。这些分组通过网络发送到目的端系统,并在那里被装配成初始数据。分组交换机从它的一条通信链路接收到原创 2021-08-05 18:16:20 · 1081 阅读 · 0 评论 -
STL源码剖析6:仿函数以及适配器
1.仿函数1.1 简介仿函数即意为函数对象,就是一种具有函数特性的对象,在上一章介绍的算法中,我们可以看到很多的算法往往有两个版本。第一个版本就是表现出最常见的运算,第二个版本则是体现出泛化性的版本,允许用户传入指定的仿函数来完成对应的功能,因此仿函数可以被认为是一种算法的策略作用于算法上。从实现的角度而言,仿函数其实就是一个行为类似于函数的对象,为了能够实现这个功能,因此也就需要我们必须重载function的operator()函数,这样,当我们在仿函数对象后加上()后,对象可以像函数一样的被调用.原创 2021-07-14 10:16:09 · 171 阅读 · 0 评论 -
STL源码剖析:5.算法
1.简介以有限的步骤解决逻辑或数学上的问题,这一专门的科目被称为算法。本章讨论的就是一些被收录于STL中,极具复用价值的算法(以下仅有部分算法)2.数值算法2.1 算法accumulate用来计算init和[first,last)内所有元素的总和,也就是累加返回总和即可,在某些不可以直接进行加操作的类型中,需要传入相应的仿函数,由仿函数完成类似于加的操作。template<class Iterator, class T>T accumulate(Iterator first, It.原创 2021-07-13 12:01:51 · 135 阅读 · 1 评论 -
STL源码剖析:4.关联式容器(下)
1.hashtable1.1 概述hashtable也被成为哈希表(散列表)等、这种结构在插入和删除,以及搜寻等奥做上具有常数平均时间的表现,而且这种表现是以统计为基础,不需要仰赖输入元素的随机性。hashtable可提供对任何有名项的存取操作和删除操作,由于操作对象是有名项,所以hashtable也可被视为一种字典结构,这种结构的用意在于提供常数时间的基本操作。我们可以开辟一个足够大的数组,在数组的每一位上,记录我们存入的元素,我们通过散列函数hash function来完成将传入的元素转换为相.原创 2021-07-09 17:05:10 · 111 阅读 · 0 评论 -
STL源码剖析:4.关联式容器(上)
1.简介 除了常见的序列式容器之外,我们也经常使用关联式问题来解决一些问题,关联式容器相比较序列式容器而言,其主要特性就是它可以通过键值对容器内部的元素来进行索引。2.RB-tree2.1 简介在序列式容器中很大一部分都是通过底层使用红黑树来实现的,所谓红黑树首先他是一个二叉搜索树,树上的每一个结点不是红色就是黑色,并且它还需要满足以下性质:(我们将NULL视为黑色的结点)1.每个结点b不是红色就是黑色。2.根节点为黑色。3.如果某一个结点为红色,那么其子节点必定为黑色。4.任意一个.原创 2021-07-07 20:35:07 · 110 阅读 · 0 评论 -
STL源码剖析:3.序列式容器(下)
1.deque容器deque容器是一种双向开口的连续线性空间,双向开口意为可以在头尾两端分别做元素的插入和删除操作。deque没有容量的概念,因为它是动态地以连续空间组合而成,随时可以增加一段新的空间并链接起来。1.1.deque容器的中控器从逻辑上看来deque是连续空间,deque是由一段一段的定量连续空间组成,一旦有必要在deque的前端或尾端增加新空间,便配置一段定量连续空间,串联在整个deque的头端或尾端,deque的最大任务便是在这些分段的定量连续空间上,维护其整体连续的假象,并提供随.原创 2021-06-20 17:24:05 · 307 阅读 · 0 评论 -
STL源码剖析:3.序列式容器(上)
1.简介 容器是大部分人对于STL的第一印象,用于存储元素。所谓序列式容器,其中的元素可以是有序的也可以是无序的,除了C++本身提供的array容器以外,STL另外提供vector,list,deque,stack,queue,priority_queue容器。其中的queue以及stack其实就是内部内含一个deque容器,其基本功能都是通过deque来实现的,在之后代码展示中会呈现。2.vector容器 vector容器与平时常用的array数组非常的相似,二者的唯一差别在于空间的运用的原创 2021-06-20 15:08:33 · 120 阅读 · 0 评论 -
STL源码剖析:2.iterator迭代器以及traits技法
1.简介在STL的设计中,我们最常使用到的就是算法和容器,最为两个独立的个体,我们需要用一个独特的设计来使得二者能够有效的结合,以此来达到我们使用的目的。因此,迭代器便产生了,它的作用是作为一种胶合剂,使得容器以及算法能够有效的结合在一起,以达到我们使用的目的,其中还涉及到了一种巧妙的设计技法traits。每一部分都是按照侯捷老师的《STL源码剖析》的内容以及顺序进行的,如果发现错误欢迎指正。2.迭代器迭代器一共有五种分类:struct input_iterator_tag {};struct.原创 2021-06-09 23:47:41 · 258 阅读 · 0 评论 -
STL源码剖析:1.空间配置器
1.简介 在STL的使用者层面上,空间配置器一般是隐藏的,使用者不需要知道其具体实现细节即可进行使用;但是从STL的实现角度来说,由于整个STL的操作对象都存放在容器之内,而容器需要配置一定的空间来进行存放数据,因此,想要实现或者说STL的第一步便是掌握空间配置器的原理。每一部分都是按照侯捷老师的《STL源码剖析》的内容以及顺序进行的,如果发现错误欢迎指正。2.空间配置器首先对于C++中的delete和new函数进行一些解释: 在我们使用new来建造一个对象的时候,一般是分为两个步骤的.原创 2021-06-08 17:27:18 · 461 阅读 · 0 评论 -
C++核心编程Day10
1.算法1.1 算法概述 算法主要是由头文件<algorithm><functional><numeric>组成。 1.<algorithm>是所有STL头文件中最大的一个,其中常用的功能涉及到比较,交换,查找, 遍历,复制,修改,反转,排序,合并等... 2.<numeric>体积很小,只包括在几个序列容器上进行的简单运算的模板函数. 3.<functional> 定义了一些模板类,用以声明函数对象。1.2 常用遍历算原创 2021-02-20 19:17:20 · 82 阅读 · 0 评论 -
C++核心编程Day09
1.STL容器1.1 set容器 1.1.1 set容器基本概念 Set的特性是:所有元素都会根据元素的键值自动被排序。Set的元素不像map那样可以 同时拥有实值和键值,set的元素即是键值又是实值。Set不允许两个元素有相同的键值。 set拥有和list某些相同的性质,当对容器中的元素进行插入操作或者删除操作的时候, 操作之前所有的迭代器,在操作完成之后依然有效,被删除的那个元素的迭代器必然是一 个例外。 1.1.2 multiset容器基本概念 multiset特性及用原创 2021-02-19 21:23:48 · 135 阅读 · 1 评论 -
C++核心编程Day08
1.STL基本概念1.1简介 STL(Standard Template Library,标准模板库),STL 从广义上分为: 容器(container) 算法(algorithm) 迭代器(iterator),容器和算法之间通过迭代器进行无缝连接。STL 几乎所有的代码都采用了模板类或者模板函数,这相比传统的由函数和类组成的库来说提供了更好的代码重用机会。STL六大组件简介: 容器:各种数据结构,如vector、list、deque、set、map等,用来存放数据 算法:各种常用的算法,原创 2021-02-18 18:41:56 · 194 阅读 · 1 评论 -
C++核心编程Day07
1.C++类型转换1.1静态转换 1.用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换。 2.进行上行转换(把派生类的指针或引用转换成基类表示)是安全的; 3.进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的。 4.用于基本数据类型之间的转换,如把int转换成char,把char转换成int。这种转换的安全性也要开发人员来保证。//1.基础类型转换void test01(){ char a = 'a'; //static_ca原创 2021-02-16 21:26:43 · 155 阅读 · 1 评论 -
C++核心编程Day06
1.模板1.1 模板概论 c++提供了函数模板,即是建立一个通用函数,其函数类型和形参类型不具体制定,用一个虚拟的类型来代表。这个通用函数就成为函数模板。凡是函数体相同的函数都可以用这个模板代替,不必定义多个函数,只需在模板中定义一次即可。在调用函数时系统会根据实参的类型来取代模板中的虚拟类型,从而实现不同函数的功能。 c++提供两种模板机制:函数模板和类模板 总结: 1.模板把函数或类要处理的数据类型参数化,表现为参数的多态性,成为类属。 2.模板用于表达逻辑结构相同,但具体数据元素类原创 2021-02-14 15:58:34 · 385 阅读 · 1 评论 -
C++核心编程Day05
1.继承1.1 继承的基本概念 c++最重要的特征是代码重用,通过继承机制可以利用已有的数据类型来定义新的数据类型,新的类不仅拥有旧类的成员,还拥有新定义的成员。一个B类继承于A类,或称从类A派生类B。这样的话,类A成为基类(父类), 类B成为派生类(子类)。派生类中的成员,包含两大部分: 1.一类是从基类继承过来的,一类是自己增加的成员。 2.从基类继承过过来的表现其共性,而新增的成员体现了其个性。1.2 继承方式三种继承方式: public : 公有继承 1.父类的原创 2021-02-14 00:51:30 · 124 阅读 · 1 评论 -
C++核心编程Day04
1.常函数和常对象1.1.常函数 1.在函数的()后面加上const,这个函数就是常函数 2.常函数内不能修改普通成员变量 3.const修饰的是this指针指向的空间中的变量不能改变 4.mutable修饰的成员变量在常函数中可以修改1.2.常对象 1.在数据类型前面加上const,让对象成为常对象 2.常对象可以调用常函数 3.常对象可以修改mutable修饰的成员变量#define _CRT_SECURE_NO_WARNINGS#include<iostream>原创 2021-02-12 23:51:14 · 77 阅读 · 0 评论 -
C++核心编程Day03
1 构造函数和析构函数1.1 构造函数和析构函数基础概念构造函数语法: 构造函数函数名和类名相同,没有返回值,不能有void,但可以有参数。 Class Name(){}析构函数语法: 析构函数函数名是在类名前面加”~”组成,没有返回值,不能有void,不能有参数,不能重载。 ~ClassName(){}1.2 构造函数的分类及调用 1.按参数类型:分为无参构造函数和有参构造函数 2.按类型分类:普通构造函数和拷贝构造函数(复制构造函数)#define _CRT_SECURE_N原创 2021-02-09 21:01:07 · 126 阅读 · 0 评论 -
C++核心编程Day02
1.内联函数1.1 内联函数基本概念 在c++中,预定义宏的概念是用内联函数来实现的,而内联函数本身也是一个真正的函数。内联函数具有普通函数的所有行为。唯一不同之处在于内联函数会在适当的地方像预定义宏一样展开,所以不需要函数调用的开销。因此应该不使用宏,使用内联函数。 在普通函数(非成员函数)函数前面加上inline关键字使之成为内联函数。但是必须注意必须配合函数体的定义结合在一起,否则编译器将它作为普通函数来对待。 内联函数的确占用空间,但是内联函数相对于普通函数的优势只是省去了函数调用原创 2021-02-08 18:58:07 · 374 阅读 · 0 评论 -
C++核心编程Day01
1.作用域运算符 作用域运算符可以用来解决局部变量与全局变量的重名问题,即在局部变量的作用域内,可用::对被屏蔽的同名的全局变量进行访问。//全局变量int a = 10;//1. 局部变量和全局变量同名void test(){ int a = 20; //打印局部变量a cout << "局部变量a:" << a << endl; //打印全局变量a cout << "全局变量a:" << ::a << end原创 2021-02-06 16:01:07 · 231 阅读 · 0 评论 -
C语言核心知识点Day10
1.树和二叉树1.1树的基本概念树的定义: 由一个或多个(n≥0)结点组成的有限集合T,有且仅有一个结点称为根(root),当n>1时,其余的结点分为m(m≥0)个互不相交的有限集合T1,T2,…,Tm。每个集合本身又是棵树,被称作这个根的子树 。树的结构特点: 非线性结构,有一个直接前驱,但可能有多个直接后继(1:n) 树的定义具有递归性,树中还有树。 树可以为空,即节点个数为0。各类名称: 根 即根结点(没有前驱) 叶子 即终端结点(没有后继) 森林原创 2021-02-05 20:18:34 · 141 阅读 · 0 评论 -
C语言核心知识点Day09
1.栈1.1栈的基本概念 栈是一个线性表,栈元素具有线性关系,即前驱后继关系。只不过它是一种特殊的线性表而已。在线性表的表尾进行插入和删除操作,当对象为栈的时候,这里表尾是指栈顶,而不是栈底。栈的特殊之处在于限制了这个线性表的插入和删除的位置,它始终只在栈顶进行。这也就使得:栈底是固定的,最先进栈的只能在栈底。也就是说这是一种先进后出的模型。1.2栈的顺序存储 栈的顺序存储结构简称顺序栈,它是运算受限制的顺序表。顺序栈的存储结构是:利用一组地址连续的的存储单元依次存放自栈底到栈顶的数据元原创 2021-02-04 17:32:03 · 252 阅读 · 0 评论 -
C语言核心知识点Day08
1.线性表1.1基本概念 线性表是零个或者多个数据元素的有限序列,数据元素之间是有顺序的,数据元素个数是有限的,数据元素的类型必须相同。1.2线性表的顺序存储 顺序表是线性表的一种,也就是说,将线性表中的元素一个接一个的存储在一块连续的存储区域中,这种顺序表示的线性表也成为顺序表。对于线性表来讲,对于线性表的首结点,只有后继元素没有前驱元素;对于尾结点,只有前驱结点没有后继结点,其余的结点,既有前驱结点,也有后继结点。1.3 顺序表的优点和缺点优点: 无需为线性表中的逻辑关系增加额原创 2021-02-03 23:06:27 · 68 阅读 · 0 评论 -
C语言核心知识点Day07
1.预处理1.1 预处理的基本概念 C语言对源程序处理的四个步骤:预处理、编译、汇编、链接。 预处理是在程序源代码被编译之前,由预处理器(Preprocessor)对 程序源代码进行的处理。这个过程并不对程序的源代码语法进行解析, 但它会把源代码分割或处理成为特定的符号为下一步的编译做准备工作。 1.2 文件包含指令(#include) “文件包含处理”是指一个源文件可以将另外一个文件的全部内容包含进 来。C语言提供了#include命令用来实现“文件包含”的操作。 1.3 宏定义原创 2021-02-01 14:54:50 · 124 阅读 · 0 评论 -
C语言核心知识点Day06
1.链表1.1基本概念 链表是一种常用的数据结构,它通过指针将一些列数据结点,连接成一个数据链。相对于数组,链表具有更好的动态性(非顺序存储)。 数据域用来存储数据,指针域用于建立与下一个结点的联系。 建立链表时无需预先知道数据总量的,可以随机的分配空间,可以高效的在链表中的任意位置实时插入或删除数据。 链表的开销,主要是访问顺序性和组织链的空间损失。1.2链表的分类 1.可以分为静态链表和动态链表 其中静态链表意为栈栈空间中存储的链表,动态链表意为在堆空间中 存储的链表。//静原创 2021-01-31 20:17:53 · 433 阅读 · 1 评论 -
C语言核心知识点Day05
1.结构体嵌套二级指针 当创建结构体变量后,如果其中的成员为指针类型的话,就要将此变量开辟至堆空间,是因为在创建结构体后,程序在运行结束之后,对于结构体变量所占的内存空间就已经分配好了,分配的大小为4字节(也就是一个指针的)大小,如果不重新在堆空间中开辟内存的话,就会导致溢出,因此,一般情况下,看到使用指针类型的数据的时候,应该在堆空间中存储。 同样的,当存在多级指针的时候,也就相应的要开辟多块存储空间,在这个时候,记住先释放内层的堆空间,再释放外层的堆空间。 小技巧:浏览代码看malloc原创 2021-01-30 20:01:41 · 131 阅读 · 0 评论 -
C语言核心知识点Day04
1.一维数组元素类型角度:数组是相同类型的变量的有序集合内存角度:连续的一大片内存空间1.1 数组名 在数组名作为函数参数传递的时候,这个时候数组名会退化为指针,表示指向数组第一个元素的地址,因此,在使用数组名作为函数参数的时候必须要有另外一个参数传递进来,那就是数组的长度。 在绝大多数的情况下,数组名的值是一个指针常量,也就是数组第一个元素的地址。它的类型取决于数组元素的类型:如果他们是int类型,那么数组名的类型就是“指向int的常量指针”;如果它们是其他类型,那么数组名的类型也就原创 2021-01-29 15:33:59 · 152 阅读 · 0 评论 -
C语言核心知识点Day03
1.calloc和realloc1.calloc函数(用法与malloc类似)#include <stdlib.h>void *calloc(size_t nmemb, size_t size);功能:在内存动态存储区中分配nmemb块长度为size字节的连续区域。calloc自动将分配的内存置0。参数:nmemb:所需内存单元数量size:每个内存单元的大小(单位:字节)返回值: 成功:分配空间的起始地址失败:NULLvoid test01(){ //开辟连续的十原创 2021-01-28 18:01:49 · 125 阅读 · 0 评论 -
C语言核心知识点Day02
1.函数调用模型1.1 函数调用流程 在经典的计算机科学中,栈被定义为一个特殊的容器,用户可以将数据压入栈中(入栈,push),也可以将压入栈中的数据弹出(出栈,pop),但是栈容器必须遵循一条规则:先入栈的数据最后出栈(先进后出). 在经典的操作系统中,栈总是向下增长的。压栈的操作使得栈顶的地址减小,弹出操作使得栈顶地址增大。栈在程序运行中具有极其重要的地位。最重要的,栈保存一个函数调用所需要维护的信息,这通常被称为堆栈帧(Stack Frame)或者活动记录(Activate Record)原创 2021-01-26 17:29:15 · 181 阅读 · 0 评论 -
C语言核心知识点Day01
数据类型1.1数据类型基本概念 类型是对数据的抽象; 类型相同的数据具有相同的表示形式、存储格式以及相关操作; 程序中所有的数据都必定属于某种数据类型; 数据类型可以理解为创建变量的模具: 固定大小内存的别名; 数据类型的重要性,还体现在它可以告诉编译器分配多少内存可以放得下我们的数据 注1:运行以下代码,当使用如下所示创建变量的时候,char* 会修饰的是距离最近的那个变量 另外一个变量依旧为char类型。void test02(){ char* p1 = 0, p2 = 1;原创 2021-01-25 17:24:09 · 126 阅读 · 0 评论 -
C语言入门大作业
1.贪吃蛇(可以选择分文件编写,但是为了方便上传就写在一个文件中)#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include<string.h>#include<time.h>#include<conio.h>#include<Windows.h>#define LSIZE 60#define WSIZE 25int gr原创 2021-01-24 21:26:30 · 8123 阅读 · 1 评论 -
C语言基础知识总结(二)
1.指针1. 指针和指针变量 1)内存区的每一个字节都有一个编号,这就是“地址”。 2)如果在程序中定义了一个变量,在对程序进行编译或运行时,系统就会给这个变量分配内存单元,并确定它的内存地址(编号) 3)指针的实质就是内存“地址”。指针就是地址,地址就是指针。 4)指针是内存单元的编号,指针变量是存放地址的变量。 5)通常我们叙述时会把指针变量简称为指针,实际他们含义并不一样。2 指针基础知识2.1 指针变量的定义和使用 指针也是一种数据类型,指针变量也是一种变量 指针变量指向谁,就原创 2021-01-22 15:14:04 · 1148 阅读 · 0 评论 -
C基础知识总结(一)
1.C语言编译过程C代码编译成可执行程序经过4步:1)预处理:宏定义展开、头文件展开、条件编译等,同时将代码中的注释删除,这里并不会检查语法 gcc语法:gcc -E hello.c -o hello.i2)编译:检查语法,将预处理后文件编译生成汇编文件 gcc语法:gcc -S hello.i -o hello.s3)汇编:将汇编文件生成目标文件(二进制文件) gcc语法:gcc -c hello.s -o hello.o4)链接:C语言写的程序是需要依赖各种库的,所以编译之后还需要把库原创 2021-01-15 13:32:06 · 461 阅读 · 0 评论 -
Linux基础知识(二)
1.用户权限及管理1)用户是Unix/Linux系统工作中重要的一环,用户管理包括用户与组账号的管理。 在Unix/Linux系统中,不论是由本机或是远程登录系统,每个系统都必须拥有一个账号,并且对于不同的系统资源拥有不同的使用权限。 Unix/Linux系统中的root账号通常用于系统的维护和管理,它对Unix/Linux操作系统的所有部分具有不受限制的访问权限。 在Unix/Linux安装的过程中,系统会自动创建许多用户账号,而这些默认的用户就称为“标准用户”。在大多数版本的Unix原创 2021-01-02 15:55:26 · 107 阅读 · 0 评论 -
01 Linux基础知识(一)
1.目录 1)目录是一组相关文件的集合。 2)一个目录下面除了可以存放文件之外还可以存放其他目录,即可包含子目录。 3)在确定文件、目录位置时,DOS和Unix/Linux都采用“路径名+文件名”的方式。路径反映的是目录与目录之间的关系。2.路径 路径分为绝对路径和相对路径: 绝对路径: 1)绝对路径是从目录树的树根“/”目录开始往下直至到达文件所经过的所有节点目录。 2)下级目录接在上级目录后面用“/”隔开。 3)注意:绝对路径都是从“/”开始的,所以第一个字符一定是“/”。原创 2020-12-28 18:07:39 · 343 阅读 · 1 评论 -
个人博客
本博客记录个人学习过程,如果有能帮助到你,乐意至极;如果文章中存在错误,也欢迎指正。原创 2020-12-28 15:59:02 · 53 阅读 · 0 评论