入门推荐C++PrimerPlus第6版中文版习题解答经典教程

入门推荐 C++ Primer Plus 第6版 中文版

C++编程经典教程,30年畅销C++百科全书,零基础自学C++入门。

C++是在C语言的基础上发展起来的一种编程语言,它集面向对象编程、泛型编程和过程式编程于一体。它是 C 语言的超集。本书于2003年根据ISO/ANSI C++标准编写,通过大量简短而强大的程序,详细而全面地阐述了C++的基本概念和技术,并专门有一章介绍了C++的新功能。 +11。

《C++ Primer Plus(第6版)中文版》共18章,分别介绍了C++程序的运行方式、基本数据类型、复合数据类型、循环和关系表达式、分支语句和逻辑运算符、函数重载和Function模板、内存模型和命名空间、类设计和使用、多态性、虚函数、动态内存分配、继承、代码重用、朋友、异常处理技术、字符串类和标准模板库、输入/输出、C++ +11 新特性和更多的。

《C++ Primer Plus(第6版)中文版》面向C++初学者。从C语言的基础知识入手,然后在此基础上详细阐述C++的新特性。因此,读者无需具备 C 语言背景知识。《C++ Primer Plus(第6版)中文版》可作为高校C++课程教学的教材,也可供初学者自学C++使用。

它与

C++ Primer Plus 第6版 中文版 习题解法

经典畅销书《C++ PrimerPlus(第6版)中文版》的学习伴侣,北师大名师详细分析所有题目,全面提升C++编程能力。首选的编程练习册。

C++ 编程(第 3 版)

从入门到精通C++编程,C++编程基础教程,C++自学入门经典,提供练习和教学PPT,使用C++编程语言讲解计算基础知识和技能。实用教程。

本书是一本关于 C++ 编程语言计算基础和技能的实用教程。本书是作者数十年教学经验的结晶。通俗易懂地介绍了对象和类的概念,帮助学生更好地学习计算机科学的第一门课程,为后续课程的学习打下坚实的基础。本书的每一章都提供了自测题、练习题、编程技巧、编程项目等等。附录部分给出了所有自测问题的答案,供读者学习和参考。

本书适合作为高校计算机专业编程、编程基础等课程的教材,也适合专业程序员和想学习C++编程的读者阅读。

高级推荐的 C++ 冥想

C++行业资深技术大师,C++标准委员会成员,著名技术夫妇的经典著作,畅销全球20余年。结合了作者10年的C++编程生涯和感悟,被C++之父推荐。

《C++ Meditations》分为6部分,共32章。他们就 C++ 语言的历史和特点、类和继承、STL 和泛型编程以及库设计等几个主要技术主题进行了详细而深入的讨论。它几乎涵盖了 C++ 的所有设计思想和技术细节。本书通过精心挑选的示例向读者传达了先进的编程方法和思想。

《C++冥想》适合有一定经验的C++程序员阅读和学习,可以帮助他们提高技术能力,成为C++编程的高手。

C++语言的设计与演进

C++语言之父的经典著作和思想集锦,一本描述C++语言发展历史、设计理念和技术细节的综合性书籍。

本书是 C++ 设计师 Bjarne Stroustrup 最重要的 C++ 语言著作之一(另一本是《The C++ Programming Language》)。在本书中,作者全面论述了C++的历史和发展,C++中各种重要机制的性质、意义和设计背景,这些机制的基本目的和用途,并讨论了C++的应用领域和未来的发展方向。合适的前景。本书在帮助人们深入理解C++语言方面具有不可替代的地位,值得每一位关心、学习和使用C++语言的专业工作者、科研人员、教师和学生阅读。在本书中,作者还讨论了与编程语言、系统编程、

C++并发编程实践

《C++并发编程实战》是基于C++11新标准的并发多线程编程深度指南。内容包括std::thread、std::mutex、std::future和std::async等基本类的使用,到内存模型和原子操作,锁的构造和基于锁的数据结构,以及然后是并行算法,线程管理,最后介绍多线程代码的测试。本书的附录部分还对C++11新语言特性中多线程相关项进行了简要介绍,并提供了对C++11线程库的完整参考。

《C++并发编程实战》适合需要深入了解C++多线程开发的读者,以及使用C++进行各种软件开发的开发人员和测试人员。对于使用第三方线程库的读者,您还可以从本书后面的章节中学习相关指南和技术。同时本书也可以作为C++11线程库的参考书。

C++结合了三种不同的编程方式:以C语言为代表的过程式语言,以C++在C语言基础上增加的类所代表的面向对象语言,以及C++模板支持的泛型编程。使用 C++ 的原因之一是利用其面向对象的特性。要利用此功能,您必须对标准 C 有扎实的了解,该标准提供了基本类型、运算符、控制结构和语法规则。因此,如果您已经了解 C,则可以学习 C++,但不仅仅是学习更多的关键字和结构,从 C 过渡到 C++ 与从头开始学习 C 一样大。另外,如果你已经先掌握了C,那么在过渡到C++的时候一定要摒弃一些编程习惯。如果你不会 C 语言,学习C++需要掌握C语言知识、OOP知识和泛型编程知识,但不需要放弃任何编程习惯。如果您认为学习 C++ 可能需要扩展您的思维,那您是对的。

C++的起源

与 C 一样,C++ 诞生于贝尔实验室,Bjarne Stroustrup 在 1980 年代开发了该语言。用他自己的话说,“C++ 主要是为了让我和我的朋友们不用再用汇编语言、C 语言或者其他现代高级语言来编程。它的主要作用是让写好程序,让每个程序员更快乐。”

Bjarne Stroustrup 主页

Bjarne Stroustrup 设计并实现了 C++ 编程语言,并且是权威参考手册“C++ 编程语言”和“C++ 的设计和演变”的作者。读者应将他在 AT&T Labs Research 的个人网站添加为首选 C++ 书签:

http://www.research.att.com/-bs/

该站点包含一段有趣的 C++ 语言开发历史、Bjarne 的传记资料和 C++ 常见问题解答。Bjarne 最常被问到的问题是:Bjarne Stroustrup 应该如何阅读。您可以访问 Stroustrup 的网站,阅读常见问题解答部分并下载 .WAV 文件以亲自聆听。

Stroustrup 更关心 C++ 的实用性,而不是实现特定的编程原则或风格。在识别 C++ 语言特性时,真正的编程需求比纯粹的原则更重要。Stroustrup 之所以在 C 的基础上创建 C++,是因为 C 语言简洁,适合系统编程,应用广泛,与 UNIX 操作系统密切相关。C++ 的 OOP 方面受到计算机模拟语言 Simula67 的启发。Stroustrup 为 C 添加了 OOP 特性和通用编程支持,但没有对 C 组件进行重大更改。因此,C++ 是 C 语言的超集,这意味着任何有效的 C 程序都是有效的 C++ 程序。它们之间有一些细微的差异,但它们是微不足道的。C++ 程序可以使用现有的 C 软件库。库是可以从程序中调用的编程模块的集合。库为许多常见的编程问题提供了可靠的解决方案,从而为程序员节省了大量的时间和精力。这也促成了 C++ 的广泛传播。

图片[1]-入门推荐C++PrimerPlus第6版中文版习题解答经典教程-老王博客

图1.2 C++的对偶性

C++这个名字来源于C语言中的自增运算符++,它将一个变量加1。C++这个名字表明它是C的扩展版本。

计算机程序将实际问题转化为计算机可以执行的一系列动作。OOP部分赋予C++语言连接问题所涉及概念的能力,C部分赋予C++语言紧密连接硬件的能力(见图1.2),结合这种能力实现了这促成了 C++ 的广泛传播。当从程序的一个方面转移到另一个方面时,思维方式也发生了变化(确实,一些 OOP 正统观点认为,在 C 中添加 OOP 特性就像给猪加翅膀一样,虽然这是一个噱头 瘦的,很能干的猪

Stroustrup 只是在一定程度上 C++ 成功之后才添加模板,这使得泛型编程成为可能。在模板特性被使用和改进之后,人们逐渐意识到它们和OOP一样重要——甚至比OOP更重要,但也有人不这么认为。C++融合了OOP、泛型编程和传统的过程式方法,表明C++强调实用价值而不是思想上的方法,这也是该语言成功的原因之一。

C++的开发

Stroustrup 的 The Programming Language 是一本 65 页的参考手册,成为 C++ 最初的事实标准。

下一个事实上的标准是 Ellis 和 Stroustrup 的 The Annotated C++ Reference Manual。

C++98 标准有大量新特性,将近 800 页长,包含的描述很少。

C++11 标准长达 1,350 页,对旧标准做了很多补充。

如何学习C++?

我不会 C 或 C++,我应该先学习 C 吗?不,先学C++。C++ 的 C 子集对于 C/C++ 的新手来说更容易学习,并且比 C 本身更容易使用。原因是 C++(具有强类型检查)提供了比 C 更好的保证。此外,C++ 还提供了许多小特性,例如 operator new,它们比 C 对应物更方便且不易出错。这样,如果你打算学习 C 和 C++(而不仅仅是 C++),你不应该走 C 的弯路。为了很好地使用 C,你需要知道很多技巧和技术,而这些东西在 C++ 中的任何地方都不像在 C 中那样重要或常用。好的 C 教科书倾向于(并且合理地)强调将来你需要用 C 语言完成完整的大型项目所需的各种技术。好的 C++ 教科书是不同的,强调将引导您进行数据抽象、面向对象编程的技术和特性。了解 C++ 的各种结构,然后学习它们的(较低级别的)C 替代方案将很容易(如果需要)。

至于我的偏好:要学习 C,请使用 [Kernighan, 1988];要学习 C++,请使用 [2nd]。这两本书的优点在于它们结合了两件事:一方面是对语言特征和技术的指导性描述,另一方面是完整的参考手册。两者都描述了各自的语言而不是具体的实现,也不打算描述附带具体实现的具体库。

那里有许多好的教科书和许多不同风格的材料,以上只是我理解概念和风格的偏好。谨慎选择至少两种信息来源以弥补可能的片面性甚至缺陷总是明智的。

我想做OOP,所以在学习C++之前我应该​​先学习Smalltalk吗?不,如果您打算使用 C++,请学习 C++。各种语言,如 C++、Smalltalk、Simula、CLOS 和 Eiffel,对抽象和继承等关键概念都有自己的看法,每种语言对这些概念的支持方式略有不同,设计理念也不同。学习 Smalltalk 肯定会教你很多有价值的东西,但它不会教你如何使用 C++ 编程。事实上,除非你有足够的时间来学习和消化 Smalltalk 和 C++ 的概念和技术,否则使用 Smalltalk 作为学习工具会导致糟糕的 C++ 设计。

当然,如果同时学习 C++ 和 Smalltalk 可以让你在更广泛的领域获得经验和例子,那就再好不过了。但是无法花足够时间消化所有新概念的人往往最终会“用 C++ 编写 Smalltalk”,即使用不太适合 C++ 的 Smalltalk 设计概念。以这种方式编写的程序可以像 C 或 C++ 中的 Fortran 一样编写,这远非最好的事情。

学习 Smalltalk 的一个常见原因是它是“纯粹的”,因此迫使人们以“面向对象”的方式思考和编程。除了提及它之外,我不想太深入地探讨“纯粹”的问题。我认为通用编程语言应该并且可以支持不止一种编程风格(范式)。

这里的问题是适用于 Smalltalk 并得到很好支持的风格不一定适用于 C++。特别是,模仿性地遵循 Smalltalk 风格会在 C++ 中产生低效、丑陋和难以维护的 C++ 程序。原因很简单,需要设计好的 C++ 程序来利用 C++ 静态类型系统,而不是对抗它。Smalltalk (仅)支持动态类型系统,并且将此视图转换为 C++ 会导致广泛的不安全和丑陋的转换。

我认为 C++ 程序中的大多数类型转换是设计不佳的标志。有些演员表是非常基本的,但大多数都不是。根据我的经验,传统的 C 程序员使用 C++,而通过 Smalltalk 了解 OOP 的 C++ 程序员是使用强制转换最多的人,而那些通过更仔细的设计可以避免的强制转换。

此外,Smalltalk 鼓励人们将继承视为组织程序的唯一或至少最基本的方式,并鼓励人们将类组织成只有一个根的层次结构。在 C++ 中,类是类型,而不是组织程序的唯一方式。特别是,模板是表示容器类的最基本方式。

我也非常怀疑人们需要被迫以面向对象的风格编写程序的断言。如果人们不想学习,你就无法在合理的时间内教他们。以我的经验,真正愿意学习的人从来都不缺,最好把时间和精力花在他们身上。除非你能掌握如何表示数据抽象和面向对象编程背后的原则,否则你所能做的就是滥用支持这些概念的语言特性,并且以不恰当的“巴洛克”形式[2]——无论是 C++、Smalltalk 还是任何其他语言。

请参阅 The C++ Programming Language (2nd Edition) [2nd],尤其是第 12 章,了解更多关于 C++ 语言特性和设计之间关系的讨论。

我应该将 C++ 作为一种 OOPL 还是作为一种更好的 C 语言开始?这取决于。为什么要开始使用 C++?这个问题的答案应该决定你处理 C++ 的方式,这里没有一刀切的。以我的经验,最安全的方法是自底向上学习C++,即先学习C++提供的传统过程式编程特性,即C的更好的子集;然后学习使用和遵循这些数据抽象;后来学习使用类层次结构来组织相关类的集合。

在我看来,过早地完成早期阶段是危险的,很可能会忽略一些重要的概念。

例如,有经验的 C 程序员可能会认为 C[3] 的更好的 C 子集“非常熟悉”,因此会跳过描述这一点的教科书的前 100 页或更多页。但是在这样做的过程中,C 程序员可能没有看到关于函数重载能力的解释、对初始化和赋值之间的区别、使用 operator new 进行存储分配、对引用的解释,也许还有其他一些解释。小功能。它们会在后期不断出现并困扰您,而一些真正的新概念正在复杂的问题中发挥作用。如果知道更好的 C 中使用的概念,阅读这 100 页可能只需要几个小时,其中一些细节很有趣且有用。如果您不阅读它,可能需要更多时间。

有些人担心这种“循序渐进的方法”会导致人们永远编写 C 风格的东西。这当然是一个可能的结果,但从百分比来看c语言从入门到精通扫描版,很难说这样做比在教学中使用“纯”语言或强制手段更不可信。关键是要认识到,要将 C++ 用作数据抽象和/或面向对象的语言,您应该了解几个与 C 或 Pascal 等语言没有截然相反的新概念。

C++ 不仅仅是用新语法表达旧概念——至少对大多数程序员来说不是。这意味着需要教育,而不仅仅是培训。新概念需要通过实践来学习和掌握。需要重新评估久经考验的旧工作习惯。与其以“旧的传统方式”一蹴而就,必须考虑新的方式——通常用新方式做事肯定比老方式更难,尤其是第一次做的时候,也更费时间。

许多经验表明,对于大多数程序员来说,学习关键数据抽象和面向对象技术的时间和精力是极其宝贵的。产生效益不一定要花很长时间,一般3到12个月。只使用 C++ 而不是那种努力会是有益的,但最大的好处来自于努力学习新概念之后——我的问题是,如果有人不想花费这种努力,为什么要切换到 C++。

在您第一次接触 C++ 或在很长时间后第一次接触它时,请花一点时间阅读一本好的教科书或几篇精选的文章(在 The C++ Report 和 The C++ Journal 中)。有很多这样的文章)。您可能还想查看一些主要库的定义和源代码,并分析其中使用的概念和技术。对于已经使用 C++ 一段时间的人来说,这也是一个好主意,在重新审视这些概念和技术的过程中还有很多工作要做。自 C++ 首次出现以来,C++ 语言以及与之相关的编程和设计技术发生了很多事情。对 The C++ Programming Language 第 1 版和第 2 版的简单比较足以让人们相信这一说法。

学习C++需要多长时间?也要看情况。取决于您的经验以及“学习 C++”的含义。对于大多数程序员来说,学习语法并以更好的 C 风格编写 C++,再加上定义和使用一些简单的类,只需要一两个星期。这是简单的部分。主要难点是掌握新的定义和编程技术,这是最有趣和最有价值的部分。与我交谈过的大多数有经验的程序员都说,他们需要半年到一年半的时间才能真正熟悉 C++ 并掌握它支持的数据抽象和面向对象技术。这里假设他们在工作中学习并维护生产——通常同时也以一些“不那么大胆”的 C++ 风格进行编程。如果您可以将所有时间都花在学习 C++ 上,那么您可能会更快地习惯它。然而,如果没有将新的想法和设计应用于实际项目,这种改编也可能具有欺骗性。面向对象的编程和面向对象的设计基本上是实践训练而不是理论训练。仅仅将它用于一些类似玩具的小例子,这些想法很可能会演变成一种危险的趋势。

请注意c语言从入门到精通扫描版,学习 C++ 基本上是关于学习编程和设计技术,而不是语言细节。写完一本教科书,我会推荐一本关于设计的书,比如[Booch, 1991][4],里面有5种语言(Ada、CLOS、CLU、C++、Smalltalk和Object Pascal)的例子稍长,这样就可以在一定程度上避免语言不容忍,而这种语言不容忍已经搞砸了许多设计讨论。本书中我最喜欢的部分是描述设计概念和示例的章节。

关注它的设计方式与非常关注 C++ 的定义细节(例如 ARM,它包含很多有用的信息,但没有关于如何用 C++ 编程的信息)有很大不同。专注于细节很容易让人头晕目眩,根本无法使用语言。您可能不会尝试从字典和语法中学习外语,对吗?

学习 C++ 时,必须牢记关键设计概念,以免迷失在语言的技术细节中。如果你能做到这一点,学习和使用 C++ 会非常有趣和有益。与C相比,一点点C++就能带来不少收获。投入更多精力去理解数据抽象和面向对象技术,你会从中得到更多。”

这种观点也不全面,并且受工具和库的当前状态的影响。借助更具保护性的环境(例如包括广泛的自动运行时检查)和定义良好的小型基础库,您可以更早地大胆使用 C++。这些将更好地支持从关注 C++ 的语言特性到关注 C++ 支持的设计和编程技术的重大转变。

将一些兴趣传播到语法中并花一些时间在语言的技术细节上也非常重要。一些资深程序员喜欢摆弄这些细节。这种对学习新编程技术的兴趣和不愿学习通常很难辨别。

同样,每门课程和每一个项目中都有一些人根本不相信 C++ 特性是负担得起的,因此坚持使用 C 的子集,他们在以后的工作中更加熟悉和信任。关于单个 C++ 特性和用 C++ 编写的系统的执行效率的数据很少(例如,[Russo, 1988]、[Russo, 1990]、[Keffer, 1992]),因此不太可能影响这些人从长远来看,坚定地认为比 C 更方便的机制是不可能的。看到这种宣传的数量与语言或工具领域未兑现的承诺的数量相比,人们应该对这种说法持怀疑态度,并要求提供更明显的证据。

在每门课程和项目中,总会有另一种类型的人相信效率并不重要,并且倾向于以更通用的方式设计系统,即使在最先进的硬件上也会导致明显的延迟。不幸的是,当人们在学习 C++ 的同时编写玩具程序时,很难观察到这种延迟,因此这种性质的问题通常要等到遇到真正的项目时才会出现。我一直在寻找一个简单但实​​用的问题,如果以过于笼统的方式解决,可能会破坏一个好的工作站。像这样的问题将使我能够证明有偏见的设计对极端乐观主义者的价值,并且经过深思熟虑,这可以大大提高对过于谨慎和保守的人的表现。

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论