[编程开发] 如何正确通过 C++ Primer 学习 C++?

[复制链接]
zhengyan 发表于 2023-10-21 03:36:15|来自:北京 | 显示全部楼层 |阅读模式
本人即将读研,虽然考的是本专业(GIS),但是研究生读的专业在计算机学院,要求所有研究生都要会编程。本科期间学过C++,但是基本忘的差不多。现在暑假已经被要求到学院搞项目,但是因为对编程只有概念上的认识,所以现在都是在自学C++。这几天开始从头看C++ primer,但是因为基础实在薄弱,很多内容看很久都看不懂,上网查资料也是一片模糊。看了几天之后,觉得我学习的方法有问题(我是每天都在练习他的习题)。我知道学习程序语言要多敲代码,但是这个敲代码不知道从哪里入手,看书也不知道哪些是重点,哪些现在可以不看的。完全没有一个详细的规划,很乱。求大神给些意见!谢谢!!
————————————————————————————————
7.13 更新
我现在跟着项目,就是修改一些BUG,对于这样的实战,不知道对学习C++的帮助有多大?
————————————————————————————————
7.15 更新
前几天把第三章看了一半,刚刚开始一直没弄懂什么是容器,后来通过上网查资料,获得了一些比较通俗的解释,不知道这样会不会对概念的理解有偏差。
全部回复5 显示全部楼层
a3102779 发表于 2023-10-21 03:36:31|来自:北京 | 显示全部楼层
前言

每个人归纳《C++Primer》的方式都不太一样,如果有时间的话还是建议初学者多翻两遍实体书,在熟读的情况下再开始整理自己的笔记。学习C++将近两年,这本书翻了不下十次,有幸理解了一些C++委员会或者作者在设计语言特性时的一些考虑。比如我之前写的一些文章(大部分归纳到了《C++语法笔记》第十章语法特性里),也算为数不多必买的C++书籍之一了。
电子书

链接:C++语法笔记 - C++语法笔记 v1.0 文档


参考书籍

这本《C++语法笔记》是我阅读下列书籍将相似的知识点归纳总结后而成的,如侵必删。
[1] 《C++ Primer》  王刚 杨巨峰 译
[2] 《Google Style Guide》
[3] 《现代C++教程:高速上手C++11/14/17/20》 欧长坤 译
[4] 《Effective C+ 改善程序与设计的55个具体做法》 侯捷 译
编写原则

1. 二八原则
遵循“二八原则”,记录C++后端开发中百分之八十以上的知识点,避开各类奇技淫巧。
2. 删繁就简
对于强记忆性的内容简单介绍,比如枯燥的进制转换和少用的语言特性等。
3. 规范编程
以《Google Style Guide》中的C++风格指南为准,跳过了一些不推荐的编程操作,倡导规范化的C++编程。
4. 自完善性
当你在查看本文档时,可能会发现有部分重复的内容,比方说map初始化这个知识点同时涉及初始化和关联容器map,那么它就会同时出现在两个地方,保证每篇独立文档的自完善性。
5. 专题梳理
有些知识点(比如C++初始化规则和关键字)会零零散散地落在多个章节,我会系统梳理这些知识,并以专题的方式沉淀到一篇文章中去。
TODO

期待阅读完其他的C++经典书籍后继续整理到这本《C++语法笔记》中,减少学习和复习C++知识的心智负担。
目前正在阅读并整理的内容如下:

  • 《C++并发编程》
  • 《More Effective C++》
文章目录


  • <a href="http://link.zhihu.com/?target=https%3A//cpp-note.readthedocs.io/zh/latest/docs/%25E7%25AC%25AC1%25E7%25AB%25A0%2520%25E5%258F%2598%25E9%2587%258F%25E4%25B8%258E%25E5%259F%25BA%25E6%259C%25AC%25E7%25B1%25BB%25E5%259E%258B/index.html" class=" wrap external" target="_blank" rel="nofollow noreferrer">第1章 变量与基本类型

    • 1.1 变量声明与定义
    • 1.2 数据类型
    • 1.3 C风格字符串
    • 1.4 数组
    • 1.6 类型转换
    • 1.7 初始化
    • [选读] POD类型



  • 第2章 语句

    • 2.1 if语句
    • 2.3 break语句
    • 2.6 switch语句
    • 2.7 goto语句



  • 第3章 函数

    • 3.1 参数传递
    • 3.3 默认实参
    • 3.4 内联函数
    • 3.5 函数重载
    • 3.6 函数指针



  • 第4章 运算符

    • 4.1 常用运算符
    • 4.2 运算符优先级
    • 4.3 重载运算符



  • 第5章类

    • 5.1 类的成员
    • 5.2 类的静态成员
    • 5.3 类的访问控制
    • 5.4 类的构造函数
    • 5.5 类的拷贝控制操作
    • 5.6 类的继承与多态
    • 5.7 类的多重继承与虚继承
    • 5.8 类的类型转换
    • 5.9 类成员指针
    • 5.10 union
    • 5.11 嵌套类
    • 5.12 局部类



  • 第6章 标准库类型

    • 6.1 标准库类型:string
    • 6.2 标准库类型:vector
    • 6.3 标准库类型:IO库
    • 6.4 标准库类型:迭代器
    • 6.5 标准库类型:顺序容器
    • 6.6 标准库类型:容器适配器
    • 6.7 标准库:关联容器
    • 6.8 标准库类型:tuple
    • 6.9 标准库类型:bitset



  • 第7章 模板

    • 7.1 函数模板
    • 7.2 类模板
    • 7.3 模板参数
    • 7.4 成员函数模板
    • 7.5 可变参数模板
    • 7.6 模板特性



  • 第9章 算法

    • 9.1 泛型算法
    • 9.2 算法概览



  • 第10章 语法特性

    • 10.1 头文件
    • 10.2 在main函数之前或者之后打印消息
    • 10.3 左值与右值
    • 10.4 命名空间
    • 10.5 命名规范
    • 10.6 变量生存期和变量作用域
    • 10.7 标准类型转换模板
    • 10.8 手动管理内存
    • 10.9 并行和并发
    • 10.10 固有的不可移植的特性
    • 10.11 运行时类型识别
    • 10.12 异常处理
    • 10.13 内存分布
    • 10.14 调试帮助
    • 10.15 编译链接原理



  • 第11章 C++11新标准

    • C++11关键字
    • 11.1 标准库bind函数
    • 11.2 Lambda表达式
    • 11.3 智能指针
    • 11.4 右值引用
    • 11.5 初始化列表
    • 11.6 标准库function类型

初学者常见学习C++的建议

由于C++相比于其他主流语言更偏底层,因此上手难度稍大。要在短期内掌握大部分C++语法,大概可以从如下几个方向入手:

  • 结合实践:如果手头上没有C++的项目或者没有大学课堂配套的小组作业的话是很难消化C++语法的,这也是为什么很多自学C++的初学者啃完一套C++语法视频或者一本C++语法书后依然看不懂项目的原因
  • 循序渐进:很多复杂的C++语法对于初学者而言纯粹就是增加学习负担,这些知识在很长一段时间内都不会用到(甚至有一些C++特性不被推荐使用),这些内容在实践中碰上了再查漏补缺也不迟
  • 系统学习:C++语法的资料最好少而全,认准一本语法书(当然在问题下推荐使用《C++Primer》,但我感觉这本废话略多),对同一本书反复查阅好过贪多嚼不烂
  • 编程规范:良好的编程规范不仅方便多人开发,而且还不容易出错(推荐参考Google的编码规范并结合cpplint使用)
df652 发表于 2023-10-21 03:36:57|来自:北京 | 显示全部楼层
同GIS专业,IT从业者。最近抽时间看了《C++ Primer》,对第一章到第十六章,我都做了阅读笔记。需要的话,可以自取。
另外可以在我的公众号【Jacen的技术笔记】,回复 C++,即获得本人吐血整理的C++ Primer阅读笔记PDF。
第一章介绍C++的基础内容:类型、变量、表达式、语句和函数。
https://zhuanlan.zhihu.com/p/234146477第二章介绍内置类型。
https://zhuanlan.zhihu.com/p/234165497第三章介绍数组以及标准库类型string和vector。
https://zhuanlan.zhihu.com/p/236009820第四章介绍用户如何自定义适用于类类型的运算符。
https://zhuanlan.zhihu.com/p/238670842第五章介绍条件执行语句、重复执行相同代码的循环语句和用于中断当前控制流的跳转语句。
https://zhuanlan.zhihu.com/p/240089289第六章介绍函数的定义和声明,包括参数如何传入函数以及函数如何返回结果。还介绍了重载函数的方法,以及编译器如何从函数的若干重载形式中选取一个与调用匹配的版本。
https://zhuanlan.zhihu.com/p/240868973第七章介绍使用类定义自己的数据类型,关注数据抽象。
https://zhuanlan.zhihu.com/p/260220212第八章介绍IO库的基本内容。C++不直接处理输入输出,而是通过一组定义在标准库的类型来处理IO。
https://zhuanlan.zhihu.com/p/246749560第九章介绍标准库顺序容器。
https://zhuanlan.zhihu.com/p/259621073第十章介绍泛型算法和迭代器。
https://zhuanlan.zhihu.com/p/259652485第十一章介绍关联容器。关联容器中的关键字是按照关键字来保存和访问的。
https://zhuanlan.zhihu.com/p/259677324第十二章介绍动态内存。C++支持动态分配对象,当显式释放的时候,对象才会销毁。
https://zhuanlan.zhihu.com/p/259919027第十三章介绍类可以定义构造函数来控制创建此对象时候做什么,介绍类的特殊的成员函数,拷贝构造函数、移动构造函数、拷贝赋值运算符、移动赋值运算符以及析构函数。
https://zhuanlan.zhihu.com/p/260058241第十四章介绍了重载运算符来重新定义该运算符的含义。
https://zhuanlan.zhihu.com/p/260186042第十五章介绍继承和动态绑定。
https://zhuanlan.zhihu.com/p/260186215第十六章自定义模板。
https://zhuanlan.zhihu.com/p/260186481


码字不易,如果我的回答或者文章有价值,记得点赞哦。也欢迎关注我,共同学习和交流。
<a data-draft-node="block" data-draft-type="link-card" href="http://www.zhihu.com/people/jacenhu" data-image="http://pic4.zhimg.com/v2-605fc4d9d76c3340f116ab59c3a5cbdf_720w.jpg" data-image-width="132" data-image-height="132" class="internal">Jacenhu的知乎主页我的其他知乎文章
Jacenhu:一名分布式存储工程师的技能树是怎样的?
3s3s9119 发表于 2023-10-21 03:37:53|来自:北京 | 显示全部楼层
对于工程性、技术性的知识,没有实践的感性认识作为基础,读也读不懂。那么问题来了,没有实践就没法读懂,没法读懂自然也就没法去做正确且高质量的实践,问题似乎进入了一个死循环。
学习东西最怕不知道学的东西有什么用处,只要是这样,多半会半途而废。而个问题的深层次原因就是上面说的。
要想打破这个死循环,你唯一能做的就是调整心态,然后读一点就实践一点,一点一点的往前挪。这是学习任何新知识所必需的“痛苦”经历。在这里我给你几点建议,帮助你尽可能的减轻“痛苦”,让你起码能有一个开始:
1.第一遍要通读,而且可以不求甚解,但必须读的有速度,不要在不懂的地方过多的停留,不要试图在第一遍的时候就搞懂所有细节。假如读到后面需要前面的知识,但是又忘记了,可回头看,也可不回看。很多人想用c++ primer学习c++,但是第一遍都没读完就放弃了。
2.接上条。读第一遍的目的是让你知道c++都有什么东西,先混个脸熟,等日后见到一些比较高级的特性心里不会发慌。
3.调整心态,不要急于求成,除非你已经拥有了丰富的编程经验,否则一个假期不可能到达熟练掌握c++的程度。要认清这一点,遇到挫折了不要怀疑自己,大家都是这么过来的。
4.c++不是一门可以边学边干的语言,里面坑很多,要是一知半解就去用,很可能掉坑里了还不知道。
5.如果觉得c++ primer太厚,可以读读作者写的另外一本:
Essential C++ (豆瓣)。
6.关于书上的习题,第一遍看的时候可以不做。原因是做习题就会陷入到细节中,学任何东西过早的陷入细节都不是好事情。凡是过早陷入细节的,很少有能坚持到最后的。
笨T笨 发表于 2023-10-21 03:38:14|来自:北京 | 显示全部楼层
个人经验,C++ primer 第一次可以跳着看。关键是要尽快用起来,在使用中熟练,而不是在细节中迷失。
以C++ Primer第五版为例,第一遍读的时候:
Part1也就是前七章,除了6.6,6.7节,都要通读。尤其是第三章初步介绍了vector和string,简直就是新手福音,搞定这两个容器就能写一些简单的程序。
Part2基本就是数据结构和算法,如果有基础读起来很轻松。
9,11两章介绍的容器,以及12.1节的智能指针要通读。多用智能指针和容器,远离segment fault. 第10章里的泛型算法可以慢慢读,读完以后可以写出高逼格的函数式风格C++。12.2节讲了怎么用new和delete分配空间,题主作为新手,知道这种写法就行,写程序时尽量用容器代替原始数组,尤其是代码里最好不要有delete。
Part3是块硬骨头,标题就是Tools for Class Authors. 作为一个"class user",有些部分第一次是可以略过的。
13章很重要,要细读。初始化,复制,赋值,右值引用是C++里很微妙很重要的部分,别的语言对于这些概念很少有区分得这么细的。这一章不但要精读,还要完全掌握。
14章的操作符重载第一次可以观其大略;14.9节第一次可以跳过。
15章讲OOP,重要性不言而喻。如果之前一点概念都没有,学起来会觉得比较抽象。网上关于OOP有很多通俗有趣的文章,可以一起看看。
16章讲泛型编程,第一次读16.1节,掌握最基本的函数模板和类模板就行了。
Part4就更高档了,很多内容第一次就算啃下来,长久不用又忘了。第一次读推荐把18.2节读懂,命名空间简单易用效果好。别的内容可以观其大略,用时再看。17.1节的tuple是个有趣的东东,可以读一读。17.3节的正则表达式和17.4节的随机数也许有用,也可以读一读。如果需要读写文件,要读一下17.5.2节的raw I/O和17.5.3节的random I/O。
最后给题主的建议是,写C++,要尽量避免C的写法。用static_cast而不是括号转换符;用vector而不是C里面的数组;用string而不是char *;用智能指针而不是原始指针。当然I/O是个例外,printf()还是比cout好用的;转换数字和字符串时sprintf()也比stringstream快
halczy 发表于 2023-10-21 03:38:47|来自:北京 | 显示全部楼层
首先,看c++primer
一定要看第5版
1.从头开始看,别跳
c++11穿插在书的每一个角落,跳到后面你可能看到新标准又返回来看.
而且这种经典书看几遍每次也会有新收获
2.课后习题一定要做
课后习题才是查露补缺.一定要做,做题和不做差别太大了,而且课后很多经典题
3.最好记笔记,这种大部头不能保证所有都常用,所以有些会忘的很快..记了笔记可以快速记忆起来自己看的
以上是我看完c++primer第4版没做习题和第5版做完课后习题的感受
这么做比较费时间,但是c++语法层应该没问题了。
习题答案github有很多
第5版6-16章笔记我都记录成博客了,记的比较详细,如果你需要可以发给你
补充:笔记链接专栏:c++primer

快速回帖

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则