web-dev-qa-db-ja.com

C#からC ++への移行、およびヒント?

私はしばらくC#を使用しています。私のキャリアをさらに伸ばし、プログラミングの知識を拡張するために、C++に入りたいと思っています。 C#は非常に便利で、すぐに使用できますが、私のチームと私は大規模なプロジェクトを作成する予定であるため、いくつかの理由で下位言語での作業を検討する必要があります。ほとんどの企業は、高いパフォーマンスと移植性のためにC/C++を使用しています。もちろん、C#CC++に比べて必ずしも悪いわけではありませんが、私はジョブごとに異なるツールを用意することを好みます。

C++は低レベルの言語であり、マシンコードであり、メモリ管理がないため、私はC++を読むのがより困難です。しかし、それがマシンコードであるという事実は、消費されるメモリの量も削減します。この言語は扱いが難しいですが、ある意味、強力な言語になっています。高速で効率的なマシンコードに作られましたが、「マシンに近いので」理解と学習が難しくなっています。


私は決心し、C++を学びたいので、学習中に覚えておくべきいくつかのヒントはありますか?悪い習慣に陥らないようにして、後で破るのではなく、申し訳ありませんが安全です。

私は記載されたリソースを使用する予定です ここ が、個人的な推奨事項、書籍、またはオンラインガイド、できればC#について十分な知識を持っている人が簡単に理解できるものを優先します。

7
Dave

私は実際にはC++からC#へと逆に行きました。私は本当にC++のコンテキストで良いOOデザインに歯を切らしているので、私はこれについて大丈夫だと話せると思います。

チップ:

  • C#とは異なり、C++はlong時間存在していました。 70年代以来。このように、「良いC++」を構成するものは、誰に尋ねるか、いつC++の記述に関与したか、およびどの本を読んだかによって異なります。 Bjarne StroustrupのC++プログラミング言語は4回改訂され、初版の300ページの本から、第4版の1500ページの本になりました。簡単に言うと、言語の存続期間を通じて多くのことが変更されたため、問題を解決する方法に関する多くの歴史と意見があります。 C++ 11でも同じことが多く行われます。
  • ポインタの使用方法と、ポインタの用途について学びます。可能であれば、ポインタを使用してハードウェアを直接操作してみてください。
  • C++でのメモリ管理は、RAIIと呼ばれる優れた手法を使用して管理されることがよくあります。 StackOverflowの名声のジャフには、これに関する優れた記事があります RAIIの意味 。また、shared_ptr、auto_ptr、および「スマートポインター」ファミリーの他のポインターの使用についても学びます。これらの手法を使用すると、メモリ管理の問題が発生するのを防ぐことができます。
  • 上記の手法を使用しても、いくつかのメモリ管理の問題が発生する可能性があります。この場合、 valgrind は、使用方法を知るのに非常に役立ちます(特にmassif-massifと、私たちが一部のコードではファンキーな方法でweak_ptrsを使用していました)。
  • C++には、(C#設計者が言語設計で回避しようとした)紛らわしい構文規則がいくつかあります。これらの規則の多くは、注意深く従わないと、紛らわしい結果が生じる原因になります。たとえば、通常const className&関数パラメーターの入力タイプとして-これには非常に詳細で非常に詳細な理由があります。 Marshall Clineの C++ FAQ は、このために非常に貴重です。
  • C++には多くの機能、柔軟性、およびパワーがありますが、これは良いことですが、多くの場合、ガーデンパスの選択が新しいユーザーにとって最適ではありません。つまり、注意しないと、コードは恐ろしいものになります。これを理解し、私のコードがいかにくだらないか、なぜ私が悪いコードレビューを受けているのかを理解するのに私は18か月かかりました。優れたコードを作成するには、C++でインターフェースを書くことを学ぶこと(ヒント:抽象基底クラスが何であるかを調べる)が重要です。 C#ランドで学んだ優れた概念とプログラミング構成を、可能であればC++ランドに複製することを恐れないでください。
  • テンプレートベースのプログラミングについて学んでください。その長所と短所、およびC#ジェネリックとの違いについて学びます。
18
J. Polfer

これはオープンエンドネスのために閉じられる可能性がありますが、うまくいけば、このヒントが十分に重要であり、議論の余地なく十分に役立ちます。

所有権に注意してください。

C#(および自動メモリ管理を備えた他の言語)では、変数を所有するオブジェクトが少しあいまいになる可能性があります。イベントはハンドラーを所有しますか、それともイベントの「キャッチャー」を所有しますか? C#では、それは本当に重要ではありません。 C++では、ハンドラーの所有者がknowでなければ、プログラムは恐ろしい、恐ろしい(そしてしばしば微妙な)死を迎えます。

これは、プログラムを設計する方法の主な違いであり、注意深く非常に注意しないと、微妙な方法で現れます。あなたがする必要がある最も重要な移行であるものを誰が所有するかについて設計することを学ぶので、それに早く集中してください。

8
Telastyn

C++(低水準言語)を記述するために使用している言語と、不正確であると解釈されるため、技術的説明(マシンコード)のいくつかにも少し注意する必要があると思います。

次に、なぜ新しい言語を学びたいのかを理解する必要があります。多くの企業がC/C++を使用しており、多くがJavaを使用しており、多くの企業がPerlとPythonとScalaと。 ..(一部はFortranを使用している場合もあります。特定の会社、セクター、またはプロジェクトを念頭に置いている可能性がありますか?それが純粋に雇用上の理由である場合、証明可能な経験を得る方法がない限り、私は警告します(私は私の暇な時間のプロジェクトをインタビューの経験として使用してください)興味のあるものを選んでください、多分それはOOではないでしょう;あなたは長期的にはそれでより良くなるでしょうそれから本当の興味を持つことです。次に、コードを公開して、それがどうなるかを確認し、進行中に質問をします。C++の場合、特にメモリ管理をしたい場合は少し時間がかかります!

2
JohnMark13