C++的学习方法!~

2024-12-02 20:52:37
推荐回答(5个)
回答1:

学习C++重在理解其各种语言设施所代表的语义,以及C++所能表示的语义所代表的设计思想。首先从宏观上入手,你需要明白的是C++是程序设计语言的本质。在此我把C++最重要的性质写下来:C++是一门静态类型检查,基于C内存模式,支持四种基本程序设计范型的语言。注意,这里说明了三个本质特性,静态说明了语言的类型检查性质,基于C内存模式告诉我们在C++中所有与内存有关的操作都需要程序员自己来负责,这样就带来了很多设计程序时的需要注意的地方,而理解支持的四种基本范型却是理解各种语言设施的基础。然后记住C++的最大的一点设计哲学,也是其贯穿应用C++的一条本质,我引用《C++ PRIMER》中文版前言内的一句话表示--“C++的基础是各种设施,它们让用户能够通过定义新的数据类型来扩展语言本身,这些新类型可以与内置类型一样的使用方式(如何理解这句话是关键,我的理解是:用户定义类型可以在任何使用内置类型的时候做为其替代,再具体点说就是用户定义类型可以象内置类型那样可以被声明,其对象可以被初始化,可以相互复制,可以象内置类型对象那样和很多操作符一起使用,可以被作为参数传递给函数,可以作为函数的返回值,可以作为容器的操作对象,用户定义类型可以和内置类型一样作为模板的参数),掌握这些设施(哪些设施?就是让用户定义类型可以和内置类型一样方便使用的设施,包括什么?构造,拷贝,解构函数,操作副重载.....)的第一步就是理解基本语言(什么是基本语言?就是C++中better c部分)。

  在此,我还想提出一点十分重要的概念:一门语言的最本质的东西就是其类型系统,任何语言都有自己的独特的类型系统,学习C++就是学习他的类型系统。所以首先需要彻底明白什么是数据类型这个概念。这样你的思路就清楚了,你有选择,从每一种C++支持的设计范型入手学习。

  结构化设计-----也就是C++中的better c部分,你需要在C的基础上学会函数重载和引用这两个最重要的语言新特心性。

  基于对象----你需要建立C++最强大的概念--类,也就是用户定义类型,这其实就是数据结构里面接触的抽象数据类型的概念,以及合理构造使用类的一系列语言措施。并始终记住,在C++进行设计时用类来表示我们需要表示的概念。类也是C++抽象机制里面最核心的概念。

  面向对象----在这里你需要知道继承和多态这样的OO概念,以及句柄类这样常见的设计技术,这里你需要明白你开始进入了对接口编程的阶段。同时你要学会OO思想,C++的一些设施只是为了把OO思想在语言所支持的语义中充分的表示出来。但是在这里,同时你需要明白的C++能表示的语义是受到其当初语言设计原则限制的(什么原则?静态类型检查,不为不需要的东西付出代价,选择权在程序员手上语言本身不去强迫程序员的做出选择),也就是说C++所能表示的OO思想可以称为具有C++特色的OO思想了。这样的OO思想和JAVA所代表的纯OO哪个更好?没有定论,因为他们本身的设计理念就不一样。

  泛型设计----这里你需要明白最重要的一点是C++的temlate机制无论其开始建立的初衷是什么,现在他所代表的真实含义是:编译时类型推导,也就是编译时多态,由此明白了泛型的核心---把各种类型当作一种抽象条件的具体化,C++有措施可以定义抽象条件吗?没有,所以这些条件只能定义在我们自己的心中,但我们可以把具体化的类型当作一种抽象条件实现在template机制中去,从而使tempalte成为比类型推导机制更进一步的东西,那就是抽象条件的推导。也就是说,我们不再把template接受的参数看成是类型,而是把template看成是一种接受抽象条件的机制,无论其类型如何,只要这种类型满足tempalte所接受的抽象条件就可以作为参数传递进去,这样就代表了一种泛型的思想-----类型不再是根本,抽象条件才是,类型不过是抽象条件的外衣和在C++中的实现方式而已。在结合基于对象和泛型设计这两种抽象设计模式的技术上诞生的工业产品就是---STL。

  (二)书的诱惑

  《C++程序设计语言》:如果你只买一本C++书,这本就是你的选择,作者Bjarne就是让你做出这样选择的全部理由,没有人能比他更了解什么样才是真正的使用C++编程了,有人说到这本书语言晦涩,或者对与初学者此书不适合,对此评论我颇不以为然,我看的是中文版,起码在我看来语言描叙非常到位,我喜欢这样的技术描叙风格。全书的核心就是告诉你如何去用正确的观念编写正确的C++的代码。强烈推荐。

  《C++语言设计与演化》:这本书也是我同时拥有中英两版的两本书之一(另外一本是《设计模式》)。如果在得到上面的那本书之后你需要第二本,那么在我看来这就是你的选择,作者同样是Bjarne,他将在这本书中告诉你C++的起源与发展,语言原则与本质,各种特性加入的理由和考量,以及几乎一切关于C++有趣的故事。我阅读过中英两版,都是强烈推荐。

  《C++标准程序库》:在AMAZON上面关于C++书籍评论最为火暴的一本。全书对于标准程序库的介绍可谓深入浅出,而且全书都是从实际运用出发,书中例子简单却非常说明问题,加上一些图表的陈列,使其概念十分清晰,而且从手册和学习两方面看都有其存在价值。强烈推荐。

  《EFFECTIVE C++ 中文版》:无须多说,在任何C++书籍推荐目录中都可以找到这本书的身影,盛名之下必无虚士。主要强调的是运用C++的各种特性的时候所必须注意的地方,以及一些比较通用的设计手段。其短小精悍的语言自然非常适合快节奏的现代风格,个人就十分喜欢Meyer的写作方式。强烈推荐。

  《MORE EFFECTIVE C++ 中文版》:做为上本书的姐妹篇,一样的写作风格,一样的写作目的。只是个人认为和其姐姐相比,存在差距,主要是信息量没有《EFFECTIVE C++ 中文版》那么大,主要说到了一些C++的设计惯用手法。推荐。

  《C++ PRIMER 中文版》:同样是出自大师之手,作者LIPPMAN,作为早期C++编译器的实现者之一,对与C++的了解以及该如何论序都有自己的独到见解。做为C++的百科全书和《C++程序设计语言》有着一样的地位。但是前者更强调的是C++的语法和其语义,而后者则是以如何用C++进行合理设计做为描叙的中心。全书构思十分巧妙,书的一开始就直接进入C++的主题,前面五章都用类设计一个数据结构,让读者完全明白了各种用户定义类型所代表的抽象能力,然后直接进入第六章标准库中的容器类,这样的设计让读者十分清楚的建立容器和类这两个C++中十分重要的概念。这样的设计针对有一定基础的C++读者来说可以说是非常有效果的。但是对于初学者来说,这确实不是一本合适的书籍,因为一上来太多的名词会把刚刚接触C++的人吓着的。推荐。

  《C++沉思录》:非常有特点的一本书,全书假设读者已经通晓C++语言,重点告诉读者C++的概念以及一些C++的设计手段,比如用C++到底为什么会比C或者其他过程语言更好?(书中给出的答案是,因为只有对象才有能力保持一定的状态,而算法没有这样的能力),如何进行抽象数据类型的程序设计,如何理解多态,如何通过代理隐藏继承,如何进行引用技数,为了效率如何进行缓时拷贝,以及模板技术是如何发展演进最后构成成STL库的。阅读感觉和《C++程序设计语言》一样,思想性非常强,读这样的书很累,脑子必须一直思考问题,思考作者里面提出的问题和他提出的解决方式。这本书最大的特点是非常直接的把C++语言的核心暴露出来-----三种抽象模型和极其语言设施本身对这三种抽象模型的支持。而《C++沉思录》给我的更深层思考是什么才是运用C++最合理的方式。推荐。

  《C++ STL中文版》:很朴实,不花俏,但是价值很高。个人认为其主要价值体现在以下几个方面:1,对于STL的实现关键iterator一般都使用了两种方式描叙,一种比较老式的函数方法,一种是新的?traits技巧,这样读者可以非常清楚的知道技术的演进。2,提供了一个STL LITE版本,阅读这样的代码对自己的提高非常大。3,书中提供的测试模块对于读者来说也是非常有的一章,对于想扩展STL的,可以按照上面提供的方法测试自己的STL组件。缺点:装订比较粗糙,与大师之作的地位不相称。推荐

  《C++ PRIMER PLUS 中文版》:一本思想性不是很强,技巧性不是很强的书,但是对于初学者来说非常合适的书。其中许多论序方式都和具体化,总体来说,这本书是我看过的C++书籍里面最合适初学者的。推荐。

  《深度探索C++对象模型》:这也是一本比较特别的书,告诉你编译器是如何安排处理对象的内存空间的,以及一些OO特性是如何实现的。不认为这是一本C++必须读物,算是课后读物应该比较合适吧,因为有时间了解C++的OO实现还不如花点时间搞清楚OO理论的本质概念:type theory。推荐。

  《C++设计新思维——泛型编程与设计模式之应用》:可谓C++中的奇书。这样的一本书,很难让人做出正确的评价与推荐指数(尤其是以我这个实用和人生本就应该享乐为人生观的人来说~:),因为全书所代表的思想前卫到了有点不切实际的地步,模式+泛型—多么高雅的组合。我个人的观点是,只有一部分人需要阅读此书,他们就是所谓的real c++ fans,暂且不提C++本身是否遇到了困难,就其书中所代表的设计思想,对于C++没有一点感情的程序员(感情就是以爱好为基础,而不是以攒钱为前提),我想对于这样的设计技术总会有晕的感觉,而一般程序员多半都不会喜欢这样的感觉~:)。推荐。

  《对象揭秘:Java、Eiffel和C++》:从书名就可以看出这本书不仅仅和C++有关系。可以说全书就是对C++的一次批判吧(书也起源与作者的一篇批判C++的文章)。有时候听听另外一种声音对自己保持清醒的头脑是非常有帮助的,对待一个人,对待一本书以及对待一门程序设计语言都是如此。这本书好象不是很火,大概跟其宣传不是很到位,或者同能同时了解这三门语言并比较关心这些语言深层次的优略的读者比较少有关系吧,在我看来这本书包含了许多对象与类型方面的理论,最为出彩的就是作者抓住Bjarne的“在C++中一个类就是一个类型”这样的“错误”言论狠批的论证过程。看这本书另外一个好处是能教会大家该如何去合理的辩驳自己的对手~:)。推荐。

  《大规模C++程序设计》:书在手上很久了,可一直没有仔细看,这也是评论之前必须说明的。总体看来书中涉及的很多东西都鲜见于其他读本。不管AMAZON上的评论是否是这本书比较过时,起码它介绍的许多对与我来说都是我所不知道不了解的,别人说过时是他的事情。而我,还是推荐。

  《STL和泛型编程》:难得的一本关于泛型编程的理念书籍,同样也是作为手册和学习两用,但是其手册不是使用手册,而是概念手册,对于设计自己的STL组件,这本书有非常好的帮助,虽然网上有篇STL的文档,其中的70%内容和这本书雷同,但此书仍不失可读性。推荐。

  《C++编程思想 第二版》:非常一般的书,是的这就是我对这本很多人奉为名著的评论,至于为什么是这样的评论,或者你不相信我说的是客观话,在你买了之后看完就知道了。一般。

  《Essential C++中文版》:总感觉这本书定位不是很清楚,因为对于初学者来说其开始就涉及了太多的名词,初学者看这本书,几乎就不要指望能很好的入门。而对于进阶者来说,其内容并无新意,对于C++高手来说,这样的小读本,根本就没有阅读的必要,也许是LIPPMAN+JJHOU的盛名吧,但我觉得这次算是有虚士了~:)。一般。

  《STL源码剖析》:侯SIR的大陆两本著作之一,但在我心中其质量好象并不如很多人说的那样好,就同类作品《C++ STL中文版》相比较内容略现单薄,并且三章之后很多东西都给人以堆砌的感觉,而且大部分精彩的材料都出自《STL和泛型编程》一书,给人感觉书中侯SIR自己的东西并不多,但第二章对于内存管理有很好的论叙表现,并且装订精良,尤其是那些图更是侯SIR的拿手好戏,但总体感觉有点华而不实。一般。

  后面列出两本不推荐的,具体原因也就不再分析。

  《高质量程序设计指南--C++/C语言》,《C++编码规范》

  另外两本常见的C++书籍:

回答2:

大一学习的c++,工作之后也一直用的c++。

1. 涵盖c++入门到精通的图书列表

《The C programming language》必读
《C++ Primer》,号称是一本可以让你从C或JAVA程序员转为一个真正的C++程序员的入门参考书,必读。
《The C++ programming language》,C++之父,人称B教主著作,在看过C++ primer后,应该可以跳章选读。
《Think in c++》,网上说此书的中文版翻译质量奇差,推荐看影印版,选读。
《Effective c++》,类似 Effective java,讲的是最佳实践,程序员必读。


《More effective c++》,上书的补充。
《The C++ standard library》,会写C,不会用标准库怎么行。这就跟java程序员不会用java.util包一样,必读。
《Effective STL》,STL库的最佳实践。Effective C++作者又一力作,必读。
《The annotated STL source》,STL源码分析,这本书应该算是深入/精通类了,选读。
《Generic programming and STL》,号称C++编程里,就是跟模板,泛型打交道,那么精通泛型是势在必行。

《C++ Template》,C++模板编程,代码复用的经验之道,必读。

《Exceptional C++》,跟Effective C++类似,属于最佳实践和难题解析,书中列出了许多应用场景和实例代码供读者揣摩,选读。

《More Exceptional C++》,上书的补充。

《Exceptional C++ Style》,上上书的补充

《Inside The C++ Object Model》,有了上面这些书做铺垫,那么终于可以读此神书了。它会带你游览C++对象模型的底层实现机制。读完此书,任何C++代码看起来如同行云流水,必读。

2. 优秀的C/C++开源项目(阅读代码)

OS:Linux kernel LVS、Linux应用程序

DB:Mysql、PostgreSQL

Complier:VM、GCC

Framework:OpenSip、SipProxy、

Net:ACE(Java Mina、Netty)、TCP/IP、HTTP协议栈

Cache:Memcached、Redis、

Library:STL(java util package)、Boost、Qt(UI)、

balance:Apache、Nginx

GSL

地址:https://github.com/microsoft/GSL

Boost文档

地址:https://www.boost.org/doc/libs/

wxWidgets官网

地址:http://wxwidgets.org/

gtkmm

地址:https://www.gtkmm.org/en/

CopperSpice

地址:https://www.copperspice.com/

Qt

地址:https://www.qt.io/Eigen

地址:http://eigen.tuxfamily.org/index.php?title=Main_Page#Documentation

Plot utils

地址:https://www.gnu.org/software/plotutils/

Asio

地址:https://think-async.com/Asio/

POCO

地址:https://pocoproject.org/

abseil

地址:https://abseil.io/

C++开源库汇总列表

地址:https://en.cppreference.com/w/cpp/links/libs

除了这些开源项目,也可以找一些免费的公开课,那这里也推荐一个ACM金牌大佬讲授的免费C++课程,可以去体验一下:

学好C++才是入职大厂的敲门砖! 当年要是有这课,我的C++也不至于这样

已失效 

3.C++语法讲解

  • 语言基础
    详细介绍变量、表达式、语句、指针、数组、流程控制、函数、文件组织等。

  • 抽象机制 - 面向对象编程
    深入讲解C++的抽象机制,封装(类)、继承、多态;操作符重载、函数对象、异常处理等。

  • 模板 - 泛型编程
    详细介绍C++的模板机制,类模板、函数模板、模板特化等方面的内容。

  • 4.深入c++面向对象

    4.1、从C到C++

  • 引用和指针:为什么引用很重要

  • const关键字:为什么const很重要

  • 名字空间 (namespace)

  • 4.2、深入C++对象

  • 关于C++对象
    内置类型的对象,如int、double对象,自定义类型的对象

  • 对象类型的定义
    关键字class和struct
    类成员:成员函数和数据成员
    静态数据成员
    成员的访问控制
    对象的size
    关于this指针
    onst成员函数、const究竟修饰什么
    mutable数据成员
    4种特殊成员函数:constructor、destructor、copy constructor、operator=
    对象的构造、初始化列表
    对象的析构
    对象的复制
    什么情况下有必要显式定义4种特殊函数
    C++对象生命周

  • 4.3、操作符重载

  • 关于C++中操作符重载机制

  • 重要操作符重载
    算术运算:+, -, *, /, %, ++, --, ...
    关系运算:>, <, ==, !=
    下标存取:[ ]
    函数调用:(),函数对象
    类型转换、单参数构造函数与隐式转换、阻止隐式转换 -- explicit关键字

  • 友元与成员

  • 4.4、面向对象基础 -- 继承

  • 基类与派生类

  • 再谈对象的构造与析构

  • 虚函数、纯虚函数

  • 派生类的内存布局、虚函数表

  • 多态、多态类型、如何体现多态

  • 虚析构、为什么虚析构很重要

  • 4.5、关于继承更多的话题

  • 多继承

  • 虚继承与虚基类

  • 对基类的访问、public / protected / private继承

  • Down cast:static_cast<>和dynamic_cast<>

  • 运行期类型识别 (RTTI)

  • 4.6、C++与面向对象设计

  • C++语言机制提供了完整的OOP支持

  • 超越继承

  • OOP若干法则和设计模式

  • 5.C++泛型编程与STL

    5.1、C++ 模板机制

    5.2、STL 概要

    5.3、STL容器
    5.4、STL迭代

    5.5、STL算法

    5.6、预与定义STL数对象

    5.7、STL适配器

    6. C++进阶

  • 《C++ Primer》


  • 最新版本:第三版(第四版国外已上架, 国内一些网上书店也在预订中)


  • 适合有丰富C经验,缺乏C++经验的。不过我个人一直认为此书带着过于强烈的C语言的痕迹,对于C++的学习未必是 好事。


  • 《The C++ Programming Language》/《C++程序设计语言》


  • 最新版本:第三版特别版


  • 简称 TC++PL,有其他语言的丰富经验的。(也有人简称之为“TCPL”,但需与另一本《The C Programmer Language》区分开来)


  • 《Essential C++》


  • 《Accelerated C++》


  • 这两本薄一些,都是不错的选择。《Accelerated C++》本人没有读过,从各方面的评价来看,完全值得推荐。


  • 以上几本书都有相应的中文版,而且翻译的质量都不错。上面的书未必都需要读一遍,但无论如何,TC++PL是应该阅读的。



  • 《Effective C++》


  • 最新版本:第二版(第三版国外已上架,国内一些网上书店也在预订中)


  • 简称EC。C++程序员必读!很多时候,我们说C++圣经不是指TC++PL,而是这一本。《The Pragmatic Programmer》一书中写到:“一旦你发现自己要参与C++项目的开发,赶快跑(不要走)到书店去购买Scott Mayer的《Effective C++》,可能还要《More Effective C++》”。


  • 《C++ Coding Standards: 101 Rules, Guidelines, and Best Practices》/《C++ 编程规范》


  • 个人认为此书应为C++程序员必备的案头书。几乎Effective系列和Exceptional系 列都在这里得到了总结。最新的模版、异常的业界经验都在这里的到了体现。可能的唯一缺陷就是对一个新手而言,关于“为什么这么做”的问题,解释的不够。


  • 我 的看法是:如果你不理解其中的条款,记忆,并且照做;如果你理解其中的条款,我猜你一定会同意书中的观点。我认为这本书中的内容至少在2009年以前都不 会过时,人们将广为传诵它制定的101条戒律。


  • 还不知道他的简称,也许“101”会成为一个候选者?


  • 提到《Effective C++》,那么另外三本书一一浮出水面:


  • 《More Effective C++》


  • 《Exceptional C++》


  • 《More Exceptional C++》。


  • 新书《Exceptional C++ Style》也是值得一看的好书。


  • 上 述几本书,一本也不应该放过。


  • 个人建议上述书籍按顺序阅读。并且,在将来反复阅读这几本书。

  • 《Thinking in C++》/《C++编程思想》
    这本书及其中文版传言好坏都有,没有认真看过,不做评价,如果确有兴趣,不妨尝试 一下该书。

    以下几本书基本上涉及的都是语言本身,大体上可以按照以下的顺序阅读。

    《C++必知必会》
    如果早一年,这本书将是重量级的,然而它被101和《Exceptional C++ Style》盖过一头。

    《C++ Gotchas: Avoiding Common Problems in Coding and Design》/《C++程序设计陷阱》
    这又是一本我未曾读过,而且广受好评的书。

    《STL 源码剖析》
    这本书我刚到手,就被人"借"走,以至于到现在也没有看过。看过这本书的朋友,可以给一个合适的评价。

    7. C++进阶之数据结构基础

    这是所有编程语言中最应该学习的部分,程序组成的基础之一。

    顺序存储、链式存储、循环链表;

    双向链表、栈(顺序和链式)、队列(顺序和链式);

    栈的应用、树基本概念及遍历、二叉树;

    排序算法、并归算法、选择、插入、快速、希尔。

    以上这些内容你知道吗?

    8. C++进阶之UI界面开发

    掌握QT类库构架,图形界面开发模型;

    掌握QT开发技巧,消息机制,图形处理;

    掌握QT网络编程,UDP,TCP使用方式;

    掌握QT文件处理方式,序列化;

    掌握QT在windows,linux,ios,android不同平台下的移植技术。

    9. C++进阶之Unix/Linux网络服务器

    掌握Unix/Linux平台开发方式;

    熟练使用系统调用;

    熟练Unix/Linux内存管理,进程,线程调度;

    熟悉网络服务器开发方式,熟练编写TCP,UCP网络服务程序;

    掌握同步/异步IO模型在网络编程中的使用方式。

    10.C++进阶之数据库开发

    掌握SQL语言的实用技巧。Oracle,MySQL数据库的使用方式。

    如果你能熟练掌握以上列出的技能,具备解决复杂问题和技术难点的能力,而且你能独立开发一些比较复杂的功能模块,那么很荣幸地告诉你,你已经达到中级水平,薪资过万对你来说简直是小菜一碟。

    11.C++标准参考

    C++ reference

    地址:https://en.cppreference.com/w/

    C++ Coding Standard

    地址:http://www.possibility.com/Cpp/CppCodingStandard.html

    Standard C++

    地址:https://isocpp.org/

    State of C++ Evolution

    地址:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2597.html

    The C++ Resources Network

    地址:http://www.cplusplus.com/

    Draft C++ Standard: Contents

    地址:http://eel.is/c++draft/

    需要资料私聊我

回答3:

系统学习一门语言,最好是跟着一本书边学边练习,快速掌握这门语言的语法和基础特性,然后就可以找小项目练手,练一练再回头来看书,往复循环,不断加深理解,慢慢就能掌握到位。学习C++语言最好的教程,是C++之父Bjarne Stroustrup亲自撰写的《The C++ Programming Language (4th Edition)》,支持C++11,机械工业出版社有英文原版,分两本,第一本讲1~3部分,C++语言的基础内容,第二本是专讲第4部分,C++标准库。另外还有两本书,也是学习C++语言的很好选择,《C++ Primer Plus(6th Edition)》和《The C++ Standard Library: A Tutorial and Reference (2nd Edition)》,也都支持C++11 。需要注意的是,选择(设计)练习项目时,最好能结合当前的学习进度,让自己能够完成,收获正向反馈,激励自己不断前进。只有持续的正向激励,才能让一个人顺畅的完成C++语言的学习。所以,一系列良好的练习项目很重要,既不能难度太低(没有成就感),也不可难度太高(会有挫败感),稍稍付出努力就能完成是最理想的。一旦完成了基础语言的学习和一系列练习项目,对语言有了一些感知,就可以参与到复杂度较大的项目中来磨练自己。最好是能结合自己的工作与生活,做一些自己感兴趣的项目,兴趣是最好的老师和最强的动力,如果做的东西感兴趣,就很容易钻进去,学下来。结合C++的知识图谱,对C++语言的学习,建议顺序是这样的:

    基础语言类与面向对象输入输出字符串处理(类库和正则表达式)容器类库泛型算法多线程原子操

回答4:

不知你有没有学过C,如果学过的话,你就能清晰地感觉到,程序语言类的书籍都是分块编写的,开头几张都是一些基础的运算符以及书写规则等,你把它记一下。
后面的章节就是针对一个个的语句架构,一个个的学完就OK啦!

回答5:

多看视频,多看优秀代码,多敲代码