C ++について知っておくべきことは何ですか?[閉まっている]


8

私は最近C ++の学習を始めましたが、とても楽しんでいます。

私はよく、多くの言語よりもC ++で悪いコードを書く方が簡単で、見た目よりもはるかに深いことを読んだことがあります。

悪いコードを書かないようにしたいので、C ++で良いコードを書くために、私が何をしてはいけないのか、何をすべきなのかを考えていました。


1
あなたが読んだ、または読んでいるC ++の本は何ですか?
Fred Nurk、2011

まだありません。私は、あまりにも良いの本を探していたが、私は彼らがあまりにも多くのことがわかりました、今私は(開始する場所がわからないstackoverflow.com/questions/388242/...を
DistantEcho

本と混同しないでください。ロバートラフォーズ(amazon.com/Object-Oriented-Programming-4th-Robert-Lafore/dp/…)またはC ++プレミア(amazon.com/dp/0201721481/?tag= stackoverfl08-20)より多くのコードを書いて進むにつれて、自分で何を避けるべきかがわかるようになります。あなたはC ++についてあまり知らないので、ここでの回答で避けるべきアドバイスが(実際に)何を理解できるとは思いません。
レンジャー

3
ツールボックス内の唯一のツールがC ++の場合、すべてが親指のように見えます...
CurtisHx

回答:


21

落とし穴

C ++には非常に多くの落とし穴があり、それらを知らないと、非常に不安定なコードが作成され、大量のメモリリークとバッファオーバーランが発生します。ガベージコレクションを備えたより現代的な言語と比較すると、すべてのメモリを自分で解放する必要があります。また、コードは非常に低レベルです。独自のプログラムコード(多くのIEハックで悪用されています)を上書きすることを妨げるものは何もありません。

したがって、次に学ぶ必要があるのは、これらのリスクを軽減するプログラミング方法です。たとえば、スマートポインターを使用してオブジェクトを解放したり、データを処理するクラスでバイト配列をラップしたりします。

Scott Meyersの著書「Effective C ++」と「More Effective C ++」をお勧めします。

それらの本は本質的に私にC ++の美しさを教えてくれました。これらは初心者向けの本ではないことに注意してください。彼らはあなたがすでに言語に精通していることを前提としています。


4
KoenigとMooによる "Accelerated C ++"は、最初に使用例を示し、次に設計と作成を行うことによってテンプレートとクラスを紹介したため、新しいC ++プログラマーにとっては良い本です。そのアプローチでそれらを使用する理由を理解する方が簡単だと思いました。
Larry Coleman、

私はEffective C ++を読み始めましたが、それは本当に非常に役立ちます。ありがとうございました !
DistantEcho、2011

2
あなた自身のプログラムコードを上書きすることを妨げるものは何もない」何?これは言語のせいではありません。実際、ほとんどのオペレーティングシステムでは、積極的に対策を講じない限り、これは実際には実行できません。そして、貧弱に書かれたプログラムは、書かれている言語に関係なく潜在的に悪用される可能性があります。はい、C ++は低レベルであり、はい、欠点がありますが、そのようなナンセンスを使いすぎないでください。
Nik Bougalis

@NikBougalis OSはそれを防止します-OSがそれを防止する場合-が、C / C ++は、仕様上、OSがそれを防止しない場合に、それを行う方法を提供します。他の多くの言語はそうしませんが。したがって、これを言語の問題として特徴付けることは実際にはナンセンスではありません-しかし、私は元のポイントがかなり誇張されていることに同意します。
greggo 2014

5
@greggoそれはナンセンスです-コーヒーマグが誤ってあなたのコーヒーに塩を注ぐことからあなたを守らないと不平を言うかもしれません。事実は次のとおりです。CおよびC ++は、プログラムまたはプログラムが実行されているシステムについて何も知りません。この言語は、「zomg!プログラムが上書きされた」という懸念に対処することはできませんでした。まず、言語が構築されている根本的な仮定を根本的に変更していません。
Nik Bougalis 2014

20

イディオム

C ++はさまざまな機能をサポートしています。同様に、さまざまな方法やスタイルで簡単に使いたくなるかもしれません。残念ながら、それはそれらの多くにうまく適合しません-したがって、そのような方法では、退屈でエラーが発生しやすくなったり、遅くなったりします。

または別の言い方をすれば、実際に何をしているのかがわからなくても、C ++を間違った方法で使用するのは信じられないほど簡単です(他の言語でははるかにサポートされています)。したがって、平易に学ぶことは間違った方向に導く可能性があります。そのため、良い本を読むことはおそらく他の言語よりも重要です(同じトピックに関するこの投稿を参照)。

たとえば、Javaは本質的にオブジェクト指向の言語です。あなたはそれを大きく異なるようにプログラムすることはできません。ただし、C ++ではできます。CまたはJavaで行うのと同じように使用できます。C++が優れているのはどちらの方法でもないため、このような場合はCまたはJavaを使用することをお勧めします。

したがって、C ++を最初から正しく実行するには、適切なスタイルとイディオムを知る必要があります。残念ながら、最初はかなり複雑になる可能性がありますが、単純なものから高度なものまで、いくつかあります。

  • 使用する const
  • (私はすべきであるマイクロ最適化を心配してはいけないinline機能を、<< または*など?)
  • 生のポインタまたは配列をできるだけ使用しないでください(特にvoid*)。参照またはスマートポインターを使用する
  • 一般的なコードを書く= テンプレートを理解する
  • ヘッダー/コードファイル/プリプロセッサを理解する(ただし、マクロは避けてください)
  • STLを使用してください(そして、基礎となる概念を理解してください)。
  • ブーストを使用する
  • オブジェクトの有効期間とスコープについて理解する-RAIIを管理する
  • そもそもオブジェクト指向コード(つまり、実行時の多態性、継承)を記述しないでください。はるかに優れたオブジェクト指向言語があります。
  • 代わりにオブジェクトを使用
  • 優先静的ポリモーフィズムを
  • コンパイル時関数を使用する

アドバイスをありがとう。ただし、オブジェクト指向のコードを記述しない理由はわかりません。それとも、特にOOPの一部を意味しましたか?
DistantEcho、2011

1
OOPはオブジェクトによるプログラミングだけを意味するのではなく、特定のデザインパターン、継承による実行時のポリモーフィズム、クラス階層などを意味します。C++はこれらを表現するのにあまり適していません。それは比較的遅く、落とし穴がたくさんあります(仮想デストラクタを忘れたことはありませんか?)。純粋なオブジェクトで同じように表現するためのより明確な方法がよくあります。たとえば、一般的なプログラミングや静的なポリモーフィズムなどです。
ダリオ

2
@Niphra:それはOOPを使わないことではなく、OOPに拘束されないことです。C ++は複数のパラダイムを提供し、優れたC ++プログラムはそれらのすべてではなくてもほとんどを使用します。
Matthieu M.11年

3
これらはどれも慣用句ではありません。OOPのアドバイスはせいぜい疑わしいものであり、技術的な理由ではなく恐怖に依存しているようです。
エドワードストレンジ

「仮想デストラクタを忘れた」。はい-コンパイラの警告をオンにすることが重要です。もう1つ:「値を返す関数は実際には値を返さない場合があります」-戻り値にコンストラクタが必要な場合。カブーム。私見では、警告はデフォルトでオンになっている必要があります。
greggo 2014

13

C ++の力は、それが素晴らしい言語であることです。C ++の欠点は、それが素晴らしい言語であることです。それは恐ろしいと同時に恐ろしいことでもあります。

あなたがそれを学びたいのなら-そして、あなたがそうすべきでない理由がないなら-あなたはそれをよく学ぶ必要があります。たくさん読む必要があります。途中で役立つ本がいくつかあります。特に演習を行う場合は、Accelerated C ++を使用すると始められます。効果的なC ++、効果的なSTL、卓越したC ++、およびそれらの継続的なシリーズは、作業方法を改善する方法について一口サイズのヒントが得られるゲームで最高です。


4

優れたコードを開発する上で役立つ1つのことは、経験です。とりあえず、言語にこだわって、使用法を改善する方法を検討するのに十分慣れるまで、「ベストコーディングプラクティス」についてあまり心配しないでください。あなたは何が良いのか、何が悪いのかを認識することを学びます。言語が下がったら、振り返って「わかりました。これを別の方法で実装する必要があった」または「これは面倒に見えますが、どうすれば改善できますか?」

私はそれについて次のように考えています。新しい話し言葉を習得する場合、単純な単語や「バス停はどこですか」の学習を始める前に、すぐに飛び込んですべての文法規則を学ぶのではありません。プログラミング(IMO)は第2言語(または第3、第4など)のようなものです。他の言語と同じように扱い、実践することで学びます。残りは時間とともに来るでしょう。


1

ほとんどの言語よりもC ++で悪いコードを書く方が簡単で、見た目よりもはるかに深いことをよく読んでいます

明確化:C ++では、他の言語よりも意図せずに悪いコードを書くことが簡単です。どんな言語でも悪いコードを書くことができますが、C ++では意図的に最善を尽くして着手しますが、C ++のせいで予期しないところに行き着くことがよくあります。実際よりも。しかし、C ++は進化しており、すべての新しいテンプレートライブラリはあなたの生活をより簡単(そして安全)にします。


2
これは、C ++の学習方法にも依存します。拡張Cとして学習を開始すると、C ++として学習するよりも、その段階で問題が発生する可能性が高くなります。
David Thornley、2011

必須のStroustrupの引用の時間:「Cは足で自分を撃つことを簡単にします。C++はそれを難し​​くしますが、それを行うと脚全体を吹き飛ばします」
Mawgはモニカ

-1

2つのこと:

  1. C ++を使用してメモリ管理はどのように機能しますか?
  2. ポインタはC ++のメモリ管理にどのように影響しますか?

1
単なるメモリよりもc ++の方がはるかに多い...
ナズゴブ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.