C++从入门到“精通“,我踩过的坑希望你可以绕着走

1 c++ 发展方向

  • 实验室开发

C++绝对是工科生中的第一大语言,C++兼具面向过程以及面向对象的特性,既拥有比较优秀的运行速度,又有良好的大型项目开发能力,那简直可以制霸高校实验室了。

  • 后端开发

学了C++之后,第一选择当然就是去面试后台开发的岗位。

  • 客户端开发

需要扎实的编程基础和计算机理论基础,同时可能还要熟悉Windows/C++编译链接机制、QT客户端开发技术体系、Windows消息机制等技术。

  • 音视频开发/多媒体开发

大平台都在做短视频,同时也不断接入各种直播模式。在这个趋势中,对于音视频/多媒体方向的开发需求越来越广。这个方向更偏向于具体的场景,比如播放器,比如直播平台,比如音视频特效等。

  • 游戏开发 

掌握了C++基本语法之后,开发游戏也依然是一个不错的选择,目前工业级别的3D游戏引擎仍然是用C或C++编写的。虽然以个人能力无法去完成一个庞大的网络游戏,但是从简单开始,编写一些小游戏,然后逐渐深入,循序渐进并最终加入大型游戏开发团队还是非常好的一个选择。与之相应的就业岗位主要有游戏开发工程师、游戏引擎架构工程师等。

  • 嵌入式开发 

    扫描二维码关注公众号,回复: 13709026 查看本文章

C/C++还有一类非常大的就业方向,就是去做嵌入式。嵌入式本身可能是偏硬件一点,但是现在做个什么事,都是软硬不分家的。嵌入式的开发同样也会涉及到网络编程、并发编程等方面。通俗点解释可能就是,嵌入式代码是运行在别的小系统上,而不是传统意义的计算机上。这个方向除了需要编程能力,还需要基本的电路理论素养。

  • 人工智能

人工智能、机器学习等方向也少不了C或C++语言的身影。需要强调的是虽然C++语言可以从事的方向非常广泛,但是仅仅掌握C++语法是远远不够的,上述的应用领域C++语言是基础,进入这些领域还需要进一步深入系统学习相关领域的知识以及去接触真实企业项目的内容。

2 、c++语法基础

首先是入门阶段,除了基本的循环、变量、判断以外,至少需要掌握这些:

  • 指针、引用、数组、内存

  • 引用与指针区别

  • 虚机制:虚函数、虚函数表、纯虚函数

  • C 和 C++ 的一些区别,比如 new、delete 和 malloc、free 的区别

  • 一些关键字的作用:static、const、volatile、extern

  • 四种类型转换:static_cast, dynamic_cast, const_cast, reinterpret_cast

  • STL部分容器的实现原理,如 vector、deque、map、hashmap

  • 类的封装,构造和析构、静态成员、对象管理;

  • 类的构造(有参构造函数、无参构造、拷贝构造、默认构造函数)和析构;

  • 对象动态管理、友元函数、友元类、操作符重载;

  • C++编译器对象管理模型分析;

  • 运算符重载(一元运算符、二元运算符、运算符重载难点、项目开发中的运算符重载);

  • 模板特化、偏特化,萃取 traits 技巧

  • 继承、虚继承、菱形继承等

  • 多态: 动态绑定,静态多态

  • 重写、重载

  • 智能指针原理:引用计数、RAII(资源获取即初始化)思想

  • 智能指针使用:shared_ptr、weak_ptr、unique_ptr等

  • 编译链接机制、内存布局(memory layout)、对象模型

  • C++11 部分新特性,比如右值引用、完美转发等

给大家推荐一个学习C语言/C++ 的github,分享C语言/C入门、学习路线、电子书籍推荐与下载、视频推荐、小项目、干货文章、笔试面试、C语言/C++ 规范、开源项目等。

地址:

C语言/C++学习平台https://github.com/tangtangcoding/C-CppLearning

书籍推荐

《C++ Primer中文版》本书面向 C++ 语言的初学者,是一本很友好的自学教材。作者把 C 语言的基础概念和需要注意的编程细节说得很清楚,并且例程和习题丰富,相信认真读过之后,可以完成 C 语言入门这个目标。

《高质量程序设计指南》,墙裂推荐,这本书看得比较过瘾,书里面有一些编程规范的东西,对于写程序的人来说,还是不错的,可以培养好的编码习惯,加深了一些知识的巩固。比较实用,也适合面试前看看。

《Essential C++中文版》是一本内容不多但很实用的 C++ 入门书籍,强调快速上手与理解 C++ 编程。本书主要围绕一系列逐渐复杂的程序问题,以及用以解决这些问题的语言特性展开讲解。你不只学到 C++ 的函数和结构,也会学习到它们的设计目的和基本原理。

《More Effective C++(中文版)》,该书围绕55条准则,每一条都介绍了一个可让你写出更好的C++程序代码的方法,并以特别设计过的例子详加讨论。

《提高C++性能的编程技术》,本书认为 20% 的性能缺陷将会占用我们 80% 的时间。因此我们把精力集中在最有价值的地方。本书详细讨论了临时对象、内存管理、继承、虚函数、内联、引用计数以及 STL 等一切有可能提升 C++ 效率的细节内容。无论你是相关领域的从业人员,还是 C++ 程序设计爱好者,或者是渴望突破编程瓶颈、大幅提升自我修为的程序设计爱好者,本书都必将使你获益良多。

《从缺陷中学习C/C++》从本质上来说,这就是一个 C/C++ 的错题集。全书中包括 63 个问题引发的错误,即书名中的缺陷。也是避坑指南。

《C++ Templates中文版》,深入了解现代 c++ 模板的实用书籍。本书不仅是对 C++ 模板的权威解释,而且本书还深入地介绍了其他一般的 C++ 思想。

《STL源码剖析》详细地了解 STL 的底层实现机制,同时也可以对常用数据结构,C++ 内存管理拥有更深的理解。

其实还有《C++标准库(第2版)》、《C++并发编程实战》、《C++编程思想(两卷合订本)》等,介绍的这些书我都买了,不过说实话,后面的几本都是泛泛的看了下,当作工具书。

视频

  1. 清华大学-郑莉-C++语言程序设计(基础篇)

清华大学-郑莉-C++语言程序设计

https://www.bilibili.com/video/BV1PA411b75a?p=92

  1. 侯捷老师的八部曲:

  • 侯捷C++ 标准 11 -14

  • 侯捷STL 和 泛型编程

  • 侯捷C++ 内存管理

  • 侯捷C++面向对象高级开发

  • 侯捷STL与泛型编程

  • 侯捷 C++ Startup 揭密:C++ 程序的生前和死后

  • 陈硕第三套、Linux CC++网络编程实践-陈硕 

侯捷C++视频全集与网络编程https://mp.weixin.qq.com/s/302poB-agGUSepqNlmi9sQ

  1. QT视频教程:

QT视频教程

https://www.bilibili.com/video/BV1jK4y1m7d4

数据结构与算法

比较系统地学习数据结构的话,推荐看《大话数据结构》、《算法(第4版)》和《数据结构与算法分析》。

如果刚接触数据结构的话,可以从《算法图解》、《我的第一本算法书》入手。

视频

  1. 郝斌数据结构

虽然比较老,但是讲的比较详细,容易理解,对初学者非常友好。

https://www.bilibili.com/video/BV1Ut411a7rN?from=search&seid=14411767501116137153

  1. 数据结构-浙江大学

课程是由陈越与何钦铭共同录制,b站与慕课网都有,慕课网比较清晰一些

https://www.icourse163.org/course/ZJU-93001?from=searchPage#/info

  1. 数据结构与算法基础

课程由青岛大学王卓老师录制,非常适合考研,讲的题比较多。

https://www.bilibili.com/video/BV1nJ411V7bd?p=1

多动手

动手去做,动手去做,动手去做。重要的话说三遍。

动手包括撸码,还包括"多画"

要边学习边画图。因为对于数据结构中的存储结构来说,尤其是树结构和图结构,存储结构确实比较复杂,仅靠空间想象难免会有披露,而通过亲手画图往往能避免很多“坑”,后面关于数据结构与算法的文章中,我也会加入一些动图。

把数据结构图形化,视觉化。在直觉上感受一个数据结构是什么样子的。使用它是什么感觉,抽象上和具体实现上是什么样子的。这就是最重要的事情。并且无论是对于简单的队列、栈还是平衡树都很重要而且有效。把数据结构画出来,在你的脑袋瓜里面就能想象出来,总之,你需要做的就是,直观的去了解这些数据结构。

在学习某些算法时,也可以借助画图来加深自己的理解。可以边阅读代码边画图,这样可以更快理清代码的实现逻辑。

在通过“多画”实现理解存储结构和实现逻辑的基础上,初学者还要“多撸码”编写实现代码。对于某一种存储结构或者算法,没有 3 遍以上自己独立的实现过程,是很难做到融会贯通的。

另外,可以在leetcode和牛客网多刷题。

计算机网络

堪称 TCP/IP 领域的圣经。作者 W. Richard Stevens,他从使用者(程序员)的角度,以 tcpdump 为工具,对 TCP 协议抽丝剥茧娓娓道来,让人叹服。恐怕 TCP 协议的设计者也难以讲解得如此出色,至少不会像他这么耐心细致地画几百幅收发 package 的时序图。

经典书籍,着重看TCP/UDP部分。

视频

  1. 计算机网络微课堂

https://www.bilibili.com/video/BV1c4411d7jb?p=1

  1. 韩立刚计算机网络 谢希仁 第7版

https://www.bilibili.com/video/BV1gV411h7r7?p=1

数据库

入门书籍,书中从介绍简单的数据检索开始,逐步深入一些复杂的内容,包括联结的使用、子查询、正则表达式和基于全文本的搜索、存储过程、游标、触发器、表约束等等。

进阶书籍,mysql 领域的经典之作。不但适合数据库管理员(dba)阅读,也适合开发人员参考学习。不管是数据库新手还是专家,相信都能从本书有所收获。

升华书籍,详细讲解了 InnoDB 存储引擎内部的各个功能模块的实现原理,对大家阅读和理解 InnoDB 的源代码有重要的指导意义。适合所有希望构建和管理高性能、高可用性的 MySQL 数据库系统的开发者和 DBA 阅读。

其他书籍:

《数据库系统实现》、《Redis设计与实现》。

视频

MySQL_基础+高级篇- 数据库 -sql -mysql教程_mysql视频_mysql入门_尚硅谷

https://www.bilibili.com/video/BV12b411K7Zu?from=search&seid=2779357081480449466

计算机组成原理

深入理解计算机系统(原书第3版)

这是一本很深入和方向性的书,每个 CS 学子都应该去读,它会告诉你,要想成为一个优秀的程序员,你应当重点理解哪些计算机底层原理。

其他书籍:

《计算机组成原理与设计》。

视频

  1. 计算机组成原理 清华大学刘卫东 全58讲 国家精品课程

https://www.bilibili.com/video/BV1c4411w7nd?p=1

  1. 计算机组成原理(哈工大刘宏伟)135讲(全)高清

https://www.bilibili.com/video/BV1t4411e7LH?p=1

操作系统

本书是操作系统领域的经典之作,讲的全面详细,包括进程、线程、存储管理、文件系统、I/O、死锁、接口设计、多媒体、性能权衡,以及有关操作系统设计的最新趋势。不仅涵盖了现代操作系统的原理和实践,而且特别关注了Linux操作系统、Windows Vista操作系统、嵌入式操作系统、实时操作系统以及多媒体操作系统。所以也是面试笔试操作系统的宝典。

其他书籍:

《操作系统真象还原》、《30天自制操作系统》。

视频

  1. 操作系统(哈工大李治军老师)32讲(全)超清

https://www.bilibili.com/video/BV1d4411v7u7?p=1

  1. 2020 南京大学 “操作系统:设计与实现” (蒋炎岩)

https://www.bilibili.com/video/BV1N741177F5?p=1

网络编程

刚工作的时候第一个项目就是物联网后台服务器软件,网络上也有类似的网络服务程序,比如即时聊天软件的后台服务器,网游服务器,金融交易系统,互联网企业用的分布式海量存储,微博发帖的内部广播通知等等。当然在嵌入式系统上也有移植或维护 TCP/IP 协议栈等等。

  • 熟悉掌握一些网络模型,例如 WINDOWS 系统下使用的 IOCP。Linux系统下使用的 Epoll、select、poll模型。

  • 熟悉一些通用库例如 ocket Server,RPC Framework

  • 内存管理。重载new/delete,内存池,对象池的处理。

  • 内存泄露检测,内存访问越界警惕,内存碎片的回收。

  • 预分配池减少切换和调度,预处理的线程池和连接池,例如数据库连接池等。

  • 多进程编程、多线程编程

  • 五大 IO 模型:同步、异步、阻塞、非阻塞、信号驱动

  • 进程间通信方式: 信号量、管道、共享内存、socket 等

  • 线程安全问题,锁处理、临界资源

  • 负载均衡理念,数据的提前准备和即时计算,如果有耗时的业务可以考虑微服务,负载均衡。

  • 定时器、心跳、定时检查死链接等等

有网络和操作系统的基础很重要。

TCP/IP网络编程

非常适合初学者学习的,对网络编程的讲解清晰直白,完全适合新手入门,写出了网络编程的每一个步骤。

学习Unix必备的经典书籍,重要章节看看,可以当工具书使用。

进程控制 ,线程控制,进程环境,进程通信 讲得尤为精彩,网络部分讲得比较浅,但也够用。整本书可以说涵盖了Linux的方方面面,面面俱到,甚至很细。

本书是 Linux 服务器编程领域的经典著作,从网络协议 TCP/IP、服务器编程核心要素,Linux 网络编程 API、高级 I/O 函数、Linux 服务器程序规范、高性能服务器程序框架、I/O 复用、信号、定时器、高性能 I/O 框架库 Libevent、多进程编程、多线程编程、进程池和线程池等内容等多角度全面阐释了编写高性能 Linux 服务器应用的方法、技巧和思想。还包含两个综合性案例,从实战的角度讲解了高性能服务器的优化、系统监测工具的使用等内容。

本书是陈硕大佬的作品,重点讲解一种适应性较强的多线程服务器的编程模型,即 one loop per thread。这是在 Linux 下以 native 语言编写用户态高性能网络程序最成熟的模式,掌握之后可顺利地开发各类常见的服务端网络应用程序。本书以 muduo 网络库为例,讲解这种编程模型的使用方法及注意事项。

视频&源码

推荐陈硕大佬的《Linux CC++网络编程实践》以及开源的库 muduo

https://github.com/tangtangcoding/C-C- https://github.com/chenshuo/muduo

libevent 是一个轻量级的基于 event 回调机制的网络编程库,可以支持 Linux、Solaris、Windows 等系统,它本身是用 C 语言写的,比较适合入门级的阅读。

https://github.com/libevent/libevent

Asio 是 boost 里的网络编程库,是用 C++ 语言写的。里面用了很多 boost 的数据结构和技巧,包括大量模板的使用,有一定的语言难度。

https://www.boost.org/doc/libs/1_75_0/doc/html/boost_asio.html

最后

觉得有帮助的话,点个赞!!!

猜你喜欢

转载自blog.csdn.net/weixin_41055260/article/details/123633726