web-dev-qa-db-ja.com

構造体にコンストラクタを追加する必要がありますか?

メンバーメソッドを持つ完全なモジュールであるクラスとは対照的に、データ構造を定義するためにc ++構造体を使用することがよくあります。深く掘り下げましたが、両者は同じであることがわかっています(大まかに言えば)。

データのみのエンティティとして構造体を頻繁に使用/処理するという事実は、デフォルトのコンストラクターも追加しないというこの衝動を生み出します。しかし、コンストラクターは常に優れており、物事をより簡単にし、エラーをなくすのに役立ちます。

デフォルトのコンストラクターをデータ構造に追加すると、不快になりますか?

defaultコンストラクターを実装すると、他の基準が満たされている場合にstruct Non-POD(プレーンな古いデータ型)も作成されますか?

物事を視点に置くには、簡単な例を考えますが、実際には構造体ははるかに大きくなります。

struct method
{
    char    name[32];
    float   temperature;
    int     duration;
};

メソッドを作成するたびに、値を設定するのを忘れた場合は(控えめに言っても)心配する必要があります。 temperatureを設定するのを忘れて、メソッドをシステムに適用すると、ランダムな高い値になり、騒乱の原因になります。または、durationを設定するのを忘れたため、メソッドが未知の高い期間にわたって適用されるようになりました。

オブジェクトを保証するコンストラクターを実装する代わりに、毎回オブジェクトを初期化する責任を負う必要があるのはなぜですか?

14
zadane

コンストラクタを構造体に追加することが適切な場合とそうでない場合があります。

コンストラクター(任意のコンストラクター)を構造体に追加すると、その構造体で集約初期化子を使用できなくなります。したがって、デフォルトのコンストラクターを追加する場合は、値を初期化するデフォルト以外のコンストラクターも定義する必要があります。ただし、常にすべてのメンバーを初期化するようにしたい場合は、それが適切です。

コンストラクター(任意のコンストラクター)を追加すると、非PODになりますが、C++ 11では、以前にPODにのみ適用されていたルールのほとんどが標準レイアウトオブジェクトに適用されるように変更され、コンストラクターを追加してもそれは壊れません。したがって、基本的には、集約初期化子だけが失われます。しかし、それはしばしば大きな損失でもあります。

13
Jan Hudec

C++ 11を使用すると

struct method
{
    char    name[32] {};
    float   temperature = 42.141521;
    int     duration = -6;
};

そして、何かを初期化するのを忘れたときはいつでも、デフォルトの初期化を取得します。

8
Vorac