本篇写给C++初学者,作为概览,文中仅包含各方面基础知识,无深入分析。
C++基础概念简介
C++编译过程示意图
关键词:源文件、预编译、编译、汇编、链接
C++工具链总结
cmake项目工程文件是一种中介工程文件,可以转化成其他不同类型的工程文件,如visual studio/XCode工程文件,这样在不同操作系统中移植代码会方便很多。
关键词:
IDE : XCode / Visual Studio / Visual Studio Code
项目工具:xcodebuild / msbuild / nmake / cmake / make / ninja
代码组织:.xcodeproject / .sln / CMakeLists.txt / Makefile / build.ninja
编译器:clang / vc++ / gcc / g++
C++语法基础概念
函数及作用域
关键词: 命名空间 、 前置声明 、 函数声明 、 函数定义 、 main 、程序入口、变量
类及其特性
- 抽象:把公共特性找抽象出来,像机动车通常都有4个轮子、一个盒子。
- 封装:把相关的数据放到一起,像机动车有车厢、座位、轮子等。
- 继承:为派生类(子类)增加个性化的属性,像救护车上有蓝色救护灯
- 多态:不同派生类对同一个成员函数的实现不一样,像跑车和老头乐的驾驶体验定不相同
关键词:类定义、公有、可见性、继承、私有、虚函数、纯虚函数、重写、覆盖、override、构造函数、纯虚类
模板及常用泛型
通常用于在不更改类结构的情况,改变底层的数据类型。例如,
棋盘坐标用整型(int)就可以表示,如(2,3)表示2行3列。
地图的坐标就需要用浮点数(float/double)表示,如(123.234, 345.456)表示x/y的值。
此时写整型、浮点型的点坐标类明显不合适。那么使用模板,可以比较好的解决这个问题
用模板写出的函数或类均属于泛型。C++标准库提供的常用泛型类包括:
- std::vector 动态序列数组,常用于随机访问多的场景,示例 std::vector
- std::list 链表,常用于插入、删除较多的场景,示例 std::list
- std::deque 双向队列,适用于首尾插入及删除较多、及随机访问多的场景,示例 std:: deque
- std::set 集合,保证无相同元素的场景,示例 std::set
- std::unordered_set 哈希集合,效率较std::set高,但数据无序,示例 std:: unordered _set
- std::map<Key, Value> 二叉树映射,需要key-value映射的场景,示例 std::map<int, double>
- std::unordered_map<Key, Value> 哈希映射,效率较std::map高,但数据无序,示例 std:: unordered _map<int, double>
智能指针
- std::shared_ptr 共享指针,最接近于裸指针(如int*),指针内保存引用计数,计数为0时删除数据
- std::unique_ptr 独享指针,数据不可分离所有权,指针销毁时,数据同时销毁
- std::auto_ptr (不建议使用) 介于std::share_ptr与std::unique_ptr之间,所有权可转移,且同一时刻只有一个指针有数据所有权。
C++进阶
代码规范
Google代码规范
建议:启用静态检查,clang-tidy
设计模式
《Head First设计模式》
性能进阶
《Effective C++》
备查工具书
《C++ Primer》
阅读开源项目
比如pytorch
Github的开源项目,stars多,fork多,代码质量通常不错。项目的主体代码组织是至少经过几个大版本迭代的,阅读代码可有效提升对软件工程的理解。
敏捷开发模式
敏捷开发是一种以人为核心,迭代,循序渐进的开发方式。
在敏捷开发中,软件项目的构建被切分成多个子项目,各个子项目的成果都经过测试,具备集成和可运行的特征。
加单的说,敏捷开发并不是追求前期完美的设计、完美编码,而是力求在很短的周期内开发出产品核心功能,尽早发布出可用的版本。然后在后续的生产周期内,按照新需求不断迭代升级,完善产品。
敏捷开发模式的分类
敏捷开发的实现主要包括Scrum与XP(极限编程,ExtremeProgramming),还有其他的一些方式。Scrum是迭代式增量软件开发过程。
- XP极限编程更侧重于实践,并力求把实践做到极限,实 践可以是测试先行,也可以是结对变成,关键要看具体的应用场景。
- SCRUM则是一种开发 流程框架,也可以说是一种套路。SCRUM框架中包含了三个角色,三个工件,四个仪式。其目的是为了有效完成每一次迭代周期的工作。SCRUM是一个重点。
回归本质
大胆尝试,快速迭代