コード全体で構造を使用するCのコードがいくつかあります。私は主にmemsetまたはmemcpyを使用して、バッファとの間でデータをコピーします。
これがC++で動作するか知りたいですか?'MSDNによる:
C ++では、構造はクラスと同じですが、そのメンバーがデフォルトでパブリックである点が異なります。
はい-MSDNは正しいですが、C ++のコピーがCのclass
コピーと同じくらい安全であることを意味するのstruct
ではなく、構造体がクラスと同じくらい複雑になる可能性があり、どちらも一般的に安全ではありません。構築されたオブジェクトを適切にデフォルト/コピーしてmemset
/memcpy
操作を破棄するように移動することを確実に好む必要があります。memset
とは限られた場合にmemcpy
機能しますが(基本的に、class
/struct
とそのすべてのベースにCで機能するものだけが含まれている場合)仮想ディスパッチテーブルへのポインタはmemsetによって適切に設定されませんが、memcpy
-すべての実装定義)であり、不変条件を維持しようとはしません。実際には、クラスには不変条件があるか、コード/データの自己管理型のカプセル化単位になるにつれてそれらが導入されることがよくあります。コンストラクターは、一部のデータメンバーが関連する一貫した期待値を持っていることを確認できます-これらの不変条件が真に保たれることなく-そしてmemsetはそれらの最も単純なものを除いてすべてを無効にする可能性があります-クラスは後で未定義の動作を示す可能性があります。
また、「this」ポインタは構造体にも適用できますか?コンパイラがC ++のようなものをオブジェクトに挿入するのを防ぐ方法はありますか?
はい-繰り返しstruct
ますが、C ++のaは-と同じ種類のエンティティですclass
-唯一の違いは、メンバー関数とデータの可視性/アクセシビリティにあります。どちらにもthis
ポインタがあります。ただし、このポインターはクラス/構造体には格納されません。これらは、メンバー関数の呼び出しに暗黙的に提供されるそのようなオブジェクトへのポインターです。memcpy
(ab)usingとのコンテキストでこれについて心配する必要はありませんmemset
。より一般的には、C ++固有のことについて心配する必要があるのvirtual
は、無効化される可能性のある関数とクラス不変条件だけです。あなたはまだCの問題について心配する必要があります:memcpy
同じリソース(ファイル記述子、ヒープへのポインター、ロックなど)を使用して複数のオブジェクトを作成します。両方のオブジェクトは、そのリソースを排他的に制御していると想定し、後でリソースを削除/解放/解放しようとします。