C++在行业里的主战场,有网友做了一个图,可以看看:
为便于快速复习C++语言,本文梳理了C++的知识体系,针对C++的重点和难点做了细致说明,同时给出了可运行的源代码,笔者一直以为通过源代码来学习知识点,是掌握一门语言最快的方式。
作为程序员,编程语言不仅仅是工具,更是饭碗,须勤学苦练,谈几点笔者的看法:
每隔两三年学习一门新语言,指望一门语言就能包打天下的时代已经过去了,新生语言在不断蚕食既有语言的地盘,要想不被淘汰,就得紧跟趋势。
笔者都会什么语言?熟练使用能够端上饭碗的语言有C++/Python/Golang/shell;学过一年以上能够把该语言核心教程里的代码全部跑通的有:PHP/Javascrip/html/css;通读过该语言核心教程并理解其核心思维的有:java/perl/ruby。
程序员之上是架构师,有扎实编程功底,有良好代码品味的架构师才是货真价实的,否则就是花架子,talkischeap。
教学相长,在谈谈笔者对教学方法与学习方法的体会:
关于教学方法:工作多年的资深开发,一般都要承担传道授业解惑的职责,作为他人导师,通常技术能力和知识结构都没有太大问题,但可以有意识地修炼一下自己的教学方法。headfirst系列的书籍,笔者看过几本,就教学方法而言绝对是上乘之作。
关于学习方法:在精通一门语言的情况下,如何快速学习一门新语言?在笔者看过的众多编程书籍里面,《PHP&MySQL范例精解——创建/修改/复用》这本书明确提出了一个非常有效的方法:找到工业级代码范例,然后“Create-Modify-Reuse”,这是笔者认为最好的学习方法,代码是最好的老师。
这一节对C++常用的新特性做简明扼要的介绍:
参考:
1.1.auto&decltype
auto:变量类型推断decltype:表达式类型推断
1.2.forrange
基于范围的for循环:
std::function快速创建一个函数对象
std::bindbind:绑定函数参数
lambda匿名函数lamdba:创建匿名函数
代码示例:使用lambda与不使用lambda的比较:
c++11新特性之std::function和lambda表达式:
1.4.smartpointer
C++11标准在充分借鉴和吸收了boost库中智能指针的设计思想,引入了三种类型的智能指针,即std::unique_ptr、std::shared_ptr和std::weak_ptr1)std::unique_ptr
std::unique_ptrsp=std::make_unique(123);
std::unique_ptr禁止复制语义,为了达到这个效果,std::unique_ptr类的拷贝构造函数和赋值运算符(operator=)被标记为delete。
2)std::shared_ptr
std::shared_ptrsp=std::make_shared(123);
3)std::weak_ptr
代码实例:
参考:c++是否应避免使用普通指针,而使用智能指针(包括shared,unique,weak)?
.zhihu.com/question/319277442/answer/1517987598
代码示例:使用auto_ptr时,拷贝或复值导致p1持有的堆对象被转移给sp2:
unique_ptr:
shared_ptr:
代码示例:
代码示例2:
本节参考:
作用:右值引用与std::move结合,减少对象拷贝
附:move函数实现
1.11.新特性系统梳理
volatile:表明所修饰的变量是易变的,例如多线程并发场景,加上voltile用于禁止编译器对变量做优化
mutable:作用同volitile,只是mutable只能用于类成员函数。
代码示例下面这个代码例子,综合展示了前面介绍的各个关键字的使用:
代码地址:
2.2.多继承与内存布局
简单非多态
2.3.虚函数与纯虚函数
虚函数
纯虚函数,代码示例:
知识点梳理
代码:
参考:.cnblogs.com/wanghongyang/p/15014326.html
2.5.访问控制
访问控制
非成员函数的例子:
成员函数的例子:
提示:可以将友元函数的函数体放在class内,隐式inline
友元类中的所有成员函数都是另外一个类的友元函数。
3.3.可变参数
基本概念:
通过一个简单示例,理解函数模版中可变参数的作用:
代码示例2:
通常两者是等价的:
有一些场景只能使用typename
3.5.STL中的模板3.6.元编程
关于元编程,主要用于编写程序库,实际工程使用较少:
4.STL(泛型编程典范)4.1.容器Container
整体梳理
序列容器:【arrayvector】【queuedequepriority_queuestack】【listforward_list】
关联容器:mapset||multimapmultiset
关联容器:unordered_mapunordered_set||unordered_multimapunordered_multiset
vector增删改查操作
vector的迭代器
map
以下是map的基本操作:
unordered_map
emplace与insert,功能类似,但执行效率更高:
为什么emplace的执行效率更高?
c++11新增算法:
技术原理:
知识点梳理:
5.4.strstream
几种构建工具的对比,可以参考:
在腾讯公司内部,系统架构从整体上来说,基本都是微服务模式,即很多小模块以rpc的方式构成一个大的分布式系统,每个模块的规模都不是很大,因此C++开发一般都用make来编译和构建。下面是笔者使用的一个Makefile模版:
CMakeLists.txt主要通过函数的方式来组织编译规则,下面是一个示例文件:
从2018开始,腾讯的研发体系发生了巨大变革,从以往的DO分离逐步变成了CI/CD,传统的运维消失了。反映在C++开发上,版本管理从svn切换到了git,构建工具逐步从make逐步切换到了bazel。另一方面,过去C++坚固的阵地发生了松动,golang以其简单和高性能在逐步蚕食C++的地盘。
下面是bazel配置文件的写法,相比make和cmake更可读:
7.单元测试
写好单元测试,让代码时刻处于可运行状态,代码只有跑起来才叫代码,跑不起来的那叫伪代码。
GoogleTest官方文档:
入门:
进阶:
GoogleMock官方文档:
详细内容参考,【金山文档】CPP单元测试实战:
8.代码调试8.1.gdb调试C/C++代码,最著名的工具就是gdb,但坦白说笔者用的并不多,在过往十多年的编程生涯里,用gdb的次数不会超过十次:)
常用的gdb命令:
vscode配置选项
配置文件:
"-std=c++11","-stdlib=libstdc++","-Wc++11-extensions",
靠代码吃饭的人,建议开通自己的github账号没事的时候就码几行代码,时刻保持良好的技术状态:
在linux环境下,经常用vim对文本文件做一些简单的增删改查编辑操作,老司机一般都会用,建议新手做简单学习: