怎样学好C++ ----高手的话

用一年时间如何能掌握 C++ ?修改

有一定 C 语言基础,日后想从事游戏开发等工作,给自己一年时间,能在此期间精通 C++ 吗?

 

Milo Yip,游戏程序员、《游戏引擎架构》译者

张麦克、什么、乘风者 等人赞同
本人大约从20多年前开始学习及使用C++,但仍未达到我认为「精通」的阶段,甚至对于C++11的各种新特性也未掌握。然而因为我是在读书时自学C++的,也是游戏程序员(原问题中提到题主想从事游戏开发),觉得也许能提供一点意见供网友参考。

首先引一下2010年8月号《程序员》刊登的拙文《C++强大背后》最后一段:
C++学习建议

C++缺点之一,是相对许多语言复杂,而且难学难精。许多人说学习C语言只需一本K&R《C程序设计语言》即可,但C++书籍却是多不胜数。我是从C进入C++,皆是靠阅读自学。在此分享一点学习心得。个人认为,学习C++可分为4个层次:

  • 第一层次,C++基础:挑选一本入门书籍,如《C++ Primer》、《C++大学教程》、或Stroustrup撰写的经典《C++程序设计语言》或他一年半前的新作《C++程序设计原理与实践》,而一般C++课程也止于此,另外《C++ 标准程序库》及《The C++ Standard Library Extensions》可供参考;
  • 第二层次,正确高效地使用C++:此层次开始必须自修,阅读过《(More)Effective C++》、《(More)Exceptional C++》、《Effective STL》及《C++编程规范》等,才适宜踏入专业C++开发之路;
  • 第三层次,深入了解C++:关于全局问题可读《深入探索C++对象模型》、《Imperfect C++》、《C++沉思录》、《STL源码剖析》,要挑战智商,可看关于模版及模版元编程的书籍如《C++ Templates》、《C++设计新思维》、《C++模版元编程》
  • 第四层次,研究C++:阅读《C++语言的设计和演化》、《编程的本质》(含STL设计背后的数学根基)、C++标准文件《ISO/IEC 14882:2003》、C++标准委员会的提案书和报告书、关于C++的学术文献。

由于我主要是应用C++,大约只停留于第二、三个层次。然而,C++只是软件开发的一环而已,单凭语言并不能应付业务和工程上的问题。建议读者不要强求几年内“彻底学会C++的知识”,到达第二层左右便从工作实战中汲取经验,有兴趣才慢慢继续学习更高层次的知识。虽然学习C++有难度,但也是相当有趣且有满足感的。


如果题主认为的「精通」是指上述所指的第二层次,那么我估计一年全职时间也未足够「精通」。首先,阅读这些书籍本身也需要不少时间,而且对于一般人来说(指除了一些学习记忆能力超强的人),很可能需要阅读几遍才能记住一些细节。另外,阅读后必须要练习。除了入门的习题外,还需要做一些工程向的项目,才能了解各种语法、编程范式的使用方法及时机,理想地建议参与一些开源项目。然而,学习是需要不断思考并把结果沉淀,方法包括与朋友讨论、写博客、写知乎答案等,这些都需要时间。

如引文末段所指出,我建议不要把「精通C++」作为一个一年目标,应该要把学习语言作为一个持续的过程,同时要把语言运用在具体的应用场合中。

---------------------------------------------------
再讨论C++与游戏开发。

看到有不少答案讨论到有关C++是否游戏开发者所必须的技术。我认为,这并不是完全必须的,但许多游戏开发项目需要到C++。以下列举一些过往曾流行的游戏平台/类型:
  1. PC单机游戏(Windows)
  2. PC网络游戏(Windows、Linux)
  3. 移动平台游戏(J2ME、Symbian、Palm……)
  4. 家用游戏机游戏(PS1/2/3/4、XBox、Wii……)
  5. 掌上游戏机游戏(GB、GBA、NDS、PSP……)
  6. 网页游戏(HTML、Flash)
  7. 智能移动设备游戏(iOS、Android)
我们会发现,除了J2ME和网页游戏外,大多数的平台都支持(或只支持)原生编程。而原生编程最常用的就是C/C++和汇编。这种现象并不难解译,再次引用拙文:

应否选择C++
哪些程序适宜使用C++?

C++并非万能丹,我按经验举出一些C++的适用时机。

  • C++适合构造程序中需求较稳定的部分,需求变化较大的部分可使用脚本语言;
  • 程序须尽量发挥硬件的最高性能,且性能瓶颈在于CPU和内存;
  • 程序须频繁地与操作系统或硬件沟通;
  • 程序必须使用C++框架/库,如大部分游戏引擎(如Unreal/Source)及中间件(如Havok/FMOD),虽然有些C++库提供其他语言的绑定,但通常原生的API性能最好、最新;
  • 项目中某个目标平台只提供C++编译器的支持。

按应用领域来说,C++适用于开发服务器软件、桌面应用、游戏、实时系统、高性能计算、嵌入式系统等。


很大程度上,游戏──或说游戏引擎,都是C++非常适合的应用时机。

一些人认为,游戏开发者使用现成的引擎,就不需要使用C++了。过往,业界有一个普遍常识,就是用C++开发游戏引擎,而游戏引擎提供脚本引擎供编写游戏逻辑代码。但这个观点被Unreal Engine 4的决策改变,UE4放弃了维护多年且被大量使用的UnrealScript脚本语言,而改用原生C++作为游戏逻辑编程的语言。此决策背后有多个原因,但这里只想举出这例子展示C++在游戏开发中的用途及潮流,具体原因分析就不详细展开了。

除了自行研发游戏引擎需要使用C++,我们可以看到,大部分游戏引擎都提供了其C++原代码(Unity算是例外),这让我们可以
  1. 方便调试游戏
  2. 深度剖析、优化游戏的性能
  3. 为引擎扩展新功能
  4. 修改现有引擎以适应项目所需
在专业的游戏开发中,这些都是很常见的工作任务。所以,即使并非自研引擎,并使用脚本语言开发游戏逻辑,也有很多机会需要使用C++。

最后,「还需学习什么」是一个很难简单回答的问题,因为游戏开发涉及的知识面很广。建议可参考本人译作。

 

转载于:https://www.cnblogs.com/likeatree/p/4179180.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/420355.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Lock锁实现多线程卖票

理解多线程卖票demoLock架构使用lock替代synchronized总结使用Lock 实现。Lock架构 使用lock替代synchronized import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock;/*** 企业级的多线程代码* 在高内聚低耦合情况下 多线程 操作 资源类…

小程序引入的echarts过大如何解决_解决生鲜行业“获客难”的难题,教你如何妙用小程序...

近年来,随着生鲜食品产业的快速发展,大量企业和商家加入了生鲜食品的“大本营”。但大量的企业和商家也对市场产生了一定的影响,不少生鲜商家陷入了一个困境——难以获得客户。当生鲜食品企业面临“获客难”的困境时,不妨开发一个…

前端学习(1319):node.js异步编程

test,js function getMsg(callback) {setTimeout(function() {callback({msg: hello node js})}, 2000) } getMsg(function(data) {console.log(data); }); callback.js function getData(callback) {callback(123); } getData(function(n) {console.log(被调用了);console.…

多线程通信

生产者,消费者模式synchronizedlock condition对象等待唤醒线程定制化调用通信一个线程生产,一个线程消费。 两种实现方式: synchronized关键字灵活的lock锁 一个线程新增1,一个消费0,按顺序进行。保证最后的数据为…

docker web程序本地化_Docker-01-Docker介绍

一 什么是虚拟化在计算机中,虚拟化(Virtualization)是一种资源管理技术,是计算机的各种实体资源,如服务器,网络,内存及存储等,予以抽象,转换后呈现出来,打破实…

tk-mapper 生成器

tk-mapper生成代码代码,项目地址如何使用1. 生成实体类, XML文件, Mapper接口。 2. 版本相关:mapper: 3.4.1mapper-spring-boot-starter: 1.1.2mybatis-generator-core: 1.3.6 3. 这里以SpringBoot为demo, 作为一个程序,运行Gener…

大二《数据结构》机考解题报告

这次学校数据结构机考,题目很奇怪,简直让我觉得这是算法考试……三道题,撑死了用到树的遍历和并查集,连个队列都没用,也是醉了-.- 第一题 高精度加法 两个数相加,数最多5000位,也就是和最多5001…

前端学习(1321):node.js得异步api

const fs require(fs);fs.readFile(./1.txt, utf8, (err, result1) > {console.log(result1);fs.readFile(./2.txt, utf8, (err, result2) > {console.log(result2);fs.readFile(./3.txt, utf8, (err, result3) > {console.log(result3);});}); }) 运行结果

ipad怎么和mac分屏_将Mac屏幕扩展到iPad有多好用?我甚至有了入手iPad Pro的冲动...

这次我手机先不升 iOS 13,不够稳,但 iPadOS 更新这么多,我是绝对会升的。手捧 11 英寸 iPad Pro 几个月,但却一直只把它当做大号 iPod Touch 的朋友在看完《iPadOS 抢先体验:这是一次属于 iPad 的成人礼》这篇文章后对…

SpringBoot配置文件绑定到Java Bean

boot读取配置文件1. yml配置文件2. 绑定方式13. 绑定方式23.1 依赖.3.2 boot 中提供的属性装配功能。1. 在某些业务中,需要将类的配置写到配置文件中, 不在代码中写死配置。 2. 所以需要读取配置文件(yaml, properties) 读取到Java Bean中。 3. 本文以oss对象存储配…

Ruby学习-第二章

第二章 类继承&#xff0c;属性&#xff0c;类变量 1.如何声明一个子类 class Treasure < Thing 这样Thing类中的属性name&#xff0c;description都被Treasure继承 2.以下三种方式传入父类initialize方法的参数分别是什么&#xff1f; # This passes a, b, c to the superc…

面向接口编程的优点_为什么我们要面向接口编程

到底面向&#xff1f;编程面向过程编程( ProcedureOriented、简称 PO) 和 面向对象编程( ObjectOriented、简称 OO) 我们一定听过&#xff0c;然而实际企业级开发里受用更多的一种编程思想那就是&#xff1a;面向接口编程( Interface-Oriented)&#xff01;接口这个概念我们一定…

设计模式:设计原则

程序设计的原则1. 单一设计原则2. 接口隔离原则3. 依赖倒转4. 里氏替换原则5. 开闭原则6. 迪米特原则7. 合成复用1. 单一设计原则 每一个类只负责做自己的的功能。不能跨越到其它类。 不合理 package top.bitqian.principle.single_responsibility;/*** author echo lovely* …

Android数据库LitePal的存储操作

本文属于转载&#xff0c;在此声明&#xff0c;出处&#xff1a;http://blog.csdn.net/guolin_blog/article/details/38556989 并且感谢guolin分享了这么精彩的博文。以下正文&#xff1a; 经过前面几篇文章的学习&#xff0c;我们已经把LitePal的表管理模块的功能都很好地掌握…

程控电源测试微安电流模式_无缝隙源和负载的切换:双向程控电源的一大门槛...

目前采用电池供电的直流无刷电机驱动的设备越来越多&#xff0c;从电动工具&#xff0c;无人机、机器人、再到电动汽车等。然而电机驱动器和电池的管理始终是研发工程师不得不面对的一道难题。电动机利用的是“电生磁”原理&#xff0c;把电能转换成机械能。但制动&#xff0c;…

前端学习(1324):anysc关键字

//只能出现再异步函数中 暂停异步函数得执行 async function fn() {throw 发生勒一些错误;return 123; } //console.log(fn()) fn().then(function(data) {console.log(data); }).catch(function(err) {console.log(err); }) 运行结果

Pacman主题下给Hexo增加简历类型

原文 http://blog.zanlabs.com/2015/01/02/add-resume-type-to-hexo-under-pacman-theme/ 背景 虽然暂时不找工作&#xff0c;但是想着简历也是个向别人推销自己的好东西。然后也想着折腾点新的东西&#xff0c;如此&#xff0c;这般&#xff0c;便想着研究起写个简历了。形式不…

屏幕输出语句_C语言快速入门——表达式与语句

表达式表达式是由运算符和操作数组合构造成。最简单的表达式是一个单独的操作数&#xff0c;以此作为基础&#xff0c;结合语言自身支持的操作符&#xff0c;就可以建立复杂的表达式。下面是一些表达式&#xff1a;从这里可以看到&#xff0c;操作数可以是数据常量(4&#xff0…