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

共同編集されたコミュニティ編集のC ++ FAQを提供します

9
マルチスレッドのCまたはC ++プログラミングでvolatileが役に立たないと見なされるのはなぜですか?
私が最近投稿したこの回答で示されているように、私はvolatileマルチスレッドプログラミングコンテキストでのユーティリティ(またはその欠如)について混乱しているようです。 私の理解はこれです。変数にアクセスするコードの制御の流れの外で変数が変更される可能性がある場合は常に、その変数をとして宣言する必要がありますvolatile。シグナルハンドラー、I / Oレジスター、および別のスレッドによって変更された変数はすべて、このような状況を構成します。 したがって、グローバルintがありfoo、foo1つのスレッドによって読み取られ、別のスレッドによって(おそらく適切なマシン命令を使用して)アトミックに設定されている場合、読み取りスレッドは、シグナルハンドラーによって微調整された変数を見るのと同じようにこの状況を認識します。外部ハードウェア条件によって変更されるため、foo宣言する必要がありますvolatile(または、マルチスレッドの状況では、メモリフェンスの負荷でアクセスします。これはおそらくより良い解決策です)。 どのように、どこで私は間違っていますか?

7
nullptrを使用する利点は何ですか?
このコードは、概念的には3つのポインターに対して同じことを行います(安全なポインター初期化)。 int* p1 = nullptr; int* p2 = NULL; int* p3 = 0; だから、ポインタを割り当てることの利点どのようなものnullptrそれらに値を代入上NULLかは0?
163 c++  c++11  null  c++-faq  nullptr 

5
mainの適切な宣言は何ですか?
mainC ++ での関数の適切なシグネチャは何ですか?正しい戻り値の型とは何mainですか?から値を返すとはどういう意味ですか?許可されているパラメーターのタイプとは何ですか?それらの意味は何ですか? これはシステム固有ですか?それらのルールは時間とともに変化しましたか?違反した場合はどうなりますか?
147 c++  main  c++-faq 

3
どのiomanipマニピュレーターが「粘着性」がありますか?
私は最近、明示的に変更するまで、すべての挿入の文字列ストリームに影響を与えるstringstreamと誤って想定しているため、原因の作成に問題がありましたstd::setw()。ただし、挿入後は常に設定解除されます。 // With timestruct with value of 'Oct 7 9:04 AM' std::stringstream ss; ss.fill('0'); ss.setf(ios::right, ios::adjustfield); ss << setw(2) << timestruct.tm_mday; ss << timestruct.tm_hour; ss << timestruct.tm_min; std::string filingTime = ss.str(); // BAD: '0794' だから、私はいくつかの質問があります: なぜsetw()このようになるのですか? このように他のマニピュレーターはありますか? 間の行動に差があるstd::ios_base::width()とは、std::setw()? 最後に、この動作を明確に文書化したオンラインリファレンスがありますか?私のベンダーのドキュメント(MS Visual Studio 2005)はこれを明確に示していないようです。
140 c++  c++-faq 



7
C ++でのポリモーフィズム
私の知る限り: C ++には、3つの異なるタイプのポリモーフィズムがあります。 仮想機能 関数名のオーバーロード オペレーターの過負荷 上記の3つのタイプの多型に加えて、他の種類の多型が存在します。 ランタイム コンパイル時 アドホックポリモーフィズム パラメトリック多態性 実行時のポリモーフィズムは仮想関数によって実現でき 、静的なポリモーフィズムはテンプレート関数によって実現できることを知っています しかし、他の2つについては アドホックポリモーフィズム ウェブサイトが言うパラメトリック多態性、 アドホックなポリモーフィズム: 使用できる実際のタイプの範囲が有限であり、使用前に組み合わせを個別に指定する必要がある場合、これはアドホックなポリモーフィズムと呼ばれます。 パラメトリック多態性: すべてのコードが特定の型について言及せずに記述されているため、任意の数の新しい型で透過的に使用できる場合、パラメトリックポリモーフィズムと呼ばれます。 私はそれらをほとんど理解できません:( 可能であれば、誰もが例でそれらの両方を説明できますか?この質問に対する回答が、大学の多くの新入生のために役立つことを願っています。

5
メンバーアクセス演算子のオーバーロード->、。*
私は、メンバーアクセス演算子を除いて、ほとんどの演算子のオーバーロードを理解し->、.*、->*など 特に、これらの演算子関数に渡されるものと返されるものは何ですか? 演算子関数(例operator->(...))は、どのメンバーが参照されているかをどのようにして知るのですか?わかる?それも知る必要がありますか? 最後に、考慮に入れる必要があるconstの考慮事項はありますか?たとえば、のようなものをオーバーロードする場合operator[]、通常、constバージョンとnon-constバージョンの両方が必要になります。メンバーアクセスオペレーターにはconstバージョンとnon-constバージョンが必要ですか?


4
C ++ 11で型を移動不可能にするのはいつですか?
これが検索結果に表示されないことに驚いたのですが、C ++ 11での移動のセマンティクスの有用性を考えると、誰かが以前にこれを尋ねたのではないかと思いました。 C ++ 11でクラスを移動不可能にする必要があるのはいつですか(または私にとっては良い考えですか)? (理由他の既存のコードとの互換性の問題より。)

10
C ++でのスタックとヒープの適切な使用法
私はしばらくプログラミングをしてきましたが、ほとんどがJavaとC#でした。実際に自分でメモリを管理する必要はありませんでした。私は最近C ++でプログラミングを始めましたが、いつスタックに格納するか、いつヒープに格納するかについて少し混乱しています。 非常に頻繁にアクセスされる変数はほとんど使用されない変数であるスタックとオブジェクトに格納する必要があり、大きなデータ構造はすべてヒープに格納する必要があると私は理解しています。これは正しいですか、それとも間違っていますか?

3
どのC ++スマートポインター実装を利用できますか?
比較、長所、短所、およびいつ使用するか? これはからのスピンオフです ガベージコレクションスレッド派生したもので、私が単純な答えだと思ったものは、特定のスマートポインターの実装に関する多くのコメントを生成したため、新しい投稿を開始する価値があるように思われました。 結局のところ、問題は、C ++でのスマートポインタのさまざまな実装とは何か、そしてそれらをどのように比較するかです。単純な長所と短所、または例外と、他の方法では機能するはずだと思うかもしれないことの落とし穴 私はいくつかの実装を投稿したか、少なくとも以下の回答として使用することを検討し、100%正確ではない可能性があるそれらの違いと類似点について理解しているので、必要に応じて事実を確認または修正してください。 目標は、いくつかの新しいオブジェクトとライブラリについて学ぶか、すでに広く使用されている既存の実装の私の使用法と理解を修正して、他の人に適切なリファレンスを提供することです。


8
ヘッダーにC ++インライン関数があるのはなぜですか?
注:これは、インライン関数の使用方法や機能についての問題ではなく、なぜそれらが現在の方法で行われるのかということです。 クラスメンバー関数の宣言では、関数をとして定義する必要はありませんinline。関数の実際の実装のみです。たとえば、ヘッダーファイルでは次のようになります。 struct foo{ void bar(); // no need to define this as inline } なぜクラスのインライン実装では機能しない持っているヘッダファイルにしますか?インライン関数を.cppファイルに配置できないのはなぜですか?インライン定義を.cppファイルに入れようとすると、次の行に沿ってエラーが発生します。 error LNK2019: unresolved external symbol "public: void __thiscall foo::bar(void)" (?bar@foo@@QAEXXZ) referenced in function _main 1>C:\Users\Me\Documents\Visual Studio 2012\Projects\inline\Debug\inline.exe : fatal error LNK1120: 1 unresolved externals

4
std :: swap()をオーバーロードする方法
std::swap()並べ替えや割り当ての際に、多くのstdコンテナ(std::listおよびなどstd::vector)で使用されます。 ただし、のstd実装swap()は非常に一般化されており、カスタムタイプに対しては非効率的です。 したがってstd::swap()、カスタムタイプ固有の実装でオーバーロードすることで効率を上げることができます。しかし、どのように実装すれば、標準コンテナで使用できますか?

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