x_uy_u_n 发表于 2023-10-3 19:19:58

如何系统地学习 C++ 语言?

学了一学期c++ 但对编程 感觉还是无从下手 可能是练得比较少吧 现在想好好学 c++ 该怎么学呢

zhengdejin 发表于 2023-10-3 19:20:27

可以看看 c++roadmap是否有帮助 , 网站: Learn to become a modern C++ developer

http://pica.zhimg.com/v2-0c87d42630d73e75653a2b6b2f6a3471_r.jpg?source=1940ef5c

http://picx.zhimg.com/v2-8f2a52aadb16375271209ccd6fadc90a_r.jpg?source=1940ef5c
更多优秀github项目关注社区:
Open Github社区

bulbul 发表于 2023-10-3 19:21:03

GitHub,永远滴神!
一、C++ 快速入门指南

首先分享一个最近在 GitHub 特火的一个 C++ 项目:C++ 快速入门指南。
地址:https://github.com/Light-City/CPlusPlusThings
这是一个适合初学者从入门到进阶的仓库。
这个开源项目的作者是一名研一才接触 C++ 的同学,目前已经拿到了鹅厂后台开发的 offer。
一开始他只是在 GitHub 上建立「C++ 那些事」只是作为自己的学习笔记。但没想到,两年内,这个项目受到越来越多人的追捧,并在本月初登上了热榜,于是他对整个项目的结构做了梳理规划,细分出了「基础」、「进阶」、「实战」板块,并将所有代码开源供大家学习,此外还专门为这个项目做了网站。
地址:https://light-city.club/sc/

http://picx.zhimg.com/v2-bb36c474172cd71d781485834386075b_r.jpg?source=1940ef5c
它可以帮助初学者了解如何入门 C++,也可以帮助面试者如何深入 C++。
整个项目包括从入门到就业的全部环节,称得上是保姆式的编程指南。
我觉得这个项目是最符合题主要求的一个项目了。
在这里也给大家推荐一些计算机相关的高质量书籍,并提供下载方式。
计算机必看经典书籍(含下载方式)​mp.weixin.qq.com/s/9q4_tcvd_mcibjlUGH8C8w
http://pic1.zhimg.com/v2-5d89f04db0ed20d58ba22ff1758ff901_r.jpg?source=1940ef5c

二、写个小白的 C++ 学习路线!

参考来源:https://mp.weixin.qq.com/s/bzE9NVkYxA5qq9T-l28j5g
作者:CodeSheep写个小白的 C++ 学习路线!


http://picx.zhimg.com/v2-b1470b7b325048c6bf9248b0a9c15239_r.jpg?source=1940ef5c
1、C++ 的工作岗位有哪些?

C++主要还是做后台(服务端)开发比较多,包括:

[*]通信公司后台开发
[*]互联网公司后台开发
[*]游戏公司后台开发
[*]……
当然这个后台开发具体职责又有很多细分,比如:

[*]有做数据处理和分析的
[*]有做基础协议和通信的
[*]有做服务端底层应用优化的
[*]甚至还有做后台系统驱动和内核的
[*]……
不管怎样,下面即将要介绍的这些学习路线和内容适用于以上所有情况。
2、C++ 的学习书籍推荐?


[*]C++和C语言确实是不同的语言,但是C++确实是对C语言的延伸,可以理解为在C语言里加入了面向对象的特性。因为只有面向对象特性的加持,代码才能更好的复用、扩展和工程化,这是大型项目的必备要素
[*]除了C语言所有的底子之外,还需要学习C++的面向对象(封装、继承与多态)特性、泛型、模板、STL等等
推荐书籍(有先后顺序):《C++ Primer》、《Effective C++》、《C++ 标准程序库》、《STL源码剖析》《深度探索C++对象模型》补充一个小建议:语言部分的学习建议不要拖太久,一定要规划好时间,一鼓作气,高强度给它压下来,否则容易把自己拖泄气。
3、编程基础“四大件”

基础四大件包括:数据结构和算法、计算机网络、操作系统、设计模式
这跟学什么编程语言、后续从事什么编程方向均无关,只要做编程开发,这四个计算机基础就无法避开。可以这么说,这基础四大件真的比编程语言重要!!!
具体介绍可以看我之前写的一篇回答。
计算机基础知识对程序员来说有多重要?4、应用实践编程

这部分会涉及到一些工具、编程环境、和具体编程实践,应该说这一部分学完,自己应该能做点东西出来、或者说能看懂一些实际项目的代码。
实践这部分,我也是结合我之前在通信公司的实际工作经历和所听所见,来聊一聊。
1、Linux操作系统的使用
很多人初学C语言、C++(包括我)都是在Windows环境上进行的,而实际企业级开发几乎不可能,所以Linux系统必须要会,我们别无选择。先谈使用。
包括:常见的Linux操作命令、基本的Shell编程。
推荐书籍:《鸟哥的Linux私房菜》2、编译/调试工具
首先是跟编译相关的:编译工具!
我们知道很多人学C语言、C++都在类似Visual Studio这种集成IDE里进行代码编译,这个其实也用了编译器,只不过是微软自家的MS编译器,而且所有操作均可视化。而企业里开发很少会基于Windows系统,所以Linux平台上的编译器更为重要,最典型的当属 GCC,甚至有些公司有自己定制过的交叉编译工具,但没关系,只要 GCC熟悉,其他问题都不大。
其次,大家自学C语言、C++,都借助类似VS这种IDE,点按钮即可对源文件编译。而企业里实际项目的编译动作叫 make,编译的实际动作和过程都是写在 makefile文件里,所以makefile的书写规则建议学习!
最后说到调试工具,Linux平台上的 GDB调试工具要熟练使用,会借助于它进行调试。
推荐资料: 这部分没有书可推荐,英文好的同学可以直接看 GNU官网关于 GCC和 GDB的文档,中文材料可以看:《debuging with gdb》(中文版)和陈皓先生的《跟我一起写makefile》3、Linux环境编程
还是那句话,企业里C语言和C++几乎都是基于Linux平台的,这一部分我们没办法避开
(1)Linux系统编程
众所周知,Windows系统编程里有各种各样的Windows API,同理Linux系统API的使用就更加重要。
(2)多线程编程
此处指的是多线程编程实践相关的东西,一般包括:线程、资源、信号、同步、互斥、锁等等一些具体的编程方法。
(3)网络编程
此处的网络编程主要指的是具体Linux系统上的网络编程 API和 IO函数的编程实践。
推荐书籍:这三部分综合在一起,推荐必看书籍包括《Unix环境高级编程》、《Linux高性能服务器编程》、《POSIX多线程程序设计》另外,在这里也送大家一本帮助我拿到BAT 等一线大厂 offer 的算法笔记,是一位阿里大神写的,对于算法薄弱或者需要提高的同学都十分受用,算法一定是计算机学习的重中之重:
程序员吴师兄:无意中发现一位大佬的算法刷题 pdf 笔记觉得不错的话,记得关注我哟~

zk839y 发表于 2023-10-3 19:21:36

不了解C++的人先认识一下C++(系统学习材料附后)。
Effective C++ 3e 条款1:视C++为一个语言联邦
为了理解C++,你必须认识其主要的次语言。幸运的是总共只有四个:

[*]C。说到底C++ 仍是以C为基础。区块(blocks)、语句(statements)、预处理器(preprocessor)、内置数据类型(built-in data types)、数组(arrays)、指针(pointers)等统统来自C。许多时候C++ 对问题的解法其实不过就是较高级的C解法(例如条款2谈到预处理器之外的另一选择,条款13谈到以对象管理资源),但当你以C++ 内的C成分工作时,高效编程守则映照出C语言的局限:没有模板(templates),没有异常(exceptions),没有重载(overloading)……
[*] Object-Oriented C++。这部分也就是C with Classes所诉求的:classes(包括构造函数和析构函数),封装(encapsulation)、继承(inheritance)、多态(polymorphism)、virtual函数(动态绑定)……等等。这一部分是面向对象设计之古典守则在C++ 上的最直接实施。
[*]Template C++。这是C++ 的泛型编程(generic programming)部分,也是大多数程序员经验最少的部分。Template相关考虑与设计已经弥漫整个C++,良好编程守则中"惟template适用"的特殊条款并不罕见(例如条款46 谈到调用template functions时如何协助类型转换)。实际上由于templates威力强大,它们带来崭新的编程范型(programming paradigm),也就是所谓的template metaprogramming(TMP,模板元编程)。条款48对此提供了一份概述,但除非你是template激进团队的中坚骨干,大可不必太担心这些。TMP相关规则很少与C++ 主流编程互相影响。
[*] STL。STL是个template程序库,看名称也知道,但它是非常特殊的一个。它对容器(containers)、迭代器(iterators)、算法(algorithms)以及函数对象(function objects)的规约有极佳的紧密配合与协调,然而templates及程序库也可以其他想法建置出来。STL有自己特殊的办事方式,当你伙同STL一起工作,你必须遵守它的规约。
- 要系统学习C++,自然离不开学习资料。。。
系统学习之

[*]C++ Primer 第五版 (豆瓣) Stanley B.Lippman
[*]可不看的书:The C++ Programming Language(新手未必参透),
Essential C++(lippman的入门小书,不够系统)
规范使用之

[*]Effective C++ 第三版 (豆瓣) Meyers
[*]Effective STL (豆瓣) Meyers
[*]可不看的书(讲解都远不如Effective系列细致,并且和以上两本有相当可观的重复条目):
C++ Coding Standards(中译名:C++编程规范 ),
Exceptional C++(系列)

分类学习之
1.
C++标准程序库:自修教程与参考 (db) Nicolai M. Josutti STL使用必看!
(先学会怎么用,对照Effective STL)
2.
STL源码剖析 (豆瓣) (看看容器、迭代器、算法、函数对象乃至分配器的实现技巧)
3.
超越C++标准库:Boost库导论 (豆瓣) (Boost有比较完善的doc。可不看的书:《Boost程序库完全开发指南》有点啰嗦)
The Boost C++ Libraries 第二版(Sept. 2014)
这本书也非常实用,附带讲解,适合入门!第二版基于 Boost 1.55.0 和 1.56.0 。第一版的中文翻译:
Highscore - Boost C++ 库Boost.Asio C++ Network Programming(一本很好的网络编程入门小书)
4.
SGI STL Programmer's Guide (STL的话可以参考SGI的编程指南)
后续:

[*]Effective Modern C++ (豆瓣)Meyers新作!新的C++特性,必看啊!
[*]More Effective C++ (豆瓣) Meyers (这本书没有再版 里面部分内容在Effective C++ 第三版中有提及,所以可以放到后续里再看)
[*]C++Templates (豆瓣)
[*]C++设计新思维 (豆瓣)Andrei Alexandrescu

- 要系统学习C++,离不开敲代码(呵呵)
阅读书本,查看文档,实践项目这些都是学习的通用手段,每个人都明白。要训练的是让自己更为高效的掌握这个输入输出不断迭代的过程。系统掌握一门语言,其实也挺难的,有侧重的掌握功能构件,循序渐进,一一击破也许更为恰当。
不看书不看资料肯定是不行,你毕竟要学习的是C++啊,不可能按照别的语言习惯去写,不可能只局限于实现功能,特别是C++还提供了这么多精彩的入门与深入的学习资料。
最后,感兴趣的可以搜搜这篇文章:
“典型的C++ 程序员成长经历 ”

polocat 发表于 2023-10-3 19:22:36

先说一个观察到的现象:一个应届毕业生不论其上学时学过什么语言,只要肯努力,一般在项目里做一个月后,基本可以具有自己写点小东西的能力了。当然这时候写的东西谈不上好,不过基本算得上入门,可以做到基本语法没问题,不会被IDE的使用卡住。

从个人学习编程语言的经验来看,学习过程中最大的问题是:没有实际项目经验的新手过渡在意对编程语言的语法学习,不停的啃书本,肯德头晕眼花。一个类的成员函数就有无数的门道:重载、覆盖、虚函数、纯虚函数等等。看完觉得可神奇了了,然后不断咒骂怎么搞得这么复杂,吃饱了撑的。
程序语言是用来解决实际问题的,是一种思维表达。语法只是附属品,只是计算机这个电子设备的使用方法。不论看了多少遍使用方法,最后还是要落到使用计算机这个环节。不看一下别人怎么用,自己再实践一下,使用方法永远是纸面上的几个字,永远不知道为啥有这么多的功能,比如那些重载、覆盖、虚函数、纯虚函数显然不是没事儿找事儿硬发明的,每一样都是要解决一个实际问题,当你了解他们为了什么而存在的时候,自然你会觉得“呦,还不错哦”。

举个不太恰当的例子,写代码和写作文一样。当没写过作文前,觉得写作文很难,不知道如何开始。当用大白话写完第一篇作文的时候,觉得写作文也还行,也还能写。写第一篇作文的时候一定很在意语法,当用大白话偶尔夹杂“一望无际”、“万里无云“这种美妙词汇写几篇记叙文后,会觉得写作文也就是那么一会儿事儿。虽然读过几篇大师作品以后再看自己写的还是觉得挺恶心的,不过好歹可以写作文了,至少写个日记门没问题。也许再经过不断修炼,自己也能成为辞藻华美的大师。

题主现在遇到的问题是怎么能开始写大白话的程序。

我的建议是,学习编程要从“抄”和“改”开始。你可以没吃过猪肉,但你得先见过猪跑。你可以没写过作文,但你要想写作文得先读过文章,然后摘抄人家的文章,把“小红”改成“小明”,把“买冰棍儿”改成“买糖球”等。改几篇之后自然就有感觉了,觉得自己也可以把“小红买冰棍”的故事,改成“小明买糖球并帮妈妈买了酱油”,再改成“小明骑自行车买糖球并帮妈妈买了酱油”,再改成“小明骑自行车买糖球并帮妈妈买了酱油,路上碰到了小红”,再改成“小明骑自行车买糖球并帮妈妈买了酱油,路上碰到了小红,对小红说晚上一起写作业吧”。

从Copy和Paste开始不是什么罪过。

第一步:放下书本,找一个设计优秀的C++代码库或者应用程序。可以是一个小型的引擎(例如Ogre的超早期版本、一个网络库),或者是你感兴趣的其它领域的优秀代码(例如一个简易的IM程序)。一定是大家认可的,设计优秀的代码。

第二步:自己拿这个库仿照已有代码写一些真的有趣的应用程序。这些好的代码库一般都有简单Tutorials,按着Tutorials一步一步的跟着写,学会调试,然后不断扩展。比如如果是Ogre你就写一个超小型游戏,如果是网络库你就写一个小型IM。

第三步:在你写的足够多以后就去看看代码库本身的代码和设计,遇到不会的就翻书就问别人。

第四步:拿起书本,找那基本大家公认的“解决实际问题”的C++书来看,比如Effective C++那些,但不要看C++ Primer这种大部头,这种是“工具书”,有问题去查,没问题就放那放着。这时候你经过第一步已经对C++语法基本熟悉了,并且经过第二步你会碰到一些实际问题,所以看一些解决实际问题的东西会很有效率,认识也会很深。

第五步:按着上面看书看到的知识,去修改第二步自己写的东西。

第六步:如果还有时间就按着你的想法去修改一开始你看到的那个库,把它改成属于你的库。这一步很可能是失败的,也是有始无终的,但拆过优秀的东西才能真正明白别人写的为啥优秀。这个过程学习的不止于C++还有设计和专业知识。

一般实习生进公司不用2个月C++至少写点小程序没问题,原因就是他终于开始写了,而不是继续看书!
不推荐一开始就看书特别是大部头的书,因为对基本的东西都没什么认识,人家说的能解决什么问题也不知道,看了也是白看。

2016/9/6
这里强调的是要开始写代码,并不是说一点基础知识都没有就开始写。我觉得大学课本能看懂就可以开始写代码了。

fortop 发表于 2023-10-3 19:22:59

由于我大一也陷入过迷茫,也走过一些弯路,那时候学不会直接记忆代码之类的事情我都干过,我也希望我的这些经验可以对你有所帮助。
首先是一本好的C++书籍(Accelerated C++, C++ Primer),然后以及尽量多的完成书籍的习题,可以帮助完成C++语法的学习。虽然前面的书籍涵盖了标准库,但是不够完善,这个时候你可以选择在线查阅C++标准库这种泛型的学习方式,也可以选择阅读《C++标准库》的方式进行学习。通过这样的步骤,你应该可以完成C++的初步学习了。
然后,由于C++是一门系统级语言,我想你需要到大三学习操作系统的时候,才会明白栈与堆、内存管理等更深层次的含义。但是,在明白这些概念之前不会妨碍你利用C++做一些事情,比如写一个简单的XML Parser。这个时候,你应该会发现很多问题,如效率,代码规范等,这个时候,你可以研究Effective C++,Google C++ Code Standard等,只有自己犯了错,回过头反省才会更加深刻。
随后,你可以更加深刻的去思考C++,你需要阅读《The Design and Evolution of C++》。这本书的阅读,会教会你很多,是对你影响最大的C++书籍。如果你对C++编译器的一些细节有兴趣,深入C++对象模型可以推荐。如果你对STL的一些实现有兴趣,可以去翻翻STL源代码(很多人推荐STL源码剖析,但是我没有阅读过,我没有办法发表是否应该推荐的观点,列出来供你自行判断是否应该阅读)。
到这一步骤,我想你应该可以称为C++ Programmer了,剩下的就是实践中发现问题,然后补足自己。
此外,由于C++博大精深,应用的范围多如牛毛,特定方向所需要的知识未列举。比如你要研究Android的NDK什么的,那就是属于你后面的事情了。
===================Update============================================
说实话,我也不知道这一条为什么突然火了,发现突然有很多的赞。其实正如第一句而言,这是我走过来的经验,我不能说这就是权威的(甚至不能说是正确的),而当初回答这个问题也是以我走过来的经验来回答一个初学者的困惑。而这位初学者的困惑在我大一的时候也出现过,所以一下就引起了我的共鸣,我也只想把我的经验说出来希望可以帮助提问者少走一些弯路而已。至于这样学习的C++够不够,我想我按照这样的路线学习,可以做到我有能力去IBM写C++编译器,那么我想对于就单纯题主所提的C++语言方面来说应该已经足够了。诚然,计算机的世界不仅计算机编程语言,与之相关的还有操作系统、数据结构、编译原理、计算机网络等知识,但是,我想我们可以再开另外一个问题。同时,既然别人问了如何学C++,你让别人学Java、Python等,或者说C++大坑的,我觉得这种回答其实挺不好的,因为别人问什么,你老实认真答什么就好了,何必把自己的意愿加在别人的身上呢。
页: [1]
查看完整版本: 如何系统地学习 C++ 语言?