問題タブ [c++-faq]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 次のフレーズはC++で何を意味しますか:ゼロ、デフォルト、および値の初期化?
次のフレーズはC++で何を意味しますか?
ゼロ初期化、
デフォルト-初期化、および
値の初期化
C ++開発者はそれらについて何を知っておくべきですか?
c++ - コンストラクターのこの奇妙なコロンメンバー (" : ") 構文は何ですか?
最近、次のような例を見ました。
この奇妙な: bar(num)
意味は何ですか?どういうわけかメンバー変数を初期化しているように見えますが、この構文はこれまで見たことがありません。関数/コンストラクター呼び出しのように見えますが、int
? 私には意味がありません。おそらく誰かが私を啓発することができます。ところで、通常の C++ の本には見当たらない、このような難解な言語機能は他にありますか?
c++ - C++でコンストラクターと=演算子のオーバーロードをコピーします:共通関数は可能ですか?
コピーコンストラクター以来
および = 演算子のオーバーロード
ほとんど同じコード、同じパラメーターを持ち、戻り値のみが異なります。両方が使用する共通の関数を持つことは可能ですか?
c++ - C++ プログラマーはどの C++ イディオムを使用する必要がありますか?
C++ プログラマーが知っておくべき C++ イディオムは何ですか?
C++ のイディオムとは、C++ にのみ適用できる、または他のほとんどの言語よりも C++ により適用できるデザイン パターンまたは特定のことを行う方法を意味します。
イディオムを使用する必要がある理由と、イディオムは何を達成するのですか?
c++ - 「new」演算子をオーバーロードして、セカンダリメモリデバイスからメモリを割り当てるにはどうすればよいですか。
デフォルトのヒープからではなく、セカンダリメモリデバイスからメモリを割り当てる構文を探しています。
どうすれば実装できますか?を使用malloc()
すると、デフォルトでヒープから取得されます...確かに別の方法があるはずです!
c++ - C ++削除-オブジェクトを削除しますが、データにアクセスできますか?
クラスシングルブロックのインスタンスとして各ブロックを使用して、シンプルで機能するテトリスゲームを作成しました。
完全な行をスキャンし、ブロックのリンクリストを実行して、関連するブロックを削除し、->次のポインターを再割り当てする関数があります。
ゲームは動作し、ブロックは正しく削除され、すべてが想定どおりに機能します。ただし、検査すると、削除されたデータのランダムなビットにアクセスできます。
削除後に削除されたシングルブロックの「x」値をそれぞれprintfすると、ランダムなガベージを返すもの(削除を確認するもの)と222を返すものがあり、デストラクタが呼び出されても、データは実際には削除されていないことがわかります。ヒープ。多くの同一の試行は、適切に削除されないのは常に同じ特定のブロックであることを示しています。
結果:
予想外のデータにアクセスできるのでしょうか?
これが少し長蛇の列になっている場合は申し訳ありません。
c++ - C ++の関数にオブジェクトを渡す方法は?
私はC++プログラミングに不慣れですが、Javaの経験があります。C++の関数にオブジェクトを渡す方法についてのガイダンスが必要です。
ポインター、参照、または非ポインターと非参照の値を渡す必要がありますか?Javaでは、オブジェクトへの参照を保持する変数だけを渡すので、そのような問題はないことを覚えています。
これらの各オプションをどこで使用するかも説明できれば素晴らしいと思います。
c++ - メンバーをメンバーで初期化する
これは私がよく遭遇する問題です。次の例はそれを示しています。
のコンストラクターの実装は次のC
ようになります。
初期化の順序が定義されていないためm_ObjectA
、のコンストラクターm_ObjectB
が呼び出されたときに初期化されない可能性があり、未定義の動作が発生します。初期化の特定の順序を強制する1つの方法は、メンバーポインターを作成し、コンストラクター本体でそれらを初期化して、正しい順序を強制することですが、これはいくつかの理由で醜いです。コンストラクターの初期化リストを使用して、特定の初期化順序を強制する方法はありますか?そうでない場合は、これを処理する方法について他に提案がありますか。
c++ - マルチスレッドの C または C++ プログラミングで volatile が有用と見なされないのはなぜですか?
最近投稿したこの回答に示されているようにvolatile
、マルチスレッド プログラミング コンテキストでのユーティリティ (またはその欠如) について混乱しているようです。
私の理解は次のとおりです。変数にアクセスするコードの制御フローの外部で変数が変更される可能性がある場合はいつでも、その変数は であると宣言する必要がありますvolatile
。シグナル ハンドラ、I/O レジスタ、および別のスレッドによって変更された変数はすべて、このような状況を構成します。
したがって、グローバルな intfoo
があり、foo
あるスレッドによって読み取られ、別のスレッドによって (おそらく適切なマシン命令を使用して) アトミックに設定される場合、読み取りスレッドは、シグナル ハンドラーによって微調整された変数を見るのと同じ方法でこの状況を認識します。外部ハードウェア条件によって変更されるため、foo
宣言する必要がありますvolatile
(または、マルチスレッドの状況では、おそらくより良い解決策であるメモリ フェンシング ロードでアクセスします)。
どのように、どこで間違っていますか?