C ++ '11が承認された場合、C ++初心者が言語を学習する方法は変わりますか?[閉まっている]


21

私はしばらくの間C ++を学びたかったので、高校でAPコンピュータプログラミングを受講しました(JavaではなくC ++だった頃)。私はCを楽しんでいて、C ++を学ぶ時間を見つけていないか、生産性の高いC#に頼るだけです。

私の質問はこれです:C ++ '11が承認されていることを考えると(完全には実装されていませんが)、これはC ++の学習に取り組むべき方法を変えますか?C ++:The Complete Reference By Herb Schildtを1998年から所有しています。新しく承認された標準は、そのような本からの学習を標準からのものを含むいくつかの新しいチュートリアル/本よりも重要ではありませんか?古い本から学ぶことの利点はありますか?


9
おー シルト。私は彼のC ++素材の品質について話すことはできませんが、彼のC素材は長い間標準以下でした(C:TCRの最新版でさえ、いくつかの重要なエラーがあります)。別の著者による最新の作品を探すことをお勧めします。
ジョンボード

C ++ 11は、最新のリビジョンで導入され、C ++の以前のバージョンには存在しないものを実行するために学習する必要があるC ++の基本を変更しませんでした。
ラムハウンド

11
ハーブシルトの本を決して信用しないでください。実際、C ++の大部分の本には悪い本がありますが(ここでは文体的な問題には言及していませんが、バグのあるコードにつながることがよく知られている明白な事実上のエラーとプログラミングスタイルの宣伝)、Schildtの本は非常に悪いです、彼の名前はややミームになりました。
-sbi

4
@ラムハウンド:私は同意しません。それが本当だった場合、私たちはまだ最初に手動リソース管理を学び、それから動的リソースを行うより安全な方法を学びます。ありがたいことに、これは(ゆっくりと)変化しています。新しい可能性は、たとえそれらがライブラリで「唯一」であっても、新しいイディオムを必要とします。言語から始めて、なぜ古いイディオムを最初に学び、後でそれらを学ばなければならないのですか?
sbi

回答:


16

絶対に。最近では、通常レッスン2にある3つのことは、ずっと後に移動するはずです。

  • char *、strlen、strxxxメソッドなどの配列としての文字列
  • 一般的な配列とポインター演算
  • あなたが新しいものを削除、[[]あなたが新しい[]、そしてデストラクタさえ削除

通常レッスン99にあるこれらのことは、ずっと早く動くはずです。

  • 使用するものとしてのテンプレート(書き込みではなく)
  • std :: string
  • std :: shared_ptr <>
  • std :: vector <>、イテレータ、その他のコレクション

Eveyの生のポインタはすぐにスマートポインタラッパーに渡されます(std :: moveと右辺値の参照を説明する必要があるので、共有から始めて後で一意であると考えます)。これを行うと、C ++の学習はJavaまたはC#の学習に似た感じになり、言語と同時にライブラリを学習できます。それはまた、多くの記憶作業を奪い、人々が落とし穴を心配することを少なくします。

また、コレクションを反復処理して各要素に何かを実行したいときに初めてラムダを使用します。

免責事項:私は現在、PluralsightのC ++コースを書いており、このアプローチを使用しています。最後のモジュールは「他の人のコードを理解する」ことです。そこで、char *文字列、手動メモリ管理、ポインタ演算などの混乱を招くものを配置します。

更新: C ++ 0xの存在が、C ++ 03で教えることができたものを教えることに影響を与える理由を尋ねた人々がいます。私はそれがいくつかのことだと思う:

  • コレクションに優しい真にスマートなポインターは、常に新しい/削除、ポインター演算などに頼っていた「従業員ポインターの配列」のようなものの必要性を取り除きます。
  • autoはイテレータ宣言の痛みを取り除きます
  • ラムダは、普通の人が行うようなforeachingを行います
  • 構文解析のように些細な>>ことでも、テンプレートのテンプレートを宣言するときにそこにある落とし穴を排除します
  • 等々

私の見方では、C ++を教える方法については少し前に変更できたかもしれませんが、フォールバックのために昔ながらの方法が必要だったため、またはそれを教えることは多くのことを含んでいたため、不可解な知識の。


3
手動のメモリ管理は後で教えられるべきだと思うのはなぜですか?知っておくことが重要だと思いますし、スマートポインターを学習する際に感謝の気持ちが増します。私はCでメモリ管理(およびchar配列)を学ばなければならなかったので、RAIIとstd :: stringを理解する必要がありました。
ジェッティ

1
あなたの例は、C ++ 03対C ++ 11ではなく、C ++ 98対先行標準C ++に主に適用されます。与えられたラムダは、std::for_each()以前よりもずっと人気があり、auto非常に重要であり、新しい関数宣言構文(と組み合わせてdecltype)はテンプレートコードで非常に多く使用されるようになると思います。これらは、現在のC ++の本が教えていないことです。しかし、はい、一般的に私はあなたに同意します(+1)。C ++コースを提供し始めたとき、私はAccelerated C ++から始めました。私のコースがそれからますます逸脱し始めたとしても、それは基本的な原則に依然として当てはまります。
-sbi

3
@Jetti:手動でリソース管理を行うことはめったにありませんが、そうする場合は、RAIIクラスを実装するためのものです。ただし、これらのクラスの多くは使用します。それによると、RAII の使用は生のリソースを扱うよりも重要であるように思われるため、より重点を置いて早期に教える必要があります。
-sbi

1
@sbi:そこに同意する必要があります。これらの例のほとんどは2006年のModern C ++ 101のようで、C ++ 11の新しいものではありません。
DeadMG

2
@Jetti:C ++をマスターするための最も重要なステップは手動のメモリ管理を回避できるすべての方法を学ぶことです。「自動」メモリ管理をどこまで進めることができるかを学んだら、それは絶対に「後で」教えられるべきものです。
11

9

はい、そうです。簡単な事実は、C ++ 98および03では、関数型プログラミングなどの言語サポートの質が低いため、多くの優れた手法が基本的に使用できなかったことです。ラムダが存在して動作するようになった今、人々は以前よりもはるかに機能的なインターフェースを受け入れる傾向があり、汎用プログラミングは以前よりもさらに強力になりました。

1998年、人々はC ++を使用して高品質で安全な高速コードを記述する方法を発見し始めたばかりで、多くのコードは「C was Classes」でした。C ++ 11では、それは非常にdifferent-コピーおよびスワップと(今ファイブ)三のルールのようなイディオム、よく知られており、定義されており、種類を管理する、より多くのリソースが標準のようになってきただshared_ptrunique_ptrどこ以前の規格は、単にそれらを左にぽっかり穴として。

C ++の参考資料の優れたリストについては、この質問をご覧ください。


1
実際、1998年より数年早く「C with classes」の終わりの始まりを付けましたが、一般的には確かにあなたは間違いなく、私は半10年以上苦しみません。+1私から。
-sbi

4

あなたが言及した特定の本は知りません。しかし、一般的に言うと、C ++の構文、データ型、およびOOPに関するすべての基本はまだ当てはまると言えます。ほとんどの初心者の本で言及されているSTLライブラリについても同じことが言えます。

1998年以降の古い本では、C ++プログラミングスタイルのいくつかの更新と開発が見落とされていたかもしれませんが、それは長年にわたってコミュニティに蓄積されてきました。少し最新のリソースを探します。十分な無料のオンラインチュートリアルとドキュメントが用意されています。それらのいくつかは、C ++ 0xに言及することさえあります。

C ++ 0xは、プログラマーが将来この言語をどのように見て使用するかについて、確実に大きく変わるでしょう。しかし、これは新しい機能が意味を持ち始めるより複雑なプロジェクトに影響を与えます。初心者にとってはこれは問題ではなく、既存の概念に慣れることに集中できます。これで既に学習できます。たとえば、ほとんどの初心者の本はテンプレートに深く入り込んでいないため、新しい可変個引数テンプレートは今知っておく必要のあるものではありません。

おそらく変更点のリストをご覧ください範囲ベースのforループなどの少なくともいくつかの概念は、初心者でも新しいチュートリアルに登場する可能性が高いでしょう。だから、見てみる価値があります。


ありがとう!あなたはオンラインまたは本でまともなリソースを知っていますか?
ジェッティ

2
いいえ、cplusplusサイトは、良いコードを実際に書きたい人には決して参照されるべきではないリソースとしてしばしば言及されます。
DeadMG

@DeadMG別のウェブサイトはありますか?
TheLQ

@TheLQ:MSDNリファレンス、またはでさらに詳しく説明しcprogramming.comます。
-DeadMG

@Jetti:C ++ 11を使用してC ++を教えるための資料を知りません。私が見たものはすべて、C ++ 03に加えてC ++ 11を教えています。後者については、stackoverflow.com / questions / 388242 /…をご覧ください。
-sbi

3

もちろん、関連する技術に関しては、最新の素材で最新であることは常に賢明な動きですが、C ++ 11で導入された変更は、ボートを揺さぶらないように設計されています。C ++(またはプログラミング全般)を初めて使用する場合、これは私が心配することではありません。

さらに、プロのプログラマーであれば、将来誰か他の人のコードに取り組むことは間違いないので、実際には価値の低い手法であっても、物事の仕組みを理解することには常に価値があります。


ご回答いただきありがとうございます。古いリソースを使用している場合、少なくとも古いコードを確認するのに役立つと考えました。
ジェッティ

ラムダ、、autoおよび非同期関数の実行は、「ロックザボート」以外の何を行うことができますか?
-sbi

1
新しいツールの導入とデザイン哲学の広範な変化(たとえば、PHPで見られるように)との間には違いがあると主張します
。-レオ

1
@leo:私は同意しません。STL、スマートポインター、および豊富なテンプレート機能の導入により、C ++の主流の設計哲学が完全に変わりました。ほぼすべてのブーストライブラリは、90年代の平均的なC ++ライブラリとはまったく異なります。
sbi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.