タグ付けされた質問 「c++」

静的に型付けされた自由形式のマルチパラダイムでコンパイルされた汎用プログラミング言語であるC ++に関する質問。

10
「if」および「while」と一緒に使用する場合、言語が式の周りに括弧を必要とするのはなぜですか?
C、Java、およびC ++のような言語はすべてで使用した場合、式全体の周りに括弧を必要としif、whileまたはswitch。 if (true) { // Do something } とは対照的に if true { // Do something } 括弧が冗長であるため、これは私には奇妙に思えます。この例でtrueは、は単独の式です。括弧は、私が知っている方法でその意味を変えません。なぜこの奇妙な構文が存在し、なぜそんなに一般的ですか?気付いていないのに利点はありますか?

13
すべての間接参照されたポインタをヌルガードするのは合理的ですか?
新しい仕事で、次のようなコードのコードレビューでフラグを立てられました。 PowerManager::PowerManager(IMsgSender* msgSender) : msgSender_(msgSender) { } void PowerManager::SignalShutdown() { msgSender_->sendMsg("shutdown()"); } 最後のメソッドは次のように読むべきだと言われています: void PowerManager::SignalShutdown() { if (msgSender_) { msgSender_->sendMsg("shutdown()"); } } つまり、変数がプライベートデータメンバーであっても、変数をガードする必要があります。この「知恵」についてどのように感じているかを説明するためにexp辞を使うのを抑えるのは難しいです。説明を求めると、ある年のジュニアプログラマーがクラスがどのように機能するかについて混乱し、必要のないメンバーを誤って削除した(そしてその後に設定する)ことについてのホラーストーリーを大量に受け取ります、どうやら)、そして製品リリース直後に現場で物事が爆発しました。すべてをチェックする方が良いという「難しい方法を学び、信頼してください」。NULLmsgSender_NULLNULL 私にとって、これは貨物カルトのプログラミングのように感じます。いくつかの善意の同僚は、私が「それを得る」のを助け、これが私がより堅牢なコードを書くのにどのように役立つかを真剣に助けようとしていますが、...私は彼らがそれを手に入れていないように感じるのを助けることができません。 コーディング標準では、関数内で間接参照されているすべてのポインターをNULL最初にチェックすることを要求するのは妥当ですか?プライベートデータメンバーであっても?(注:コンテキストを提供するために、航空交通管制システムやその他の「障害と同等の人々が死ぬ」製品ではなく、家電製品を製造しています。) 編集:上記の例では、msgSender_共同編集者はオプションではありません。これまでNULLに発生した場合は、バグを示しています。コンストラクターに渡される唯一の理由はPowerManager、モックIMsgSenderサブクラスでテストできることです。 要約:この質問には本当に素晴らしい回答がいくつかありました。みなさんありがとう。私は主にその簡潔さのために@aaronpsからのものを受け入れました。以下のかなり一般的な合意があるようです。 すべての間接参照されたポインタにNULLガードを強制するのはやり過ぎですが、 代わりに参照(可能な場合)またはconstポインターを使用して、議論全体を回避できます。 assertステートメントは、NULL関数の前提条件が満たされていることを検証するための、ガードに対するより賢明な代替手段です。

3
プライベートメンバーをヘッダーに配置する必要があるのはなぜですか?
プライベート変数は、クラスのユーザーに複雑さと実装の詳細を隠す方法です。これはかなり良い機能です。しかし、なぜc ++ではクラスのヘッダーに入れる必要があるのか​​理解できません。これには2つの厄介な欠点があります。 ユーザーからのヘッダーを乱雑にします 内部が変更されるたびに、すべてのクライアントライブラリの再コンパイルを強制します この要件の背後に概念的な理由はありますか?コンパイラの作業を簡単にするだけですか?
62 c++  headers 

10
関数のオーバーロードのためだけにC ++コンパイラを使用するのは悪い習慣ですか?
そのため、特定のプロセッサでCを使用したソフトウェア設計に取り組んでいます。ツールキットには、CおよびC ++をコンパイルする機能が含まれています。私がやっていることに関しては、この環境で利用可能な動的メモリ割り当てはなく、プログラムは全体的にかなり単純です。言うまでもなく、このデバイスにはプロセッサー能力やリソースがほとんどありません。C ++を使用する必要はまったくありません。 そうは言っても、関数のオーバーロードを行う場所はいくつかあります(C ++の機能)。いくつかの異なるタイプのデータを送信する必要がありますが、printf何らかの%s(またはなんらかの)引数でスタイルの書式設定を使用する気はありません。私はC ++コンパイラにアクセスできない人を何人か見ましたprintfが、私の場合はC ++サポートが利用可能です。 これで、なぜ関数をオーバーロードする必要があるのか​​という疑問を最初から得ることができると確信しています。だから私は今すぐそれに答えようとします。シリアルポートからさまざまな種類のデータを送信する必要があるため、次のデータ型を送信するオーバーロードがいくつかあります。 unsigned char* const char* unsigned char const char 私は、これらすべてを処理する1つのメソッドを持たないことを好みます。私はちょうどそれがシリアルポートを送信する関数を呼び出すときに、私は多くの資源を持っていないので、私はかろうじて行うにはしたくない何でもいいけど、私の送信を。 他の人が私のプログラムを見て、「なぜCPPファイルを使用しているのですか?」だから、それが私の唯一の理由です。それは悪い習慣ですか? 更新 私は尋ねられたいくつかの質問に対処したいと思います: あなたのジレンマに対する客観的な答えは以下に依存します: C ++を使用する場合、実行可能ファイルのサイズが大幅に増加するかどうか。 現在、実行可能ファイルのサイズは、プログラムメモリの4.0%(5248バイトのうち)とデータメモリの8.3%(342バイトのうち)を消費しています。つまり、C ++用にコンパイルしています... Cコンパイラを使用していないため、Cでどのように見えるかわかりません。私はこのプログラムがこれ以上成長しないことを知っているので、リソースがどれだけ限られているかについては、私はそこで大丈夫だと言います... C ++を使用している場合、パフォーマンスに顕著な悪影響があるかどうか。 ある場合、私は何にも気づいていません...しかし、それでも私は完全に理解していないので、私はこの質問をしている理由かもしれません。 Cコンパイラーのみが使用可能な別のプラットフォームでコードを再利用できるかどうか。 私はこれに対する答えが間違いなくノーであることを知っています。別のプロセッサへの移行を実際に検討していますが、より強力なARMベースのプロセッサのみです(事実、C ++コンパイラツールチェーンを持っていることは事実です)。

7
C ++でビットフラグにスコープ付き列挙型を使用する
enum X : int(C#)と、またはenum class X : int(C ++ 11)の隠れた内部フィールド有するタイプであるintことは、任意の値を保持することができます。さらに、いくつかの定義済み定数がX列挙型で定義されています。列挙型を整数値にキャストしたり、その逆を行うことができます。これは、C#とC ++ 11の両方に当てはまります。 C#では、列挙型は個々の値を保持するためだけでなく、Microsoftの推奨に従って、フラグのビットごとの組み合わせを保持するためにも使用されます。このような列挙型は(通常、必ずしもそうではありませんが)[Flags]属性で装飾されています。開発者の生活を楽にするために、ビット単位の演算子(OR、ANDなど)がオーバーロードされているため、次のようなことが簡単にできます(C#)。 void M(NumericType flags); M(NumericType.Sign | NumericType.ZeroPadding); 私は経験豊富なC#開発者ですが、C ++をプログラミングしてから数日しか経っていないため、C ++の規約については知りません。C#で使用したのとまったく同じ方法でC ++ 11列挙型を使用する予定です。C ++ 11では、スコープ付き列挙型のビット演算子はオーバーロードされないため、それらをオーバーロードしたかったのです。 これは議論を呼び起こし、意見は3つの選択肢の間で異なるようです: C#と同様に、ビット型を保持するために列挙型の変数が使用されます。 void M(NumericType flags); // With operator overloading: M(NumericType::Sign | NumericType::ZeroPadding); // Without operator overloading: M(static_cast<NumericType>(static_cast<int>(NumericType::Sign) | static_cast<int>(NumericType::ZeroPadding))); しかし、これはC ++ 11のスコープ付き列挙型の厳密に型指定された列挙型の哲学に反するでしょう。 列挙型のビットごとの組み合わせを保存する場合は、プレーン整数を使用します。 void …

10
より良いShow()+ Hide()またはSetVisible(bool visible)ですか?
何が良くて、なぜですか?(インターフェース設計の観点から): A)2持っているShow()とHide()機能を b)1つのSetVisible(bool visible)機能を持つ 編集:たとえば、一部のオブジェクトには可視性の状態があり、この関数を使用して変更します。 C)3つのすべての持っているためにShow()、Hide()、SetVisible(bool visible)機能を
59 java  c++  interfaces 

9
最終手段としてのstd :: shared_ptr?
「Going Native 2012」ストリームを見ているだけで、についての議論に気付きましたstd::shared_ptr。Bjarneのやや否定的な見方std::shared_ptrと、オブジェクトの寿命が不確かな場合の「最後の手段」として使用すべきだという彼のコメントを聞いて、私は少し驚いていました(彼によると、そうではないはずです)。 これをもう少し詳しく説明したい人はいますか?どうすればstd::shared_ptrオブジェクトの寿命を安全な方法で管理し、管理できますか?

13
未定義行動の背後にある哲学
C \ C ++仕様では、コンパイラが独自の方法で実装するための多数の動作が公開されていません。同じことについて常にここで質問され続ける多くの質問があり、それに関するいくつかの素晴らしい投稿があります: https://stackoverflow.com/questions/367633/what-are-all-the-common-undefined-behaviour-that-ac-programmer-should-know-abo https://stackoverflow.com/questions/4105120/what-is-undefined-behavior https://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points 私の質問は、未定義の振る舞いについてではなく、本当に悪いことです。危険と標準からの関連する未定義の動作の引用のほとんどを知っているので、それがどれほど悪いかについての回答を投稿することは控えてください。この質問は、コンパイラ実装のために非常に多くの動作を開いたままにすることの背後にある哲学に関するものです。 パフォーマンスが主な理由であると述べている素晴らしいブログ記事を読みました。パフォーマンスがそれを許可するための唯一の基準であるのか、それともコンパイラー実装のためにオープンなままにする決定に影響する他の要因があるのか​​疑問に思っていましたか? 特定の未定義の動作がコンパイラが最適化するのに十分な余地を提供する方法について引用する例がある場合は、それらをリストしてください。パフォーマンス以外の他の要因を知っている場合は、十分な詳細を含めて回答を返してください。 質問を理解していないか、回答を裏付ける十分な証拠/情報源がない場合は、広く推測する回答を投稿しないでください。

17
ポインターを使用して解決するのに最適なプログラミング問題は何ですか?[閉まっている]
まあ、私は基本的にポインタの使用方法を理解していますが、より良いプログラミングを行うためにそれらをどのように使用するのが最善かはわかりません。 ポインターを使用することで解決できる、良いプロジェクトや問題は何ですか?

11
Javaの最新のレビュー[終了]
私は数年前からプログラミングをしていて、Javaを始めました。そして、Javaが何らかの形で劣った言語であると主張するさまざまなソースを見つけました。各言語には長所と短所があることをよく知っていますが、Javaについて読んだ多くのことは時代遅れのようです。 Javaが劣っている最もよく挙げられる理由は、たとえばC ++など、他のネイティブにコンパイルされた言語よりもJavaがはるかに遅いことです。多くの人々は、パフォーマンス部門が明らかに不足しているため、Javaの使用についてゲームデザイナーのノッチ(Minecraftを開発した)を批判しています。当時はJavaの方がはるかに低速でしたが、それ以来、特にJITコンパイルでは多くの改善が見られました。 今日、言語としてのJavaについて客観的な意見を聞きたいと思います。したがって、私の質問には4つの部分があります。 パフォーマンス。 a。今日のJavaの速度はC ++と比較してどうですか? b。Javaを使用して最新のAAAタイトルを作成することは可能でしょうか? c。JavaがC ++より遅いのは、具体的にどのような分野ですか?(つまり、数値演算、グラフィックス、またはその周辺) Javaは現在、コンパイル言語またはインタープリター言語と見なされていますか? 初期の頃から対処されてきたJavaの主な欠点は何ですか? まだ対処されていないJavaの主な欠点は何ですか? 編集: 明確化の目的のために、私はこのJava対C ++を作成していません。明らかに、平均してc ++はJavaよりも少し高速です。この時点で、Javaを言語としての成熟度に関して比較するものが必要です。C ++は永遠に存在しているので、私は比較の良い点になると思いました。

9
可読性と保守性、ネストされた関数呼び出しを記述する特別な場合
ネストされた関数呼び出しのコーディングスタイルは次のとおりです。 var result_h1 = H1(b1); var result_h2 = H2(b2); var result_g1 = G1(result_h1, result_h2); var result_g2 = G2(c1); var a = F(result_g1, result_g2); 私は最近、次のコーディングスタイルが非常に使用されている部門に変更しました。 var a = F(G1(H1(b1), H2(b2)), G2(c1)); コーディングの私の方法の結果、クラッシュする機能の場合、Visual Studioは対応するダンプを開き、問題が発生した行を示すことができます(特にアクセス違反が心配です)。 最初の方法でプログラムされた同じ問題によるクラッシュの場合、どの関数がクラッシュを引き起こしたかを知ることができないのではないかと心配しています。 一方、1行に追加する処理が多いほど、1ページに表示されるロジックが多くなり、読みやすくなります。 私の恐怖は正しいのですか、それとも一般的には商業環境で好まれる何かが欠けていますか?可読性または保守性? 関連するかどうかはわかりませんが、C ++(STL)/ C#で作業しています。

7
C ++に「最終的に」コンストラクトがないのはなぜですか?
C ++での例外処理は、try / throw / catchに制限されています。Object Pascal、Java、C#、Pythonとは異なり、C ++ 11でもfinallyコンストラクトは実装されていません。 「例外の安全なコード」について議論しているC ++の文献がたくさんあります。リップマンは、例外セーフコードは重要だが高度で難しいトピックであり、彼の入門書の範囲を超えていると書いています。これは、セーフコードがC ++の基本ではないことを暗示しているようです。ハーブサッターは、例外的なC ++のトピックに10章を費やしています! しかし、「例外セーフコード」を記述しようとするときに遭遇する問題の多くは、finally構造が実装されていれば非常によく解決でき、プログラマは例外が発生した場合でもプログラムを復元できるようになりますリソース、潜在的に問題のあるコードの割り当てのポイントに近い、安全で安定した、漏れのない状態に。私は非常に経験豊富なDelphiおよびC#プログラマーとしてtry ..を使用します。これらの言語のほとんどのプログラマーと同様に、最終的にコード内でかなり広範囲にブロックします。 C ++ 11に実装されているすべての「付加機能」を考慮すると、「最終的に」まだ存在していないことに驚いた。 それでは、なぜfinallyコンストラクトがC ++で実装されていないのでしょうか?把握するのはそれほど難しくも高度な概念でもないので、プログラマーが「例外安全なコード」を書くのを支援するのに大いに役立ちます。
57 c++  exceptions 

7
なぜstd :: stringに直面して非常に多くの文字列クラスがあるのですか?
多くのより大きなC ++ライブラリが独自の文字列型を作成することになります。クライアントコードでは、(ライブラリからいずれかを使用する必要があるのいずれかQString、CString、fbstringまたは時間のほとんどが含まれている(標準タイプと1の間のライブラリの使用を変換しておく、私は誰もがいくつかに名前を付けることができます確信しているなど)少なくとも1つのコピー)。 だから、特定の誤機能または何か悪い点がありますかstd::string(auto_ptrセマンティクスが悪いように)?C ++ 11で変更されましたか?
56 c++ 

3
ラムダとは何ですか、なぜ有用なのでしょうか?[閉まっている]
これまで私は聞いた: ラムダ計算 ラムダプログラミング ラムダ式 ラムダ関数 すべてが関数型プログラミングに関連しているようです... どうやらそれはC ++ 1xに統合されるので、今よりよく理解するかもしれません: http://en.wikipedia.org/wiki/C%2B%2B0x#Lambda_functions_and_expressions 誰かがラムダのことを簡単に定義して、それがどこで役立つかを教えてもらえますか?

15
なぜ後置インクリメントがあるのですか?
免責事項:プレフィックスとポストフィックスのインクリメントのセマンティクスを完全に知っています。したがって、それらがどのように機能するかを私に説明しないでください。 スタックオーバーフローに関する質問を読んで、プログラマがpostfix increment演算子に何度も何度も混乱することに気づかずにはいられません。これから、次の疑問が生じます:後置インクリメントがコード品質の面で本当の利点を提供するユースケースはありますか? 例で私の質問を明確にしましょう。以下は、非常に簡潔な実装ですstrcpy。 while (*dst++ = *src++); しかし、それは私の本の中で最も自己文書化されたコードではありません(そして、それは正気のコンパイラで2つの迷惑な警告を生成します)。それでは、次の選択肢の何が問題になっていますか? while (*dst = *src) { ++src; ++dst; } その後、条件内の混乱する割り当てを取り除き、完全に警告のないコードを取得できます。 while (*src != '\0') { *dst = *src; ++src; ++dst; } *dst = '\0'; (はい、私は知っている、srcそしてdstこれらの代替ソリューションで異なる結末値を持つことになりますが、以来strcpy、すぐにループの後に返す、それはこの場合には重要ではありません。) 後置インクリメントの目的は、コードをできるだけ簡潔にすることだと思われます。私はこれが私たちがどのように努力すべきかを単に見逃しています。これがもともとパフォーマンスに関するものであった場合、それは今日でも関連していますか?
55 c++  c  postfix 

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.