学习C++,应该循序渐进的看哪些书?

2023-12-05

C/C++ 这门语言与其他高级语言不同,它是离操作系统较近的语言。所以学好 C/C++ 体系的技术栈必须结合操作系统的运行机制来学习。展开来说,就是你必须掌握操作系统层面的几大基础知识,他们是汇编、编译链接与运行时体系、狭义的操作系统原理、多线程、网络编程。

一、C++ 语言本身

C++ 面试关于语法部分一般会问以下一些问题,当然这些问题也是 C++ 开发必备:

  1. 在有继承关系的父子类中,构建和析构一个子类对象时,父子构造函数和析构函数的执行顺序分别是怎样的?

  2. 在有继承关系的类体系中,父类的构造函数和析构函数一定要申明为 virtual 吗?如果不申明为 virtual 会怎样?

  3. 什么是 C++ 多态?C++ 多态的实现原理是什么?

  4. 什么是虚函数?虚函数的实现原理是什么?

  5. 什么是虚表?虚表的内存结构布局如何?虚表的第一项(或第二项)是什么?

  6. 菱形继承(类D同时继承B和C,B和C又继承自A)体系下,虚表在各个类中的布局如何?如果类B和类C同时有一个成员变了m,m如何在D对象的内存地址上分布的?是否会相互覆盖?

部分同学对以上问题总是搞不清楚,但是又不知道如何学习,于是从网上找各种文章来学习,造成这块的知识非常零碎,无法构成体系,其实这与其在网上花费大量时间,不如系统地看一下侯捷老师翻译的《深度探索 C++ 对象模型》一书。

(链接: https://pan.baidu.com/s/1SOGJTy_k7qyxKmzqX9WzMw 提取码: 2i98 )

另外,时至今日,各大企业虽然项目中未必用到 C++11/14/17 常用的语言特性和类库,但是面试还是对这些有一定的要求的,常问的有:

  • 统一的类成员初始化语法与 std::initializer_list<T>

  • 注解标签(attributes)

  • final/override/=default/=delete 语法

  • auto 关键字

  • Range-based 循环语法

  • 结构化绑定

  • stl 容器新增的实用方法

  • std::thread

  • 线程局部存储 thread_local

  • 线程同步原语 std::mutex、std::condition_variable 等

  • 原子操作类

  • 智能指针类

  • std::bind/std::function

C++11/14 网上的资料已经很多了,C++17 的资料不多,重头戏还是 C++11 引入的各种实用特性,这就给读者推荐一些我读过的不错的书籍:

  • 《深入理解 C++11:C++11 新特性解析与应用》

  • 《深入应用 C++11:代码优化与工程级应用》

  • 《C++17 完全指南》

  • 《Cpp 17 in Detail》

链接: https://pan.baidu.com/s/1xVuBcfm0qMvhHsMSAXcA4w 提取码: g4iy

二、其他必知必会基础

第一个基础知识是汇编,我们学习汇编不是一定要用汇编来写代码,就像我们学习 C/C++ 也不一定单纯为了面试和找工作。

对于 C/C++ 的同学来说,汇编是建议一定要掌握的,只有这样,你才能在书写 C++ 代码的时候,清楚地知道你的每一行C++代码背后对应着什么样的机器指令,if/for/while 等基本程序结构如何实现的,函数的返回值如何返回的,为什么整型变量的数学运算不是原子的,最终你知道如何书写代码才能做到效率最高。掌握了汇编,你可以明白,在 C++ 中,一个栈对象从构造到析构,其整个生命周期里,开发者的代码、编译器和操作系统分别做了什么。掌握了汇编,你可以理解函数调用是如何实现的,你可以理解函数的几种调用方法,为什么printf这样的函数其调用方式不能是 __stdcall,而必须是 __cdecl。掌握了汇编,你就能明白为什么一个类对象增加一个方法不会增加其实际占的内存空间。

推荐的书单 王爽《汇编(第三版)》

链接: https://pan.baidu.com/s/1YhweuJmYEIMR5rJ_xGYXiw 提取码: fe45

《老码识途 从机器码到框架的系统观逆向修炼之路》

链接: https://pan.baidu.com/s/1Aenuk7LY8eVEJ86jqYPHOw 提取码: embr

第二个基础知识是编译、链接与运行时体系知识。作为一个开发者,要清楚地知道我们写的 C/C++ 程序是如何通过预处理、编译与链接等步骤最终变成可执行的二进制文件,操作系统如何识别一个文件为可执行文件,一个可执行文件包含什么内容,执行时如何加载到进程的地址空间,程序的每一个变量和数据位于进程地址空间的什么位置,如何引用到。一个进程的地址空间有些什么内容,各段地址分布着什么内容,为什么读写空指针或者野指针会有内存问题。一个进程如何装在各个 so 或 dll 文件的,这些文件被加载到进程地址空间的什么位置,如何被执行,数据如何被交换。

第三个基础知识是狭义的操作系统原理。这里加上“狭义”二字是因为从广义上来讲,以上所说的内容都是操作系统原理的范畴。狭义的操作系统原理这里包括操作系统如何管理进程与线程,虚拟内存与物理内存之间的对应关系,何为内存映射文件,进程之间如何通信等等。

这两者推荐的书单:

《程序员的自我修养》

链接: https://pan.baidu.com/s/1CPv6khHh3ad93w-XN0YXdA 提取码: 8dbu

《Windows 核心编程》

链接: https://pan.baidu.com/s/1UdfgdFOQD2lqep2nM2qUQQ 提取码: 1m1t

第四个基础知识是多线程知识。严格来说,这点已经包括在第三点之中了,我之所以将其单独列出来,是因为多线程编程是我们做应用服务最常用的技术之一。最近面试过几个学历非常好的同学,对于一个进程中如果某个线程因为内存问题而退出,是否会导致整个进程退出的问题答不好,实在不应该。多线程知识其实不难学,立足于理解与实践而不是应付面试,可以学的很好。无论是 Windows 还是 Linux 操作系统,操作系统提供的线程同步对象就那么几种,Windows 常用的有临界区(关键端)、Event、互斥体、信号量等,Linux 有互斥体、信号量、读写锁、条件变量,这些知识点学过则会,不学则不会。这些线程同步原语花上几天就能搞得清楚,大多数同学不是学不会,而是不愿意学,但是偏偏喜欢在简历上写上自己熟悉多线程编程。面试的时候,被问到条件变量的虚假唤醒机制都说不清楚,非要说自己用过条件变量。这是一些同学犯的很低级的错误,如果真用过条件变量,如果不知道虚假唤醒机制,那一定写的代码是不对的。市场上目前没有任何一本图书对以上知识形成体系的介绍,当然,我的本书填补了这一空缺,你将从本书中获得从进程与线程的关系,再到常用的线程同步原语的区别与使用场景,再到线程池以及基于生产者消费者模型的消息队列,以及对协程思想介绍的相关知识。

掌握了常见的多线程同步原语之后,接下来可以找一些带多线程的项目去学习一下,不管是否带 UI 的都行。我推荐的一种方式是,使用 gdb 或者 Visual Studio 调试器将你需要学习的多线程程序中断下来,在多线程面板,看看这个进程一共有多少个正在运行的线程,分析每个线程的作用,然后研究下这些线程在何时何地创建的,为什么需要创建新的线程。尝试爱过几个人,面对爱情你会诚实很多;尝试研究几个多线程项目,面对多线程你会熟练许多。

推荐的书单 《 C++ 服务器开发精髓

第五个是网络编程,直白地说就是 Socket 编程。操作系统层面提供的 API 会在相当长的时间内保持接口不变,一旦学成,终生受用。理解和掌握常用的基础 socket API 不仅可以最大化地去定制各种网络通信框架,更不用说使用市面上流行的网络通信库了,最重要的是,它会是你排查各种网络疑难杂症坚实的技术保障。操作系统层面提供的网络模型就那么几种,无论像 Java/Go/Python 等语言如何封装,作为技术的源头,我们有什么理由不去掌握它呢?

推荐的书单

《TCP/IP 网络编程》

链接: https://pan.baidu.com/s/1ho3e1POq5LzEQWp0Gm2Nsg 提取码: sp8p

《Linux 高性能服务器编程》

链接: https://pan.baidu.com/s/1f9IErU5JP2sw-5Crha9vzg 提取码: je7g

以上是基于 C++ 技术栈来说,并没有包括算法与数据结构、数据库等方面的基本功,但是这些额外的也是应该需要掌握的。掌握了如上所说的,你就达到了一个熟练工阶段。

三、完整的 C++ 技术栈书单

我这里精心整理了一份我当初学习 C++ 的书单,分享给你:

计算机必看经典书籍(含下载方式)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

学习C++,应该循序渐进的看哪些书? 的相关文章

随机推荐

  • 基于java的高校教职工档案管理系统springboot+jsp

    一 拟解决的关键问题 1 登陆模块 该模块对档案管理系统设定登录约束 并在该模块对档案系统登录用户进行权限分配 2 档案收集模块 对各类档案材料进行录入和入库 数据库 主要包括学历档案信息 工作经历档案信息 职称档案信息 职务信息档案 表彰
  • python+django民俗风俗习惯传统文化网站pycharm毕业设计

    1 所有记录信息要保持全面 信息记录内容不可以是空 2 各种数据间相互联系要保持正确 3 相同数据在不同记录中要保持一致 传统文化如果还用之前的只有线下进行黑板报形式的去实行 已经很落伍了 这样会导致了效率低下 而且 时间一长的话 积累下来
  • 计算机毕业设计python+django家庭养老服务管理系统vr18o

    快本居家养老系统管理员和工作人员两个角色 管理员功能有个人中心 老人账号管理 工作人员管理 老人档案管理 订单申请管理 检查检验项目管理 维修服务管理 订单信息管理 转诊信息管理 生活服务管理 服务记录管理 生活用品信息管理 药品信息管理
  • 基于Android的旅游服务APP系统

    收藏关注不迷路 源码文章末 文章目录 前言 一 项目介绍 二 开发环境 三 功能介绍 四 核心代码 五 效果图 六 文章目录 前言 本Android的旅游服务APP是根据当前我国旅游的大环境相关的内容实际情况开发的 在系统语言选择上我们使用
  • nodejs微信小程序+python+PHP健身房信息管理系统的设计与实现-计算机毕业设计推荐

    目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1 1背景及意义 1 1 2 国内外研究概况 1 1 3 研究的内容 1 第2章 相关技术 3 2 1 nodejs简介 4 2 2 express框架介绍 6 2
  • 计算机毕业设计推荐之java网上购物商城系统sringboot+vue_o9m4k

    系统使用过程主要涉及到管理员和用户两种角色 主要包含个人中心 用户管理 商品类别管理 热卖商品管理 投诉建议 系统管理 订单管理等功能 系统开发主要在 Windows 系统下进行 采用支持跨平台的 Java语言开发完成 因此可以运行在任意开
  • 大一大二的计算机专业同学应该学习什么?如何学习?

    本文是回答一位知友的提问 已经大一下了 现在在学 C 感觉书上很多术语都不懂 编程自己也得花很多时间才能做出来 但感觉自己身边的同学却什么都会 有什么好的建议吗 我一定努力改正 正文 一 可能的原因 调整心态 克服恐惧和畏难情绪 建议反思一
  • 前后端分离vscode+mysql校园报修维修管理系统nodejs+vue

    本基于nodejs的学校智能网上报修管理系统是根据当前高校网上报修相关的内容实际情况开发的 在系统语言选择上我们使用的nodejs语言 数据库是小巧灵活的MySQL数据库 本系统的开发可以极大的提高学校智能网上报修管理系统的管理效率 开发语
  • nodejs+vue+elementui电子数码产品商城推荐系统vscode毕业设计

    基于vue的电子产品推荐系统分为前台和后台两部 前台部分主要是让用户购买和查看商品使用的 后台主要是让管理员人员发布商品相关信息和管理订单使用的 前台部分包括用户注册登录 查看商品相关信息 查看公告信息 查看热卖产品 查看精品产品 将商品加
  • 基于springboot洗衣店管理系统

    收藏关注不迷路 源码文章末 文章目录 一 项目介绍 二 开发环境 三 功能介绍 四 核心代码 五 效果图 六 文章目录 一 项目介绍 本基于springboot洗衣店管理系统是根据当前洗衣店和用户的实际情况开发的 在系统语言选择上我们使用的
  • css设置渐变色

    css如何设置自定义渐变色 线性渐变篇 CSS渐变可以让你在两个或多个指定颜色之间显示平滑的过渡 CSS定义了三种渐变类型 Linear Gradients goes down up left right diagonally 下降 上升
  • python+django基于hadoop大数据的学习资源推送系统的设计与实现vue

    考虑到实际生活中在学习资源推送管理方面的需要以及对该系统认真的分析 将系统按权限进行划分 管理员登入使用本系统涉到的功能主要有个人中心 用户管理 学习视频管理 学习类型管理 系统管理等功能 管理员用例如图3 1所示 图3 1 管理员用例图
  • springboot+jsp高校大学生心理咨询系统

    1 课题目的及意义 随着全球化的发展 各国对高等素质的人才需求越来越大 培养高素质的人才 顺应世界的需求 就要求高校培养的不单单是德智体美劳德人才 还需要心理健康的人才 加强大学生心理素质教育是时代发展的需要 也是中国高等教育改革的需要 近
  • 基于java的可视化高校学生宿舍公寓管理系统springboot+vue

    实现了用户在线选择试题并完成答题 在线查看考核分数 管理员管理班级管理 每日打卡管理 字典管理 访客管理 宿舍缴费记录管理 离校登记管理 宿舍管理 宿舍管理员管理 物品进出登记管理 学生管理 住宿信息管理 管理员管理等功能 管理员功能 1
  • 单个 epoll + 线程池与每个线程一个 epoll 这两种架构哪个更适合大量短连接的场景?

    本文是回答一位知友的提问 单个 epoll 线程池与每个线程一个 epoll 这两种架构哪个更适合大量短连接的场景 不少教程上都提到线程池适合大量的网络短连接的任务场景 但我总感觉这个优势有点站不住脚 单 epoll 线程池模型 主要考虑到
  • 如何系统学习 MySQL?

    一 不建议这么学数据库 首先你要消除一个错误认知 即 如果你想系统地掌握数据库常用的知识点 一定不要以网上各种散乱的文章为重点学习材料 理由有二 网上的资料碎片化比较严重 对于新人来说 可能会造成盲人摸象的感觉 无法形成这块成体系的技术认知
  • nodejs+Vue+elementUI选校园招聘求职网站系统zr299

    从技术实现来讲 可以分为前端技术和后端技术 1 前端技术主要使用vue框架 使用vantUI elementUI搭建前端页面 页面精美 方便快速 2 后端主要使用nodejs 前端通过使用ajax调用接口 进行数据交互 服务器端 数据的存储
  • nodejs+vue+elementui付费自习室座位选座系统-高校教室管理系统nl1u1

    开发语言 node js 框架 Express 技术栈 nodejs vue elementui express 数据库 mysql 数据库工具 Navicat 二 研究方法 1 文献研究法 通过各个文献查找网站 学校图书馆以及百度百科查询
  • python基于django的在线教育学习网站n5138

    在开发系统的过程中 本人运用到vue技术和平时学习中所了解的一些技术 通过实现这些技术 大大提高了整个系统的性能 在论文中这些技术都做了比较详细的介绍 本系统还存在很多缺点和不完善的地方 例如有些细节上做的还不够完善 有些功能模块还需要加强
  • 学习C++,应该循序渐进的看哪些书?

    C C 这门语言与其他高级语言不同 它是离操作系统较近的语言 所以学好 C C 体系的技术栈必须结合操作系统的运行机制来学习 展开来说 就是你必须掌握操作系统层面的几大基础知识 他们是汇编 编译链接与运行时体系 狭义的操作系统原理 多线程