私はこれを持っていますstruct
:
struct Snapshot
{
double x;
int y;
};
私は0 になりたいx
と思っy
ています。デフォルトで0になるのでしょうか。
Snapshot s = {0,0};
構造をゼロにする他の方法は何ですか?
私はこれを持っていますstruct
:
struct Snapshot
{
double x;
int y;
};
私は0 になりたいx
と思っy
ています。デフォルトで0になるのでしょうか。
Snapshot s = {0,0};
構造をゼロにする他の方法は何ですか?
回答:
構造体を初期化しない場合、これらはnullではありません。
Snapshot s; // receives no initialization
Snapshot s = {}; // value initializes all members
2番目はすべてのメンバーをゼロにし、最初のメンバーは指定されていない値のままにします。再帰的であることに注意してください:
struct Parent { Snapshot s; };
Parent p; // receives no initialization
Parent p = {}; // value initializes all members
2番目はp.s.{x,y}
ゼロになります。構造体にコンストラクターがある場合、これらの集約初期化子リストは使用できません。その場合は、これらのコンストラクターに適切な初期化を追加する必要があります
struct Snapshot {
int x;
double y;
Snapshot():x(0),y(0) { }
// other ctors / functions...
};
xとyの両方を0 x(), y()
に初期化します。これらを使用して、タイプに関係なくそれらを初期化できることに注意してください。これが値の初期化であり、通常は適切な初期値(intの場合は0、doubleの場合は0.0、ユーザー定義のデフォルトコンストラクターを呼び出します)ユーザーが宣言したコンストラクタを持つ型、...)。これは、構造体がテンプレートの場合は特に重要です。
Snapshot s = {};
非PODメンバー(ゼロ化)で機能しますか?
いいえ、デフォルトでは0ではありません。すべての値またはデフォルトが0であることを確認する最も簡単な方法は、コンストラクターを定義することです。
Snapshot() : x(0), y(0) {
}
これにより、スナップショットのすべての使用で初期化された値が確保されます。
一般的には違います。ただし、/スコープ/関数でファイルスコープまたは静的として宣言された構造体は、(これらのスコープの他のすべての変数と同様に)0に初期化されます。
int x; // 0
int y = 42; // 42
struct { int a, b; } foo; // 0, 0
void foo() {
struct { int a, b; } bar; // undefined
static struct { int c, d; } quux; // 0, 0
}
PODを使用すると、次のように書くこともできます。
Snapshot s = {};
C ++ではmemsetを使用しないでください。memsetには、構造体に非PODがある場合、破壊されるという欠点があります。
またはこのように:
struct init
{
template <typename T>
operator T * ()
{
return new T();
}
};
Snapshot* s = init();
SomeType foo();
は、通常のctorのように見えるもの(他のものでも発生する可能性foo
がありますSomeType
)を関数定義(その場合、を返す関数)に変換します。ネクロは申し訳ありませんが、誰かがこれに遭遇した場合は、私が答えると思いました。
C ++では、引数のないコンストラクターを使用します。Cではコンストラクターを使用できないため、memset
または興味深いソリューション-指定された初期化子を使用します。
struct Snapshot s = { .x = 0.0, .y = 0.0 };
正解は、それらの値は未定義であると考えています。多くの場合、デバッグバージョンのコードを実行すると、これらは0に初期化されます。これは通常、リリースバージョンを実行している場合には当てはまりません。
0
は、メモリ内のこれらの場所にすでに存在します。これは初期化と同じではありません!
これはPOD(基本的にはC構造体)なので、Cの方法で初期化しても害はほとんどありません。
Snapshot s;
memset(&s, 0, sizeof (s));
または同様に
Snapshot *sp = new Snapshot;
memset(sp, 0, sizeof (*sp));
calloc()
ただし、C ++プログラムで使用することはできません。
ポッドメンバーを基本クラスに移動して、初期化子リストを短くします。
struct foo_pod
{
int x;
int y;
int z;
};
struct foo : foo_pod
{
std::string name;
foo(std::string name)
: foo_pod()
, name(name)
{
}
};
int main()
{
foo f("bar");
printf("%d %d %d %s\n", f.x, f.y, f.z, f.name.c_str());
}