C++知识体系总结:语言核心与代码工程调用编程示例泛型程序员c++

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对文本文件做一些简单的增删改查编辑操作,老司机一般都会用,建议新手做简单学习:

THE END
1.C++基础代码—20余种数据结构和算法的实现基本上可以分为两大类,一种是关于数据结构和算法的(例如:RBtree,stack),另一种是关于C++语言本身层面的(例如:reference_count,Uncopyable)。这些类,可以在如今C++标准库或者其它C++库(如:boost)中找到类似的实现,实现它们的目的不是想自己造轮子,而是通过实现,来深入的理解到一些更本质的东西。很多时候,人们往往“http://help.louzhutie.cn/?developer/article/2477584
2.算法学习笔记1语法(C++组)51CTO博客文章标签 C++ 算法学习 文章分类 数据结构与算法 人工智能 关于#include 包含printf();和scanf();c++中printf、scanf比cout、cin效率高很多算法题里cin、cout可能超时,虽然可以优化,但是优化之后还是比不上scanf和printf。第一章 算法入门及简单的顺序结构https://blog.51cto.com/u_15127589/2799861
3.数据结构+算法+c++学习(写在前面)c++和数据结构一起学数据结构+算法+c++学习(写在前面) 本篇开始将开始更新算法方面的博客,其实应该是数据结构更多一些,我不知道大家是如何学习算法和数据结构的,就我目前的学习情况,简单的和大家说一下感受。本人研一时学校开设了算法这门课程,当时上这门课时也很用心的学习了,但是那时候的学习更多的是理解各个算法的原理,不懂数据https://blog.csdn.net/weixin_42398658/article/details/87940074
4.编程竞赛宝典C++语言和算法入门希望本书的出版,能够给学有余力的中学生、计算机专业的大学生、程序算法爱好者以及IT行业从业者提供学习计算机科学的帮助。 张新华 2021年5月 第01章 C++语言入门 计算机编程语言能够实现人与计算机之间的沟通与交流,使计算机能够根据人编写的代码一步一步地工作,完成某些特定的任务。C++语言是使用最广泛的编程语言之一https://www.epubit.com/bookDetails?id=UB77a9ce8133887
5.算法学习1512.好数对的数目(java/c/c++/python/go/c++ classSolution{public:intnumIdenticalPairs(vector<int>& nums){intans =0;intcounter[101];memset(counter,0,sizeof(counter));for(auton : nums) { ans += counter[n]++; }returnans; } }; python classSolution:defnumIdenticalPairs(self, nums:List[int]) ->int: https://developer.aliyun.com/article/873167
6.支持C++,Java,Python,Go,JavaScript等多语言版本,从此算法学习《代码随想录》LeetCode 刷题攻略:200道经典题目刷题顺序,共60w字的详细图解,视频难点剖析,50余张思维导图,支持C++,Java,Python,Go,JavaScript等多语言版本,从此算法学习不再迷茫! 来看看,你会发现相见恨晚!https://portrait.gitee.com/programmercarl/leetcode-master
7.Hello算法(C++语言版)中文PDF电子书下载或者多试试几个下载地址 ☉ 如果遇到什么问题,请评论留言,我们定会解决问题,谢谢大家支持! ☉ 本站提供的一些商业软件是供学习研究之用,如用于商业用途,请购买正版。 ☉ 本站提供的Hello算法 (C++语言版) 中文PDF资源来源互联网,版权归该下载资源的合法拥有者所有。https://www.jb51.net/books/907953.html
8.编程竞赛宝典:C++语言和算法入门.pdf张新华2021年版本书以Dev-C++为C++语言的开发环境,首先带领读者入门C++语言,然后循序渐进、由浅入深地讲解C++语言的基本结构、数组、函数、指针、结构体、位运算等知识,并编排了竞赛模拟、阶段检测等内容,使读者能及时评估自己的学习效果。本书在介绍C++语言的同时,更加侧重于计算思维的培养,通过“一题多解”及“数学求解”等方法https://max.book118.com/html/2021/1129/7064142166004053.shtm
9.c语言算法培训班C++程序算法课程C++程序算法课程 中班详询 课程优势:以学生为主体、采用探究式的学习方式、个性化的学习目标和结果标准设置,赋予学生学习的自主性,辅以的课程设计和专业的授课过程 上课方式:面授 上课时段:全日制,白天班,晚班,周末班 ¥ 询价 预约试听 学习能力 设计 编程 https://www.qinxue365.com/course/648986.html
10.深度学习基于web端和C++的两种深度学习模型部署方式深度学习 Author:louwill Machine Learning Lab 本文对深度学习两种模型部署方式进行总结和梳理。一种是基于web服务端的模型部署,一种是基于C++软件集成的方式进行部署。 基于web服务端的模型部署,主要是通过RESTAPI的形式来提供接口方便调用。而基于C++的深度学习模型部署,主要是通过深度学习框架的C++前端版本,将模型集成https://cloud.tencent.com/developer/article/1684510
11.CCFPTACC++语言测试标准(2022.04更新)编程专业能力测试通过对认证参考人从事编程培训职业所需的 专业核心能力进行测试并做出评价,为编程教育从业人员提供专业发展依据,为编程学习者选择师资提供参照依据。 编程能力测试内容包括程序设计的语言、算法、简单数据结构知识,以及观察和分析问题能力、对问题抽象化模型化的能力、算法设计的程序实现能力、测试数据https://pta.ccf.org.cn/cms/show.action?code=jumpnewstemplate&siteid=100000&channelid=0000000115&newsid=922817f2a8394ed2a881e93ac763914a
12.开立生物医疗科技(武汉)有限公司2024届春季校园招聘4、良好的人际沟通能力和团队合作能力,善于学习,责任心强; 5、有二维图像处理或者三维图像处理项目/课题经验者优先。 工作职责(下述一项或多项): 1、图像处理算法设计、改进及仿真验证; 2、图像处理FPGA算法开发与定点化分析或C/C++算法实现及验证; 3、图像处理GPU算法开发与测试验证; https://cqu.cqbys.com/campus/view/id/689831