C#開発者向けのC ++


24

私はC#をかなりよく知っているので(残念ながら独学で)、Windowsアプリケーション用にC ++プログラミングを行う必要があります。私は、C#を学習しているC ++開発者向けに多くの情報を見つけることができましたが、C#を既に知っているときには、C ++を学習することについて多くを見つけることができませんでした。誰かが基本の良い概要に出くわしましたか?

MSDNには比較がありますが、それほど詳細ではありません。

私はいくつかのソースをつなぎ合わせることができますが、何かがそこにあると考えました-私はそれを見つけることができません。ご協力いただきありがとうございます。


27
なぜ「悲しい」のですか?そのように自分を落ち込まないでください。私は独学ではない C#開発者を知りません。その多くは素晴らしい開発者です。
スティーブンエバーズ

6
@SnOrfus-主に学界が非合理的な偽政治的理由でそれを避けるため。
宮坂

5
私の最初のアドバイスは、C#のコンテキストでC ++を学習しようとしないことです。C#はC ++ではなく、C ++はC#ではないためです。それは馬鹿げた言い方かもしれませんが、C#はポインターを間違って実行するのを難しくし、C ++で実際に簡単にするツールを使用しても、ポインターを間違って実行するのは非常に簡単です。私は、2つの言語に共通する多くのものがあると付け加えます。基本的には、リンゴとオレンジは両方とも木で育てられており、種子を持っているため、果物であると言っているようなものです。
ラムハウンド

2
@ ReiMiyasaka、C#開発者がVB .NETを見る方法とは異なります。
キラレッサ

1
@Kyralessaこれもちょっと不幸です。C#の早期導入者のほとんどがC / C ++のバックグラウンドを持っているため、VB.NETの人口統計に対する軽desであるため、政治的な問題ではないと思います。私の学校では、初心者コースにVB.NETを使用しました。彼らは、VB.NETはおもちゃであると考えているように見えるので、C#のように生徒の心を汚すべきではありません。
宮坂

回答:


10

Java開発者向けのC ++のこのスレッドは非常に似ており、特にMark Byerの投稿に役立つはずです。

これらの本を読んでください:

おそらく覚えておくべき最も重要なことは、C#/ JavaとC ++のメモリ管理手法の違い理解することです

私の教授の1人はJavaのバックグラウンドから来て、それがケーキだと思って入門C ++コースを教えました。彼が説明したことは誰にも意味がありませんでした。彼はいたるところにメモリリークがありました。彼のポインター演算はひどいものでした。彼はシラバスのOOPパートに到達することはありませんでした(神に感謝)。彼が実際にコンパイルしたものは何もありませんでした。彼はchar[]歩sent が必要だと理解しなかった\0。彼のようになってはいけません。


4
同情というC ++で誰も使用していないchar[]そして、それはないですか?
DeadMG

5
@DeadMG私はあなたの意見がよくわかりません。理由だけでchar[]ほとんどC ++で使用されていないそれは教えられたり、それが教えられるべきではないということではないです意味するものではありません。char[]C ++はCのスーパーセットであるため、注意する必要があります。学習する場合は、正しく理解することが不可欠です。
宮坂

7
ええ、彼らが言語の他のすべての側面について習得してから非常に長い時間です。私はむしろ新入生に部分的なテンプレートの専門化とSFINAEを教えたいです。C ++では、を使用しstd::stringます。CAPIと相互運用する必要がある場合は、それc_str()が目的です。プログラマーが対処するchar[]必要も、そのいずれでもNULL終了する必要はありません。Cスタイルの文字列処理は、古いCコードとの相互運用を除き、可能な限りすべての使用に対して完全に完全に非推奨ですc_str()
DeadMG

4
char[]使用はすべてchar[]間違っているので、教える権利などというものはありません。あなたの教授は、Cの代わりにC ++にこだわるなら、おそらく大丈夫だっただろう
。– DeadMG

4
あなたはなりますあなた自身をCを記述しているか否かのCコードはC ++で使用される見て、あなたがC ++を学んでいる場合は結果的に、あなたはC.として、私はしましたが、私は、言っ学ぶ必要はありません、それを容認するが、の事実BeOSのと特定の研究のOSを除く、絶対にあなたは、そのためにC.を必要とし、 -問題は、学生がOSの設計のようなものを教えられる必要があるため、学校は一般的に、後で++ CにCして、タックを教えることです行う C文字列を理解する必要があります。繰り返しになりますが、3度目の方法であれば、1年生にはC ++をまったく教えません。最後に、それは完全にポイントを超えています。
宮坂

14

残念ながら、基本的なC ++についてはそれほど多くないので、期待は持てません。また、C#については、C ++にリモートで転送することもできることはほとんどないので、その角度をカバーする特定のマテリアルが存在することはないと思います。最初から学ぶ必要があります。


3
それがそこにそれほど多くない理由を説明するでしょう。C ++を読んだ後、あなたは正しいように見えます-それは全く異なる世界です。ご協力いただきありがとうございます。
マークウィリアムズ

1
+1、リモートでC ++に転送可能なC#についてほとんど知らないでしょう。私はこれを難しい方法で学びました。
ApprenticeHacker

簡単に言うと、基本的なC ++がたくさんあると思います。ポインタ/参照を区別し、C ++のテンプレートは、最初にあなたの頭の回転を行うことができますが、それはそれまで来るときクラス、まだありますcoutし、シンプルな目標を達成するための簡単な方法
Kierenジョンストンは、

1
@KierenJohnstone:「配列からポインターへの減衰」などの「遅い、例外に対して安全でない方法」を意味するでしょう。
-DeadMG

12
まったく役に立たない答えです。
-dbracey

9

これを簡単に修正する方法はありません。C++は特に難しいわけではありませんが、初心者には簡単ではありません。

Cプログラミングの基礎を読んで(低レベルのものの基礎をつかむため)、STLを学び、続いてScott Meyersなどの記事を読むことをお勧めします。C-with-classesと比較して現代のC ++をどのように書くべきかを示しているので、ここから始めましょう。


2
+1:Meyerの本(効果的なC ++ / STLシリーズ)を追加します。私はそれらをすべて持っています、そして彼らは素晴らしいです。
スティーブンエバーズ

12
-1の場合reading up on C programming。これは良いことよりも害が大きいと思い、CとC ++は一緒に勉強する必要がある言語であるという考えを伝えています。
セバスチャンガイガー

2
@sebastiangeiger:既存の実世界のC ++アプリケーションで作業しなければならない場合、ほとんどの場合、Cに似た構造を処理する必要があるという点を見逃しています。したがって、少なくともあなたのダウンボートを排除するために+1。
Doc Brown

5
@DocBrownかもしれませんが、私は今、これらのC ++レガシープロジェクトの1つを使用しており、前任者のほとんどは、ソースファイルを* .cppとして保存したCプログラマーだけだったと言えます。私はdelete、C配列やその他のC ++で推奨されていないものを、Cを明示的に研究していないために使用していることがはるかに少ないことに気付きました。
セバスチャンガイガー

3
@gbjaanb:何も知る必要がSTLについて、一切、ありませんmallocfree。優れたC ++開発者は、最終的にそれらについて知りたいと思うでしょう。それらから始めることは、まったく異なることです。
DeadMG

7

まだ資料を探しているかどうかはわかりませんが、数か月前にこの記事を見つけました。本ではありません(53ページのみ)。導入部はそれをすべて言っています:

This is a somewhat short guide to the important things to know if you are a C# programmer and find yourself needing or wanting to work in C++

http://geekswithblogs.net/mikebmcl/archive/2012/02/02/c-to-c-ndash-a-somewhat-short-guide.aspx

また、更新の投稿もあります。

http://geekswithblogs.net/mikebmcl/archive/2012/02/14/c-to-cndasha-somewhat-short-guide-update-1.aspx

幸せな学習:)


ただし、このドキュメントを使用するときは非常に注意してください。これは、非常にマイクロソフト中心の方法でC ++を示しています(これも同様です)。C ++ 03とC ++ 11の機能を区別せず、非標準の拡張機能を優先ソリューションとして表示することもあります。そのガイドに従えば、非常に移植性の低いコードになってしまいます。
ファビオフラカッシ

4
  • メモリ管理に注意してください。C#とは対照的に、C ++でポインターと参照がどのように機能するかについて明確なアイデアを得る。また、RAII、手動メモリ管理、スマートポインターもついに登場しました。
  • テンプレートとジェネリックは似ていますが、別物です。テンプレートの仕組みの内部を知る。
  • いくつかの小さなしかしキャッチーな構文上の違いがあります。それらを学ぶ。
  • .net BCLの代わりにSTLに慣れました。LINQ中毒がある場合、いくつかの良いビットを見逃す可能性があります。
  • C ++とC#には基本的な設計上の違いがいくつかあります。したがって、アイデアを移植することはできません。C ++で構築するものはすべて、ゼロから設計する必要があります。
  • がんばろう

1

あまりにも多くのC#からC ++へのチュートリアルが見つからないのは良いことだと思います。彼らはおそらくあなたの脳を混乱させるかもしれません。最初にバイクに乗ることを学び、次に自転車に切り替えることを学ぶのに似ています(完全に適切なアナロジーではありませんが、あなたはアイデアを得ます)。C ++についての新鮮な本を手に入れる方が良いでしょう。すでにOOPの概念に精通しているので、OOPの概念の長い説明をスキップできます(CからC ++に移行する人向けです)。または、初級から中級または中級レベル向けのリファレンスブックを探してみてください。


1

Rosetta Codeにアクセスして、2つを比較することをお勧めします。そこにいる間、C ++のイディオムのリンクを手元に置いて、それらを見つけてください。次に、ポインタ/参照/メモリ/デストラクタレルムに時間をかけます。その後、プリプロセッサについて学習します-liesいを隠すということになると、本当にあなたの友人になります。最後に、STL。


1

だから、約1年前、私はあなたと同じ船に乗っていました。C++を学ぶ必要性を感じたc#devを独習しました。確かに、私は何度も停止して開始しました。3回目の試みで、私はついにそれを突き抜けました。

理解する必要があるのは、C ++およびC#の方法論の観点から、ポインターと参照を介したデータ操作方法が実際に何を意味するのか、状況に応じてそれらをいつどのように使用するのかを理解するのに多くの時間を費やす可能性が高いことです。

C ++の良い点は、オブジェクトスタックの割り当てがほとんどの部分で非常に簡単であり、プログラムがこのメソッドで指定された要件を満たす場合は、この方法でオブジェクトを割り当てる必要があることです。それ以外の場合は、速度、効率、および迅速なクリーンアップのためにポインターに依存します。これを読むことをお勧めしますhttp : //www.parashift.com/c++-faq-lite/は、C ++が内部でどのように機能するかについての多くの技術的理解を与えるためです。

例を挙げましょう。

C ++には、「初期化リスト」と呼ばれるこのコンストラクター実装が存在します。これは、コンストラクターの本体のクラスメンバーの初期化とは異なります。どうして?初期化される型がプリミティブでない限り、コンパイラーは実際に、複数の、および ctorの本体に割り当てられたときに作成されるオブジェクトの不要なコピーを作成します。これにより、コンパイラーやアプリの拡張要件に応じて、パフォーマンスが低下する可能性があります。

デリゲートとは何ですか?さて、C ++では、関数ポインターとして知られています。この言語を最初に習得することは非常に困難ですが、素晴らしいものにしたい場合は、間違いなく必要です。

C#は簡単です...とても簡単です。


C#デリゲートとc関数ポインターはまったく異なります。デリゲートは、関数ポインターよりもC ++のファンクターに近いです。
CodesInChaos

-2

私を信じて、C ++の良い本を選んで(もっとたくさんあります、検索してください)、学習を始めてください...


1
ところで、前にいくつかのC(ポインター、配列、構造体)を学習するのは良いことです
Muhammad Hewedy

7
C ++の前にCを学習すると、石器時代に戻ります。最近では、C ++で配列とポインターを使用することはほとんどありません。言語はずっと前にそれらから進化してきました。
fredoverflow

7
@Muhammad:誰もが速度、安全性、メンテナンスの容易さを好みます。
DeadMG

3
@DPD:さて、Bjarne Stroustrup(言語の発明者)を含む多くのプロのC ++プログラマーはあなたに同意しません。彼の最新の本は、オブジェクトとテンプレートの使用を最初から教えていますが、配列とポインターについては、第17章(500ページなど)の前にはまったく話されていません。
fredoverflow

2
@DeadMG。たぶんですが、C-> C ++の進化を元に戻すことはできません。C ++のC部分が嫌いな場合は、JavaまたはC#を選択してください。個人的には、C ++に進む前にCのポインターと配列に集中することは、私のキャリアにおいて大きな助けになることがわかりました。もちろん、アプリケーションなしでアプリケーション全体をコーディングできますが、ポリモーフィズムの利点が必要な場合は、ポインターを知る必要があります。ポインターなしで実装できる重要なGoFパターンはいくつですか?Cを勉強するときに「ハード」な部分を避けた私の友人も同じではありませんでした。彼らのほとんどは、多型を理解するのが難しいと感じました。
DPD
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.