Nokia WRT や maemo アプリケーションの構築を学ぶために、C++ を学ぶ必要があります。どのような落とし穴があり、C++ のどの側面を学ぶ必要があるか、またはさらに集中する必要があるかを知る必要があります。私が頭に浮かんだことの 1 つは、C++ にはガベージ コレクターがないことです。そのため、変数の型に注目する必要があります。しかし、他に本当に重要で無視できないものはありますか?
6 に答える
主な落とし穴は、C++ が PHP や Java とどのように異なるかという観点から考えてみることです。
申し訳ありませんが、そのようには機能しません。C++ は、算術構文以外のほとんどすべての重要な点で、これらの言語とは異なります。違いが微妙な場合もあります。PHP や Java で行うのに適切なことが C++ でもうまくいくとは考えないでください。
とはいえ、一般的な問題には次のようなものがあります。
- リソース管理: RAII; コピー コンストラクタ、デストラクタ、およびの実装
operator=
。copy ctors、dtors、operator= を実装する必要がなくなります。 - 参照、ポインター、値、自動変数とは何かを理解する。
- 未定義の動作を回避する (
myarray[i] = i++;
がお気に入りです)。PHP と Java はどちらも C++ よりも「厳密に」定義された言語です。まず、プログラムの動作が定義される可能性が高く、したがって信頼性が高くなります。このため、個別の実装は C++ の実装よりも似ています。C++ でプログラムを作成するのは非常に簡単で、単に間違ったことを行うだけでなく、クラッシュやデータの破損など、実行ごとに大きく異なることを行います。 - テンプレート、多重継承、演算子のオーバーロード、および慣れていないその他の機能を安全かつ効果的に使用する方法を学習します。
- 例外をスローおよびキャッチするための正しいイディオム (値によるスロー、参照によるキャッチ、デストラクタからスローしない)。
- 移植可能なコードを書く (標準で保証されていることと、保証されていないが実装がたまたま行うことの違いを理解する。基本型のサイズなどの実装定義の動作)。
- C++ の標準ライブラリは、Java や PHP に比べて制限があります。非標準ライブラリも使用します。たとえば、Maemo は GTK+ や Qt を使用しています。多くの場合、「C++ で X を実行するにはどうすればよいか」に対する答えは、「標準の C++ だけを使用して実行することはできません。プラットフォーム固有の API またはシステム用にコンパイルされたポータブル ライブラリが必要です」です。X は、グラフィックス、ソケット、正規表現、マルチスレッド、XML 処理、暗号化することができます。特にモバイル プラットフォームでは、OS のバージョンに注意する必要があります。
STL コンテナの使い方を今すぐ学びましょう。イテレータの構文は、他の言語から来た人には使いにくいですが、ファンキーなポインター コードを記述することなく、Java のコレクションまたは PHP で一般的に組み込みとして使用する組み込みのデータ構造 (マップ/ハッシュ、リスト、スタック、ベクトル) を提供します。動的割り当てにより、初心者がホイールを再発明したり、メモリのバグをいじったりすることがよくあります。
また、プラットフォーム固有のコード (Qt や Microsoft MFC アプリなど) を記述する場合、フレームワーク固有のコンテナーを使用した例をよく目にしますが、STL を選択する方が賢明です。STL (およびブースト) はギャップを埋めることができます。GUI フレームワークの使用は、フレームワークが提供するすべてを使用する必要があるという意味ではありません。プログラムを移植したり、コードの一部を再利用したりしないことが疑いの余地なくわかっている場合を除き、非標準のコンテナーには近づかないでください。
メモリを確実にクリーンアップするのと同じくらい、変数型ではないと思います。Java はメモリをクリーンアップしますが、C++ はそれを行いません。それ以外の場合は、例外が存在する場合にリソースを管理することが重要です。
プラス面としては、「確定的なファイナライズ」と呼ばれるものが得られます。大きなメリット。頭字語として「RAII」を調べてください。これは間違いなく C++ で最も重要なイディオムの 1 つだと思います。
「Resource Acquisition Is Initialization」の略ですが、本当の意味は「このデストラクタが起動したら、例外があっても後始末します」という意味です。実際には、作成または開いたオブジェクトを閉じたり削除したりする必要がある場合は、スマート ポインターを使用して保持できます。スマート ポインターは後片付けをします。これは、理解して使い始めると非常に強力です。これにより、エラー チェック、例外処理、およびリソースのクリーンアップ コードが非常に簡単になります。
C++ への移行時に一部の Java プログラマーが行うのを見た落とし穴の 1 つは、"try-catch" メモリ リークです。例えば:
try {
myType pVar = new myType();
DoSomething(pVar);
delete pVar;
}
catch (exception) {
cout << "Doh! Something failed!" << endl;
}
上記の場合、「DoSomething()」メソッドが例外をスローすると、pVar は削除されないため、メモリ リークが発生します。
(これに対する解決策には、try/catch ブロックの前にすべての変数を宣言する、auto_ptr を使用する、または最初から try-catch を回避することが含まれます!)
最も重要なこと (私の意見では) は、すべてが値型であるため、次のように配列を関数に渡す場合:
void do_stuff(std::vector<int> my_array)
{
...
}
渡さmy_array
れる は、指定された引数のコピーです。このように配列全体をコピーするとコストがかかるため、一般的には const-reference で渡します。
void do_stuff(const std::vector<int>& my_array)
{
...
}
(注:const
元の を変更する場合は を省略してくださいmy_array
)。
ここでなぜ「PHP/Java」が単一のものと見なされるのか、興味があります。そうではありません。
- Java から C++ への移行はかなり大きいですが、実行可能です。追加の構文、デストラクタ、コピー コンストラクタ、オブジェクトのスライス、演算子のオーバーロードなどのいくつかの追加の概念を学習し、C++ ライブラリに慣れる必要があります。 .
- 一方、PHP から C++ への移行は、(a) 定義が非常に不十分なソース言語、(b) クラスベースではなくテンプレートベースの言語、および (c) に関するものであるため、さらに桁違いに大きくなっています。 ) 特殊な環境で実行される言語。