C++知识整理
整理进度
1_ C++(31)中有很多没有整理的,找出来整理。
1.C++语言基础
C++类型转换:static_cast、reinterpret_cast、dynamic_cast、const_cast
- C风格的类型转换:(类型说明符)表达式,如int valueB = (int) valueA;
- reinterpret_cast:主要针对指针或引用,重新解释指针所指地址的内存。很强大,很少用,最好不用吧(我的想法)。reinterpret_cast执行什么动作是依赖于编译器的,所以不具有可移植性。
- static_cast:普通类型转换(非指针且非引用),如double转int、void*类型指针转换、有继承关系的指针之间的转换、non-const对象转const对象。【最经常使用】
- dynamic_cast:在需要保证“安全的向下转型”的情况下使用,如当转型基类指针时,无法确定此基类指针指向的是否是子类对象。dynamic_cast会拖慢运行。所以我觉得非必要时,直接使用static_cast。
- const_cast:用来移除变量的const或volatile限定符
C++ delete:delete操作相当于说明当前指针指向内存被释放了,此块内存由操作系统接管了。当前指针所指区域做了什么操作,则是一个未定义行为(未定义行为:每个编译器可能都有不同的实现,C++标准中并未有明确的定义)。
- close-on-exec:子进程默认会继承父进程的所有文件描述符,但是如果某个文件描述符设置了close-on-exec,那么从父进程中继承得到的文件描述符会在子进程(fork生成子进程)中被关闭。
- execl函数:在代码中调用其他可执行程序
void指针(void*)用法:void指针可用于存放任意对象的地址,需要类型转换以后才能使用,如*((int*)a)
C++和C中的输入输出总结、标准输入/标准输出/标准错误与重定向,>>、>、<、<<
- libevent所讲的函数:封装了epoll
- bufferevent所讲的函数:封装了listen、accept等
2.C++编译
2.1 gcc编译和gdb调试的学习
C程序编译成可执行文件后,才能有运行。我常用gcc工具将c程序编译成可执行文件。
GCC编译流程分为四个步骤: 编译预处理、编译、汇编和链接
请参考:gcc编译和gdb调试的学习
我觉得gdb对我没什么用。知道gdb是对生成的二进制文件进行调试就行。
确实有兴趣的可参考: gdb调试
注意点:
g++中链接库的指定顺序也会影响编译是否成功
gcc能编译通过的,g++不一定能编译通过
2.2 C\C++ 静态库和动态库
按照下面顺序进行学习:
静态库和动态库的简介和制作
linux C\C++动态库(共享库)编译和运行时的链接
动态链接库的隐式加载和显示加载
2.3 makefile、cmake和configure脚本
使用g++编译程序的时候,需要依赖很多库文件和头文件,当工程很大时,在命令行中使用一条gcc命令编译整个工程就会显得困难。
所以我们将gcc编译各种程序的命令放入一个文件中,这个文件命名为Makefile。
makefile使用
./configure是一种叫autoconf的构建工具自动生成的构建文件,它以shell script的形式存储,在cmake之前是c/c++的主流构建工具。近年来很多项目有从autoconf转向cmake的趋势。autoconf和cmake的共同点是会生成makefile,然后从makefile执行真正的编译构建过程。
configure生成Makefile文件全过程
cmake:
上面我们学到的是linux下Makefile的编写规则,但是不同平台有不同的Makefile文件编写规则,为了解决不同平台编写规则的不同,就需要使用cmake。在使用cmake时,需要开发者编写一种平台无关的CMakeList.txt 文件来定制整个编译流程,然后通过cmake命令就可以根据目标的平台生成所需的本地化Makefile和工程文件。
cmake入门
cmake 常用变量和常用环境变量
Cmake之深入理解find_package()的用法
cmake升级\更新-ubuntu
系统学习cmake:
【cmake】为程序添加版本号和带有使用版本号的头文件:本文章中还提到了CMake的configure_file指令的使用
CMake的configure_file指令:复制输入文件到输出文件,输出文件中将输入文件中的@VAR@或者${VAR}等变量替换成具体的值。@VAR@或者${VAR}是CMakeLists.txt中的变量。configure_file让普通文件,也能使用CMakeLists.txt中的变量。
【cmake】add_subdirectory实例,设定add_subdirectory包含的模块是否可用:此链接还没有写完。。。
按照此链接学习cmake,还没学完:https://juejin.cn/post/6844903557196414989
C++面向对象
- 虚指针与虚函数表:如果一个类拥有virtual函数或父类拥有virtual函数,则当此类创建对象时,内存中存储了数据成员和指向虚表的指针,虚表中指明该类对象应该调用哪个虚函数。我觉得同一个类创建的对象应该是共享同一个虚表。
- 虚函数调用过程:当对象调用虚函数时,会通过虚指针找到虚表,最后通过虚表找到应该调用的虚函数。
- 【注】当父类中存在虚函数,而子类中不存在虚函数,那么子类和父类公用同一个虚表。
- 多态:使用基类指针实现多态时,需要使用虚函数。
- override:告诉编译器此函数是重写父类中的虚函数,此时编译器就会查找父类中是否有相同签名的函数,如果父类不存,编译时就会报错。
【注】函数的签名包括:函数名,参数列表,const属性。 - final:阻止类的进一步派生 或 虚函数的进一步重写。
C++之纯虚函数:拥有纯虚函数的类称为抽象类;抽象类不能实例化。
C++中虚析构函数的作用及其原理分析:当父类的析构函数不声明成虚析构函数的时候,如果父类的指针指向子类对象,此时delete掉父类的指针,只调动父类的析构函数,而不调动子类的析构函数。
- 友元:让其他函数(类外函数或者其他类的成员函数)可以访问对象的private和protect类型成员
- 虚基类(不是虚函数哦):解决多继承中的间接二义性问题
多继承:子类有两个或两个以上的父类
间接二义性:首先我们知道子类继承父类中成员是将成员复制一份。当B和C都继承了A,然后D又继承了B和C。如果A中有成员a,那么D中就有两个名字相同的a。
虚基类:虚基类就是让当B和C都“虚”继承了A,如果D又继承了B和C。如果A中有成员a,那么D只有一个a。 - 直接二义性问题:多个基类中拥有同名的成员A,子类调用A时编译器无法确定调用的是哪个A。
解决方法:一般利用类的作用域分辨符解决,如Car::show()代表调用了类Car的函数show。 - 多态:假设B和C都继承于基类A,则B和C的对象都可以用基类的对象的指针a进行指向。当a调用方法x时,由于B和C类的方法x的实现是不一样,同样使用a->x得到的效果是不同。多态指的就是:使用相同的代码a->x,却可以根据a具体指向的对象而实现出不同的效果,这个不同的效果就是多态。
- 拷贝构造函数(一种特殊的构造函数):用一个对象初始化一个新建立的对象。默认拷贝构造函数的功能是把传入的对象的每个数据成员的值依次复制到新建立的对象中。
拷贝构造函数在三种情况下被调用:1)用于用一个对象初始化另一个对象 2)对象作为实参传递给形参 3)作为函数的返回值。举例如下: - 深拷贝构造函数:默认拷贝构造函数是将一个对象的所有数据成员的值,复制给另一个对象的所有数据成员。但是当数据成员中存在指针时,默认拷贝构造函数只会拷贝地址到另一个对象。这就会导致两个不同的指针指向同一个地址,两个对象中的指针指向同一个内存空间,可能会导致内存的多次释放。
这个时候就需要重写拷贝构造函数来开辟新的内存空间,从而让两个不同的指针指向的地址不同且不同地址中存储的数据是相同的。
多线程
C++ 条件变量(condition_variable)、notify、wait、互斥量(mutex)、同步过程:
- 条件变量中包含如下两种函数:notify、wait
- 虚假唤醒
- 错过唤醒
C++中类的普通成员函数不能作为 pthread_create的线程函数:因为普通成员函数隐含形参this
C++多线程中的join, detach, joinable
- join的意思是父线程等待子线程结束
- detach的含义是父线程和子线程相互分离,即使父线程结束了,只要主线程没有结束,子线程就会继续正常运行。
- joinable:是否能被join或者detach
C++ 线程池:线程池:创建几个线程用于处理任务,这些线程暂时不销毁,从而减少线程创建和销毁所需的时间。实现线程池所需内容如下:
- 一个锁:用于线程互斥访问任务队列
- 两个条件变量:
1.当任务队列满时,此时生产者线程阻塞。当任务队列不满时,此时通知生产者线程添加任务。
2.当任务队为空时,此时消费者线程阻塞。当任务队列不为空时,此时通知消费者线程处理任务。 - 循环队列:用循环队列实现任务队列
C++模板编程
C++ 模板:模版分为类模版、函数模版、成员函数模板。
C++模板的偏特化与全特化
C++关键字
C++ 宏(define)总结宏的作用:
- 替换作用:使含义更加明确或者使代码更加简洁
- 选择作用:头文件是否已经包含或者在哪个平台运行哪段代码
- 宏与其他具有替换作用的关键字的区别:说区别的时候,只要讲define只是简单地替换作用,然后讲一下其他具有替换作用的关键字的特点就行。
static:
- static 详解
静态变量:限定此变量的使用范围,并在限定访问内共享此变量。
静态函数:对于静态成员函数来说,可通过类名访问、函数内不可使用非静态成员、不隐含this。
静态成员变量必须在类外进行初始化。 - C++ static静态成员函数详解:普通成员函数隐含形参this
- C++中类的普通成员函数不能作为 pthread_create的线程函数:因为普通成员函数隐含形参this
- extern:用于变量声明,或暗示函数可能在别的源文件里定义
- extern "C":让此c++代码按照c语言的方式编译。使得“c++代码中使用c库”和“c代码中使用c++库”
- volatile的作用: 作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。简单地说就是防止编译器对代码进行优化。
当要求使用volatile声明的变量的值的时候,系统总是重新从它所在的内存读取数据,而不是使用保存在寄存器中的备份。即使它前面的指令刚刚从该处读取过数据。 - 一般在多个线程访问同一个变量时,使用volatile修饰此变量
- 对于简单且经常调用的函数,防止栈溢出,而对编译器的一个建议,编译器不一定会执行
- 定义在类中的成员函数默认都是内联的
- inline和define区别
C++11
C++11 enable_shared_from_this:当一个类被共享智能指针 share_ptr 指向,且在类的成员函数里需要把当前类对象作为参数传给其他函数时,这时就需要传递一个指向自身的 share_ptr。
输入输出流(读写文件)
使用fopen打开文件时,如果文件不存在,就不需要执行fclose,否则会产生段错误
C++常用库的使用
待学习:
leveldb
写好的C++使用小程序
C++与python的互相调用:
音视频开发
音视频基础知识(访问密码:1qaz)的主要内容:
- 常见的音视频压缩算法(如H264)、封装格式(如MP4)
- RGB与YUV
- MP4标准和h264格式
- 音视频的一些名词解释
- 音频编码原理
ffmpeg安装和基本使用(访问密码:1qaz)的主要内容:
- ffmpeg中各个库的功能介绍
- FFmpeg处理音视频流程
- ffmpeg常用的八类命令
网络编程
网络编程常用函数的封装 from 黑马程序员
C++进程控制:ps、top(动态显示运行中的进程)、kill、进程退出(exit() 和_exit())、等待子进程退出并清理子进程(wait() 和 waitpid())
- 不同架构的相同信号对应的数字可能是不同的,所以要让程序具有系统可移植性,最好使用信号的名称而不是编号。
- 通过调用系统命令/函数、快捷键等方式可以产生信号。
- 阻塞信号集(屏蔽信号)和未决信号集(记录产生到未处理的信号)
- 信号产生函数:kill函数、raise函数——自己给自己发信号、abort函数——给自己发送异常终止信号SIGABRT、alarm函数(闹钟)/setitimer函数——定时给自己发送SIGALRM信号
- 信号捕捉过程
- signal函数用于指定某个信号的信号处理函数
C++知识整理的更多相关文章
- js事件(Event)知识整理
事件(Event)知识整理,本文由网上资料整理而来,需要的朋友可以参考下 鼠标事件 鼠标移动到目标元素上的那一刻,首先触发mouseover 之后如果光标继续在元素上移动,则不断触发mousemo ...
- Kali Linux渗透基础知识整理(四):维持访问
Kali Linux渗透基础知识整理系列文章回顾 维持访问 在获得了目标系统的访问权之后,攻击者需要进一步维持这一访问权限.使用木马程序.后门程序和rootkit来达到这一目的.维持访问是一种艺术形式 ...
- Kali Linux渗透基础知识整理(二)漏洞扫描
Kali Linux渗透基础知识整理系列文章回顾 漏洞扫描 网络流量 Nmap Hping3 Nessus whatweb DirBuster joomscan WPScan 网络流量 网络流量就是网 ...
- wifi基础知识整理
转自 :http://blog.chinaunix.net/uid-9525959-id-3326047.html WIFI基本知识整理 这里对wifi的802.11协议中比较常见的知识做一个基本的总 ...
- 数据库知识整理<一>
关系型数据库知识整理: 一,关系型数据库管理系统简介: 1.1使用数据库的原因: 降低存储数据的冗余度 提高数据的一致性 可以建立数据库所遵循的标准 储存数据可以共享 便于维护数据的完整性 能够实现数 ...
- 【转载】UML类图知识整理
原文:UML类图知识整理 UML类图 UML,进阶必备专业技能,看不懂UML就会看不懂那些优秀的资料. 这里简单整理 类之间的关系 泛化关系(generalization) 泛化(generalize ...
- Linux进程管理知识整理
Linux进程管理知识整理 1.进程有哪些状态?什么是进程的可中断等待状态?进程退出后为什么要等待调度器删除其task_struct结构?进程的退出状态有哪些? TASK_RUNNING(可运行状态) ...
- js事件(Event)知识整理[转]
事件注册 平常我们绑定事件的时候用dom.onxxxx=function(){}的形式 这种方式是给元素的onxxxx属性赋值,只能绑定有一个处理句柄. 但很多时候我们需要绑定多个处理句柄到一个事件上 ...
- Spring Ioc知识整理
Ioc知识整理(一): IoC (Inversion of Control) 控制反转. 1.bean的别名 我们每个bean元素都有一个id属性,用于唯一标识实例化的一个类,其实name属性也可用来 ...
- android网络交互之DNS优化知识整理
android网络交互之DNS优化知识整理 之前的工作中,经常会遇到DNS解析出问题导致网络交互的操作无法正常进行. UnknownHostException 在很多的移动开发过程中,与服务端的交互的 ...
随机推荐
- spring-cloud03-consul
官网的安装说明https://learn.hashicorp.com/tutorials/consul/get-started-install 1.下载安装 环境:阿里云服务器,consul1.9.5 ...
- mysql15 sql优化-小表驱动大表 IN和EXITS
转:https://blog.csdn.net/qq_27409289/article/details/85963089 1.IN查询分析 select * from a where a.id in ...
- xml基本学习
概念:可拓展标记语言.可拓展即标签都是自定义的.标记语言即由标签构成的语言. 功能:存储数据: 配置文件 在网络中传输 语法 基本语法: xml文件后缀名为.xml xml第一行必须定义为文档声明 x ...
- .NET Core 项目启动时运行定时任务
1.任务需求 在每次服务启动时定时(如24小时)清理一次缓存文件 2.代码实现 1)新建文件清理类 .NET Core 提供了BackgroundService的抽象类,在 ExecuteAsync ...
- mapreduce的使用
mapreduce的使用 以下案例写之前需要导入jar包依赖: <dependencies> <dependency> <groupId>org.apache.ha ...
- Apache Hudi 负载类Payload使用案例剖析
在 Hudi 中可以根据业务场景为 Hudi 表配置负载类Payload,它用于在更新期间合并同一记录的两个版本.本文将深入了解有效负载类的用途以及可以使用的所有不同方式. 配置:hoodie.dat ...
- MRI病变能否预测已获临床缓解的早期RA未来放射学进展
MRI病变能否预测已获临床缓解的早期RA未来放射学进展 Tamai M, et al. EULAR 2015. Present ID: FRI0048. 原文 译文 FRI0048 MRI BONE ...
- Mybatis 实体类驼峰命名与数据库字段之间映射
数据库的命名规则和 Java 的命名规则不一致,导致实体类与数据库字段不能完美映射. 一.可以在 mapper.xml 中通过 resultMap 来解决: <resultMap id=&quo ...
- StatefulWidget 组件的参数时(widget.xxx)报 Invalid Constant Value
一个 Flutter 组件(Widget)在很多情况下都需要接收一些参数.Flutter 插件通常提示使用 const 关键字包裹某 Widget(很多人接受建议且执行),导致通过 widget.xx ...
- 基于Linux编译JDK18
1.概述 JDK都没手动编译过,敢说自己是Java程序员吗?(By 羊哥--JDK都没手动编译过,敢说自己是Java程序员吗?实战编译Java源码(JDK源码,JVM)视频教程_哔哩哔哩_bilibi ...