非常好的一篇讲c++学习方法的文章

看了一篇文章,c++的... 前言 我的blog以前很长一段时间关注的都是C++中的技术&细节,乃至于读者和应者都寥寥。然而5月份的时候写的一篇“你应当如何学习C++”,阅读量却达到了3万多,在blog上所有文章中却是最高的(且远远超过了第二位);评论数目也有一百多。为什么独独这篇能够激起这么多的回应,想必是国内的C++社群被C++压抑太久,或者,严格来说,是被C++的教育方式压抑太久。实际上,不管是在各大国内论坛上,还是 阅读详情

原文作者找不到,因为也是人家转的,写的非常好,所以抱歉了!

avascript是世界上最受误解的语言,其实C++何尝不是。坊间流传的错误的C++学习方法一抓就是一大把。我自己在学习C++的过程中也走了许多弯路,浪费了不少时间。
  为什么会存在这么多错误认识?原因主要有三个,一是C++语言的细节太多。二是一些著名的C++书籍总在(不管有意还是无意)暗示语言细节的重要性和有趣。三是现代C++库的开发哲学必须用到一些犄角旮旯的语言细节(但注意,是库设计,不是日常编程)。这些共同塑造了C++社群的整体心态和哲学。
  单是第一条还未必能够成气候,其它语言的细节也不少(尽管比起C++起来还是小巫见大巫),就拿Javascript来说,作用域规则,名字查找,closure,for/in,这些都是细节,而且其中还有违反直觉的。但许多动态语言的程序员的理念我猜大约是学到哪用到哪罢。但C++就不一样了,学C++之人有一种类似于被暗示的潜在心态,就是一定要先把语言核心基本上吃透了才能下手写出漂亮的程序。这首先就错了。这个意识形成的原因在第二点,C++书籍。市面上的C++书籍不计其数,但有一个共同的缺点,就是讲语言细节的书太多——《C++ gotchas》,《Effective C++》,《More Effective C++》,但无可厚非的是,C++是这样一门语言:要拿它满足现代编程理念的需求,尤其是C++库开发的需求,还必须得关注语言细节,乃至于在C++中利用语言细节已经成了一门学问。比如C++模板在设计之初根本没有想到模板元编程这回事,更没想到C++模板系统是图灵完备的,这也就导致了《Modern C++ Design》和《C++ Template Metaprogramming》的惊世骇俗。

这些技术的出现为什么惊世骇俗,打个比方,就好比是一块大家都认为已经熟悉无比,再无秘密可言的土地上,突然某天有人挖到原来地下还蕴藏着最丰富的石油。在这之前的C++虽然也有一些细节,但也还算容易掌握,那可是C++程序员们的happy old times,因为C++的一切都一览无余,everything is figured out。然而《Modern C++ Design》的出世告诉人们,“瞧,还有多少细节你们没有掌握啊。”于是C++程序员们久违的激情被重燃起来,奋不顾身的踏入细节的沼泽中。尤其是,模板编程将C++的细节进一步挖掘到了极致——我们干嘛关心涉及类对象的隐式转换的优先级高低?看看boost::is_base_of就可以知道有多诡异了。

但最大的问题还在于,对于这些细节的关注还真有它合适的理由:我们要开发现代模板库,要开发active library,就必须动用模板编程技术,要动用模板编程技术,就必须利用语言的犄角旮旯,enable_if,type_traits,甚至连早就古井无波的C宏也在乱世中重生,看看boost::preprocessor有多诡异就知道了,连C宏的图灵完备性(预编译期的)都被挖掘出来了。为什么要做这些?好玩?标榜?都不是,开发库的实际需求。但这也正是最大的悲哀了。在boost里面因实际需求而动用语言细节最终居然能神奇的完成任务的最好教材就是boost::foreach,这个小设施对语言细节的发掘达到了惊天地泣鬼神的地步,不信你先试着自己去看看它的源代码,再看看作者介绍它的文章吧。而boost::typeof也不甘其后——C++语言里面有太多被“发现”而不是被“发明”的技术。难道最初无意设置这些语言规则的家伙们都是Oracles?

  因为没有variadic templates,人们用宏加上缺省模板参数来实现类似效果。因为没有concepts,人们用模板加上析构函数的细节来完成类似工作。因为没有typeof,人们用模板元编程和宏加上无尽的细节来实现目标… C++开发者们的DIY精神不可谓不强。

然而,如果仅仅是因为要开发优秀的库,那么涉及这些细节都还是情有可原的,至少在C++09出现并且编译器厂商跟上之前,这些都还能说是不得已而为之。但我们广大的C++程序员呢?大众是容易被误导的,我也曾经是。以为掌握了更多的语言细节就更牛,但实际却是那些语言细节十有八九是平时编程用都用不到的。C++中众多的细节虽然在库设计者手里面有其用武之地,但普通程序员则根本无需过多关注,尤其是没有实际动机的关注。一般性的编码实践准则,以及基本的编程能力和基本功,乃至基本的程序设计理论以及算法设计。才是真正需要花时间掌握的东西。



学习最佳编码实践比学习C++更重要。看优秀的代码也比埋头用差劲的编码方式写垃圾代码要有效。直接、清晰、明了、KISS地表达意图比玩编码花招要重要…

  避免去过问任何语言细节,除非必要。这个必要是指在实际编程当中遇到问题,这样就算需要过问细节,也是最省事的,懒惰者原则嘛。一个掌握了基本的编程理念并有较强学习能力的程序员在用一门陌生的语言编程时就算拿着那本语言的圣经从索引翻起也可以编出合格的程序来。十年学会编程不是指对每门语言都得十年,那一辈子才能学几门语言哪,如果按字母顺序学的话一辈子都别指望学到Ruby了;十年学习编程更不是指先把语言特性从粗到细全都吃透才敢下手编程,在实践中提高才是最重要的。

至于这种抠语言细节的哲学为何能在社群里面呈野火燎原之势,就是一个心理学的问题了。想像人们在论坛上讨论问题时,一个对语言把握很细致的人肯定能够得到更多的佩服,而由于论坛上的问题大多是小问题,所以解决实际问题的真正能力并不能得到显现,也就是说,知识型的人能够得到更多佩服,后者便成为动力和仿效的砝码。然而真正的编程能力是与语言细节没关系的,熟练运用一门语言能够帮你最佳表达你的意图,但熟练运用一门语言绝不意味着要把它的边边角角全都记住。懂得一些常识,有了编程的基本直觉,遇到一些细节错误的时候再去查书,是最节省时间的办法。

  C++的书,Bjarne的圣经《The C++ Programming Language》是高屋建瓴的。《大规模C++程序设计》是挺务实的。《Accelerated C++》是最佳入门的。《C++ Templates》是仅作参考的。《C++ Template Metaprogramming》是精力过剩者可以玩一玩的,普通程序员碰都别碰的。《ISO.IEC C++ Standard 14882》不是拿来读的。Bjarne最近在做C++的教育,新书是绝对可以期待的。


P.S. 关于如何学习编程,g9的blog上有许多精彩的文章:这里,这里,这里,这里… 实际上,我建议你去把g9老大的blog翻个底朝天 

  再P.S. 书单?我是遑于给出一个类似《C++初学者必读》这种书单的。C++的书不计其数,被公认的好书也不胜枚举。只不过有些书容易给初学者造成一种错觉,就是“学习C++就应该是这个样子的”。比如有朋友提到的《高质量C/C++编程》,这本书有价值,但不适合初学者,初学者读这样的书容易一叶障目不见泰山。实际上,正确的态度是,细节是必要的。但细节是次要的。其实学习编程我觉得应该最先学习如何用伪码表达思想呢,君不见《Introduction to Algorithm》里面的代码?《TAOCP》中的代码?哦,对了它们是自己建立的语言,但这种仅教学目的的语言的目的就是为了避免让写程序的人一开始就忘了写程序是为了完成功能,以为写程序就是和语言细节作斗争了。Bjarne说程序的正确性最重要,boost的编码标准里面也将正确性列在性能前面。

  此外,一旦建立了正确的学习编程的理念,其实什么书(只要不是太垃圾的)都有些用处。都当成参考书,用的时候从目录或索引翻,基本就对了。

  再再P.S. myan老大和g9老大都给出了许多精彩的见解。我不得不再加上一个P.S。具体我就不摘录了,如果你读到这里,请务必往下看他们的评论。转载者别忘了转载他们的评论:-)

许多朋友都问我同一个问题,到底要不要学习C++。其实这个问题问得很没有意义。“学C++”和“不学C++”这个二分法是没意义的,为什么?因为这个问题很表面,甚至很浮躁。重要的不是你掌握的语言,而是你掌握的能力,借用myan老大的话,“重要的是这个磨练过程,而不是结果,要的是你粗壮的腿,而不是你身上背的那袋盐巴。”。此外学习C++的意义其实真的是醉翁之意不在酒,像C/C++这种系统级语言,在学习的过程中必须要涉及到一些底层知识,如内存管理、编译连接系统、汇编语言、硬件体系结构等等等等知识(注意,这不包括过分犄角旮旯的语言枝节)。这些东西也就是所谓的内功了(其实最最重要的内功还是长期学习所磨练出来的自学能力)。对此大嘴Joel在《Joel On Software》里面提到的漏洞抽象定律阐述得就非常漂亮。

  所以,答案是,让你成为高手的并不是你掌握什么语言,精通C++未必就能让你成为高手,不精通C++也未必就能让你成为低手。我想大家都不会怀疑g9老大如果要抄起C++做一个项目的话会比大多数自认熟练C++的人要做得漂亮。所以关键的不是语言这个表层的东西,而是底下的本质矛盾。当然,不是说那就什么语言都不要学了,按照一种曹操的逻辑,“天下语言,唯imperative与declarative耳”。C++是前者里面最复杂的一种,支持最广泛的编程范式。借用当初数学系入学大会上一个老师的话,“你数学都学了,还有什么不能学的呢?”。学语言是一个途径,如果你把它用来磨练自己,可以。如果你把它用来作为学习系统底层知识的钥匙,可以。如果你把它用来作为学习如何编写优秀的代码,如何组织大型的程序,如何进行抽象设计,可以。如果掉书袋,光啃细节,我认为不可以(除非你必须要用到细节,像boost库的coder们)。
 




关于SLAM十四讲中 非模板类Sophus库的安装问题 最近开始学习高翔博士的《视觉SLAM十四讲》,第四章要求安装一个非模板类的Sophus库。在安装书中提供的第三方库时出现错误。在安装过程中,使用Cmake ..的时候能够顺利通过,接着执行make命令的时候就会出现错误如下: ***1. Sophus/sophus/so2.cpp:33:26:error: lvalue required as left operand of assignment... 阅读详情

相关推荐

读取cpp文件处理

代码如下: #include #include #include #include #include #include #include using namespace std; int Filetotalnum=0;//总行数 int avgtotalnum = 0;//各函数平均行数 //链表中的数据结构(函数名字,代码行数) typedef struct Link_data {

wochendaixin的博客 4651

C++学习路线:从基础到精通

从基础语法到面向对象,掌握STL与内存管理,进阶模板与多线程,实战项目提升能力,持续学习新标准与优秀代码,成为C++高手。

byte轻骑兵的技术小窝 1万+

C/C++学习路线总结与分享

C/C++学习路线总结与分享

dvlinker的技术专栏 11万+

C++学习步骤

2007-10-31 13:51C++知识分类:①基础知识(C 语言、标准库、文件、注册表、数据结构)         ②高级知识(多线程、串口通讯、网口通讯、动态库、MFC、COM、ATL、ActiveX)         ③专业知识(图像处理、多媒体、OpenGL、DirectShow、数据库、网络安全)   第1阶段先花一个月时间学习基本C语言,然后再看林锐博士的高

iinel的专栏 5078

C++学习:0、CPP 学习概述

目录一、汇编的重要性1、学习建议2、代码本质的挖掘3、编程语言的本质区别二、开发环境的搭建 路线大纲: 常用语法: 面向对象: 项目实战: 特点: 通过反汇编,通过底层来观察 C++ 的本质 CPP 的应用领域 思考一个问题:既然 C ++ 执行效率这么高,为什么还要出现新的编程语言?所有地方都用 C++ 不就好了吗? 首先每一门编程语言都有自己的优缺点,都有自己的擅长的领域。 比如 python 适合数学家来进行算法开发,适合分析师进行数据分析,如果让数学家和分析师再学习C++ 那就太

vincent3678的博客 7706

HAMi 核心模块与架构设计

HAMi 的架构设计是围绕 Kubernetes 生态系统构建的,通过扩展 Kubernetes 的调度能力和设备管理能力,为用户提供了高效、灵活的异构设备虚拟化和管理解决方案。

北斗云的博客 2552

怎么学习C++

第一:如果初学者学过c语言的基本语法以及基本数据结构,那么这里我推荐看的一本书是《c++ primer》这本书有中文和英文版。可以根据自己的实际情况进行选择;第二:如果初学者以前没有接触过c语言,那么我推荐的是《c++ primer plus》  这本书介绍c语言的东西比《c++ primer》多一点。适合没有接触过c语言的同学。第三:看编程语言的时候,一定要边看边打代码。这样才能更容易的去理解,...

Angelazengyan的博客 1586

AWS入门实践-如何在AWS云上创建一个内外网隔离的生产环境

在 AWS 上建立一个内外网分离的生产环境,可以减少应用服务的暴露面,有效的保证你的应用服务器的安全。通常我们会将web应用放在外网的子网内,数据库服务器等放在内网的子网。我们将按照下图来部署动手实践环境,实现在public subnet的EC2虚拟机可以直接通过互联网可以访问,在Private subnet的EC2虚拟机不能通过互联网直接访问,但是却可以在内部来访问互联网安装应用等等。

weixin_39108752的博客 2993

超详细、超完整的C++教程(算是吧)

C++是一种高级编程语言,它被广泛应用于软件开发、游戏制作、嵌入式系统等领域。本文将为读者提供一份超详细、超完整的C++教程,帮助初学者掌握C++的基础知识,同时给出十个实例,并一一解释分析。最后,我们将为读者提供一道编程题,并给出解答。通过本文的阅读,读者将能够全面掌握C++的基础知识,并能够运用所学知识解决实际问题。我们相信,只要勤奋学习,任何人都可以成为一名优秀的C++程序员。

ljl的博客 2万+

AT91SAM9260搭建LINUX操作系统

一、 编写目的 2 二、 系统搭建 2 1. 下载相关软件包 2 2. Bootstrap编译 3 3. U-BOOT编译 5 4. LINUX编译 7 5. 通过U-BOOT的TFTP命令从TFTP服务器下载系统镜像 9 6. 文件系统制作 10 7. 挂载NFS作为根文件系统 10 三、 总结 14 一、编写目的 本文档用于记录AT91SAM9260 LINUX学

lshiceman的专栏 7410

rk3568 点亮双LVDS 屏

承接文章《rk3568点亮LCD(lvds)》中仅仅只能使用亮单LVDS;经过厂商的努力,陆续发布新补丁。目前支持双lvds显示,缺憾是需要自己额外移植相关补丁。受限于通信频率和VOP编码能力,支持最大分辨仍然是1920x1080、60fps。

weixin_35723192的博客 3006

一篇文章讲通 C++ 所有初始化方法

在各种编程语言中,初始化都是一个至关重要的步骤,确了保对象在使用前具备一个明确的初始状态。C++提供了多种初始化方法,每种方法都有其特定的适用场景和需要注意的事项。下面将详细介绍C++ 的 9 初始化方法:1. 默认初始化(Default-initialization)形如T obj、new T等方式的初始化,其中T为类...

cnzzs的博客 1435

25、格式化字符串攻击全解析

本文深入解析了格式化字符串攻击的原理与利用方式,涵盖缓冲区溢出与格式化字符串漏洞的区别,详细介绍了printf函数的工作机制、常见格式化说明符及其安全隐患。文章分析了三类典型编程错误导致的漏洞,并展示了如何通过恶意格式化字符串实现拒绝服务、内存读取和写入攻击。同时,提供了有效的防御措施,包括输入验证、使用安全函数、避免直接使用用户输入作为格式化字符串以及启用编译器安全选项,帮助开发者防范此类高危漏洞。

beer8的博客 83

通过一篇文章让你了解如何学习C++

学习C++需要掌握其基础语法、指针和内存管理、STL库使用、面向对象编程等核心概念。可通过阅读权威书籍、在线教程和参考官方文档来系统学习。实践是关键,通过编写小程序练习基础语法,逐渐尝试复杂项目以加深理解。遇到问题时,利用社区论坛、问答网站等资源寻求解答,也可通过调试和错误排查锻炼问题解决能力。持续学习和实践,结合项目需求深入学习特定领域的知识,如游戏开发、性能优化等。保持耐心和毅力,不断积累经验,逐步提升编程技能。C++不仅仅是一门语言,更是一种生活哲学,在以后的工作之余还需要大家继续挖掘……

qq_74013365的博客 1701

【STM32 Blue Pill编程】-STM32CubeIDE开发环境搭建与点亮LED

本文为使用 STM32Cube IDE 的 STM32 Blue Pill 入门教程。 在本文中,我们将介绍如何控制 STM32 Blue Pill 的 GPIO 引脚。以及开发环境搭建。 本系列文章将重点介绍采用 ARM Cortex-M 的 BluepellSTM32F103C8 微控制器以及如何使用 STM32CubeIDE 对其进行编程。 STM32CubeIDE是STM32官网提供的IDE

视觉与物联智能 1066

ROS2 多机器人导航仿真入门教程(一)

RMF 是建立在 ROS 2 基础上的一系列可重复使用、可扩展的库和工具,可实现任何类型机器人系统的异构机群的互操作性。RMF 利用标准化的通信协议与部署机器人的基础设施、环境和自动化系统进行通信,以优化关键资源(如机器人、电梯、门、通道等)的使用。它通过资源分配和通过 RMF 核心(将在本书后面详细介绍)防止共享资源冲突,从而为系统增加智能。RMF 灵活而强大,几乎可以在任何通信层上运行,并与任何数量的物联网设备集成。RMF 的架构设计允许随着环境自动化水平的提高而扩展。

2506_90492529的博客 1658

学习C++方法总结

转自:http://blog.youkuaiyun.com/yong2016/article/details/9321837 看了这篇文章才知道自己最近太浮躁了,学做技术也是学做人。 读者定位是两类人群:a.初学者,即将入手 C++ 语言、不知道如何开始;b.已经开始学习C++许久了,却进度缓慢,抓不到精髓,倍感迷茫。 本文不会深入到C++语言内部挖掘技术点。 如果你自诩C++高手,请绕道;如果...

qq_34029983的博客 2万+

基于YOLOv26的卫星遥感环境监测系统

本文介绍了一个基于YOLOv26的卫星遥感环境监测系统。该系统采用分层架构设计,包含数据采集、预处理、目标检测、图像分析、变化检测等核心模块。技术栈包括YOLOv26、PyTorch、OpenCV等深度学习框架和图像处理工具,以及GDAL、rasterio等地理信息处理库。系统支持获取多种卫星数据源(如Sentinel、Landsat、MODIS)的遥感图像,并进行时间序列分析。通过代码示例展示了数据采集模块的实现,包括卫星图像获取和模拟生成功能。该系统可应用于环境要素检测、变化监测等场景,为环境监测提供智

一键难忘的博客 934

【C++】— 一篇文章让你认识STL

STL是的简称,中文名是标准模板库,是C++标准库的重要组成部分,它不仅是一个可以复用的组件库,而且还是包罗了数据结构与算法的软件框架。

2301_81290732的博客 1573

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

看到了一篇关于学习C++的好文章,自勉

  1.把C++当成一门新的语言学习(和C没啥关系!真的。);   2.看《Thinking In C++》,不要看《C++变成死相》;   3.看《The C++ Programming Language》和《Inside The C++ Object Model》,不要因为他们很难而我们自己是初学者所以就不看;   4.不要被VC、BCB、BC、MC、TC等词汇所迷惑——他们都是集

972

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【C++】一篇文章搞懂为什么CPP支持函数重载而C不支持?

Windows操作系统下VS编译C文件 #include <stdio.h> #include <Windows.h> double add(double a, double b); int main() { add(1.0, 2.0); system("pause"); return 0; } 这段代码编译可以通过,但是链接通过不了 报错: 错误 2 error LNK2019: 无法解析的外部符号 _add,该符号在函数 _main 中被引

宫瑞阳的博客 1295

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【C++100问】一篇文章(16个小例子)带你入门C++的编程世界(基础篇)

1

种树最好的时间是10年前,其次是现在!!! 5652

《C++开源库介绍与使用》(zip.cpp/unzip.cpp 和 libqr)的完整文章

(zip.cpp/unzip.cpp 和 libqr)的完整文章,延续前文(jsoncpp、RapidJson、TinyXML、libcurl)的结构和深度。代码可集成到您的 IM 软件(参考第9篇、第11篇),与 zlib(第14篇)、libcurl(第4篇)结合使用。下载:从 https://fukuchi.org/works/qrencode/ 或 GitHub 获取(https://github.com/fukuchi/libqrencode)。本响应包含两个库的详细内容、后续计划和综合案例。

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 1138

一篇非常好的c++学习方法,转自贴吧

原帖地址:点击打开链接http://tieba.baidu.com/p/1113064961      Javascript是世界上最受误解的语言,其实C++何尝不是。坊间流传的错误的C++学习方法一抓就是一大把。我自己在学习C++的过程中也走了许多弯路,浪费了不少时间。      为什么会存在这么多错误认识?原因主要有三个,一是C++语言的细节太多。二是一些著名的C++书籍总在(不管有意还是

舒哥的blog 1万+

一篇文章带你学习C和CPP的内存管理

C和C++内存管理C和C++内存分布C和C++动态内存管理方式new和delete实现原理 C和C++内存分布 C和C++动态内存管理方式 new和delete实现原理

小东的博客 874
上一篇: 数据结构--二叉树
下一篇: 树,森林,二叉树之间的转换
心若天府
博客等级 码龄15年 37粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值