对开发者的要求
设计哲学:Zero Overhead
学习层次
- 语言只是工具
- 比如招牌厨师,人家问你熟悉什么菜系,你说自己菜刀运用很精通
- C++只是工具
- 操作系统,图形学,网络编程,数据结构和算法,设计模式是各大菜系
- 操作系统:进程和线程,内存池
- 流媒体,驱动开发,游戏引擎开发,服务端开发,客户端开发,量化交易是各种美味佳肴(真实需求)
相关知识要求
- 操作系统的内核
- 操作系统存储
- 崩溃一致性
- 处理器模型
- IO操作
- C++的编译工具链
计算机语言
- 人机交流,为应付复杂程度不断提高的现代编程任务而设计的
- 计算机语言要处理两个概念
- 数据:程序使用和处理的信息
- 算法:程序使用的方法
程序编译过程
graph LR
A(源代码) --> B(编译器)
B --> C(目标代码)
C --> D(链接程序)
D --> E(可执行代码)
H(启动代码) .-> D
I(库代码) .-> D
C++简介
C++最初由 Bjarne Stroustrup 于1979年在贝尔实验室开发
1998年,第一个C++标准获得了 ISO 标准委员会的批准
C++融合了3种不同的编程方式
- 在C语言(面向过程编程)的基础上
- 添加了面向对象编程和泛型编程的支持
C++特征
- 变量区分大小写字符
- 函数重载,允许创建多个同名函数,条件是它们的参数列表不同
- 单引号只用于一个字符,双引号用于一个字符串
C++常用头文件
#include <iostream>
#include <cmath>
#include <string>
#include <cstring>
#include <vector>
#include <array>
#include <ctime>
#include <cctype>
#include <fstream>
C++的内存管理
变量和函数都具有存储连续性,即在内存中的存在的时间
- 自动存储
- 连续性:在程序块开始时分配内存,在程序块结束时释放内存
- 特征:通常存储在栈中,执行代码块时,变量依次入栈,离开代码块时,按相反的顺序释放变量,称为后进先出(LIFO)
- 静态存储
- 用法
- 一种是在函数外定义它
- 一种是在声明变量时使用关键字 static
- 连续性:在程序启动时分配内存,在程序结束时释放内存
- 用法
- 动态存储
- 用法:
- 使用 new 手动分配内存
- 使用 delete 手动释放内存
- 连续性:在程序启动时分配内存,在程序运行时释放内存
- 特征:如果使用 new 创建变量后,没有调用 delete,将导致内存泄漏,被泄露的内存将在程序的整个生命周期内都不可使用;极端情况下,可能出现内存耗尽错误,导致程序崩溃;另外这种泄露也会影响其他应用程序,导致崩溃
- 用法:
- 线程存储(C++11)
- 用法:
- 声明变量时使用关键字 thread_local
- 特征:让程序能够将计算放在可并行处理的不同线程中
- 用法:
C++的作用域
变量和函数在程序中的可见性
- 全局作用域
- 函数作用域
- 块作用域
C++的链接性
变量和函数在不同源文件之间共享的能力
- 内部链接性
- 只能在定义它们的源文件中访问
- 使用关键字 static 定义的全局变量和函数具有内部链接性
- 外部链接性
- 可以在多个源文件中访问
- 全局变量和函数默认具有外部链接性,可以使用关键字 extern 显式指定
C++头文件常包含的内容
不创建变量,只是告诉编译器如何创建该变量
- 函数原型
- 结构声明
- 类声明
- 模板声明
有特殊的链接属性
- 使用 #define 或 const 定义的符号变量
- 内联函数
C++模板
- 是一种泛型编程工具
- 可以在不指定具体类型的情况下,编写通用的代码,根据实际情况产生出不同的类型