鉴于已批准C ++ '11,这会改变C ++初学者学习语言的方式吗?[关闭]


21

我想学习一段时间的C ++,并在高中学习了AP Computer Programming(当时是C ++而不是Java)。我喜欢C语言,却没有时间学习C ++,否则我会回到C#那里,我的工作效率更高。

我的问题是:鉴于C ++ '11已获得批准(尽管我知道尚未完全实现),这是否会改变我学习C ++的方式?我拥有1998年的C ++:Herb Schildt的《完全参考》。新批准的标准是否使从此类书籍中学习比某些包含该标准内容的较新教程/书没有那么重要?从旧书中学习有什么好处吗?


9
钱币。希尔德 我不能说他的C ++资料的质量,但是他的C资料在很长一段时间内都是次标准的(即使最新版本的C:TCR仍然有一些不平凡的错误)。我建议您寻找其他作者的最新作品。
约翰·博德

C ++ 11并没有改变C ++的基础知识,以便执行最新版本中引入的任何内容,而C ++的早期版本中不存在这些内容,因此必须学习这些知识。
Ramhound

11
永远不要相信Herb Schildt的书。确实,尽管大多数C ++书籍都是不好的书(我在这里不是指样式问题,而是公然的事实错误和众所周知的导致编程错误的编程风格),但Schildt的书却非常糟糕,他的名字有点模因。
2011年

4
@Ramhound:我不同意。如果的确如此,我们仍然会先学习手动资源管理,然后再学习使用动态资源的更安全方法。幸运的是,这是(缓慢的)变化。新的可能性,即使它们在库中是“唯一的”,也要求新的习惯用法。如果您从一门语言开始,为什么先学习较早的习语,而后又不必学习它们呢?
2011年

Answers:


16

绝对。这些天,通常在第2课中出现的三件事应该移动很多,要晚得多:

  • 字符串,形式为char *,strlen,strxxx方法等的数组
  • 一般数组和指针运算
  • 删除您的新内容,删除[]您的新内容[],甚至是析构函数

通常在第99课中出现的这些内容应该早得多移动

  • 模板作为要使用的东西(写的不多)
  • std :: string
  • std :: shared_ptr <>
  • std :: vector <>,迭代器,其他集合

Evey原始指针应立即提供给智能指针包装器(我将从共享开始,稍后再考虑唯一性,因为它需要解释std :: move和rvalue引用)。这样做将使学习C ++的感觉很像学习Java或C#,在那里您可以同时学习该语言和库。它也将占用大量的内存工作,并使人们不必担心陷阱。

我也想在我们第一次遍历一个集合并对每个元素做一些事情时,将lambda应用于图片。

免责声明:我现在正在使用Pluralsight编写C ++课程。最后一个模块是“理解别人的代码”,在这里我将放置诸如char *字符串,手动内存管理,指针算术等令人困惑的内容。

更新:一些人问为什么C ++ 0x的存在会启发人们用C ++ 03可以教的东西。我认为这是很多事情:

  • 真正的智能指针,易于收集,消除了对“员工指针数组”之类的需求,这些东西使我们始终依赖于新建/删除,指针算法等
  • auto消除了迭代器声明的痛苦
  • Lambda使普通人可以做的事情
  • 即使>>正确解析这样琐碎的事情也消除了在声明一些模板模板时可能存在的陷阱
  • 等等

我的看法是,前一段时间我们在讲授C ++的方式上可能有一些变化,但是我们当中有些人因为我们仍然需要传统的回退方式而退缩,或者因为讲授它涉及的内容很多奥秘的知识。


3
您为什么觉得以后应该教手动内存管理?我认为了解这一点很重要,并且在学习智能指针时会给予更多的赞赏。我不得不学习C语言中的内存管理(和char数组),这使我更加欣赏RAII和std :: string,这比我认为的话要多得多。
杰蒂2011年

1
您的示例主要适用于C ++ 98与标准C ++,而不适用于C ++ 03与C ++ 11。我想给定的lambda std::for_each()将会比以前流行得多auto,并且非常重要,并且新的函数声明语法(与结合使用decltype)将在模板代码中大量使用。这些都是当前的C ++书所没有的东西。但是,是的,总的来说,我同意您(+1)的意见。当我开始开设C ++课程时,我从Accelerated C ++开始,尽管我的课程开始越来越偏离它,但它仍然适用于基本原理。
2011年

3
@Jetti:我很少做手动资源管理,如果可以的话,它是用于实现RAII类的。但是,我确实使用了许多此类。因此,使用 RAII的东西似乎比处理原始资源更重要,因此应该更早地进行教授,并更加强调。
2011年

1
@sbi:我必须同意你的看法-这些例子中的大多数似乎都来自2006年的Modern C ++ 101,而C ++ 11则没有什么新意。
DeadMG

2
@Jetti:掌握C ++的最重要步骤是学习避免手动内存管理的所有方法。一旦您了解了可以进行“自动”内存管理的程度,就绝对应该“稍后”教它们。
jalf

9

是的,是的。一个简单的事实是,在C ++ 98和03中,由于诸如函数式编程的语言支持质量较差,因此许多良好实践根本上是无法使用的。现在,lambda已经存在并且可以工作,人们倾向于接受功能性接口的能力比以前好得多,并且通用编程甚至比以前更强大。

1998年,人们才刚刚开始发现如何使用C ++编写高质量,安全,快速的代码,而很多代码就是“ C是类”。在C ++ 11,这是非常不同-成语比如复制和交换和三(现五)的规则是众所周知的定义,以及更多的资源管理类型已经成为标准,像shared_ptrunique_ptr在以前的标准只是给他们留下作为大洞。

您可以查看此问题,以获得有关C ++的参考资料的出色清单。


1
实际上,我会比1998年提前几年开始“带类的C”的结尾,但是总的来说,您肯定是对的,而且我也不会花费超过五年的时间。+1从我。
2011年

4

我不知道您提到的具体书。但总的来说,您可以说,关于C ++语法,数据类型和OOP的所有基础知识仍然适用。大多数初学者书籍中提到的STL库也应如此。

尽管一本书的历史可以追溯到1998年,但可能错过了C ++编程风格的一些更新和发展,但这些年来积累了很多。我会寻找更多最新资源。有足够多的免费在线教程和文档为您提供一个良好的开端。其中一些甚至可能提到C ++ 0x。

C ++ 0x肯定会在将来改变程序员如何看待和使用该语言。但这会影响更复杂的项目,在这些项目中新功能才有意义。对于初学者而言,这无关紧要,您可以集中精力熟悉现有的概念,这已经足够学习。例如,大多数初学者的书都没有深入介绍模板,因此您现在不需要了解新的可变参数模板。

也许看看变化清单。至少有一些概念(例如基于范围的循环)很可能会出现在新教程中,即使对于初学者也是如此。因此值得一看。


谢谢!您是否偶然知道网上或书籍中有任何体面的资源?
杰蒂2011年

2
不,cplusplus网站经常被当作一种资源,永远不要被任何您希望实际编写好的代码的人引用。
DeadMG

@DeadMG您有其他网站吗?
TheLQ 2011年

@TheLQ:您可以使用MSDN参考或进一步了解cprogramming.com
DeadMG 2011年

@Jetti:我不知道使用C ++ 11教C ++的任何材料。我所看到的一切都在C ++ 03之上教授C ++ 11。要了解后者,请访问stackoverflow.com/questions/388242/…
2011年

3

当然,对于任何与技术相关的事物,始终使用最新材料始终是明智之举,但是,C ++ 11中引入的更改并不是为了顺其自然。如果您不熟悉C ++(或一般编程),那么我就不必担心。

此外,如果您是专业的程序员,那么您可以打赌将来会使用别人的代码,因此即使工作中折旧的技术,了解事物的工作方式也总是有价值的。


感谢您的答复,我认为这至少可以帮助我在使用旧资源时查看旧代码。
杰蒂2011年

lambda,auto和异步函数执行除了“摇摇欲坠”之外,怎么做?
2011年

1
我认为新工具的引入与设计理念的广泛转变(例如,我们在使用PHP时)之间是有区别的
leo

1
@leo:我不同意。STL,智能指针和丰富的模板功能的引入完全改变了C ++的主流设计理念。几乎每个 boost库都与90年代的普通C ++库完全不同。
2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.