解決済みの質問
質問:No.7389004
困ってます
お気に入り投稿に追加する (0人が追加しました)
回答数6
閲覧数2265
C++ 構造体の一括初期化 {0}
構造体変数に {0} を代入すると、CString は空文字、 intは0に一括で初期化されるようです。
なんでこんなことが出来るのでしょう?
{0}は何?
仕組みを教えて下さい!!
投稿日時 - 2012-03-28 17:50:26
質問者が選んだベストアンサー
回答:No.3
> 一括初期化関数でも作るしかなさそうですね
static変数を初期化用に用意しておくのはいかが?
http://oshiete.goo.ne.jp/qa/2658268.htmlより
>静的記憶域期間をもつオブジェクトを明示的に初期化しない場合、
>次の規定に従う。
>a) そのオブジェクトの型がポインタ型の場合、空ポインタに初期化する。
>b) そのオブジェクトの型が算術型の場合、(正または符号なしの)0に初期化する。
>c) そのオブジェクトが集成体の場合、各メンバにa)~d)の規定を(再帰的に)
>適用し初期化する。
>d) そのオブジェクトが共用体の場合、最初の名前つきメンバにa)~d)の規定を
>(再帰的に)適用し初期化する。

なので、zero初期化されていることが、規格で保証されます。

typedef struct hoge_struct
{
 int a;
 int b;
} hoge_struct;

static hoge_struct initializer; //初期化用変数。値は変えない。

int main(void)
{
 hoge_struct hoge;
 hoge = initializer;
 return 0;
}
真っ白に何度も初期化したいなら、こんな感じでどうでしょう?
関数を用意して初期化すると、構造体のメンバが増えると関数も修正しないといけない
ですが、これだと関数を変更しなくてすむし。
投稿日時 - 2012-03-29 10:45:47
この回答を支持する
(現在0人が支持しています)
お礼
なるほど!2個用意するんですね!
投稿日時 - 2012-04-01 00:09:34
この質問は役に立ちましたか?
1人が「このQ&Aが役に立った」と投票しています
ベストアンサー以外の回答
回答:No.6
> 構造体変数に {0} を代入すると

{0}を代入することは原則としてできませんが、initializer_listということなら可能です。

std::vector<int> v;
v = {0};

といったことができますから。
ただし、代入後は1要素だけになってしまいます。
(その構造体とやらをどんな仕様にするかにもよりますが...)
投稿日時 - 2012-03-30 20:31:08
この回答を支持する
(現在0人が支持しています)
回答:No.5
> {0}は何?

{0}で初期化というのは、C言語の時からある手法ですね。
なにやら予約語のようにも見えますが、ただのカッコ0です。

例えば、初期化済み配列を宣言するとします。

int a[2] = {1,2};

これはa[0]=1,a[1]=2で初期化されるのは分かりますよね。
では、数が合わないとき

int a[2] = {1};

こんなとき、不足分は0で初期化されることが規格で保証されています。
つまり、a[0]=1,a[1]=0ですね。

ですから、全て0で初期化する場合は、

int a[2] = {0};

とすれば良いわけです。
数が多くても、型が違っても同様です。

char buf[128] = {0}; // ゼロで初期化

このことを知っていると理解しやすいと思いますがいかがでしょう。
投稿日時 - 2012-03-29 15:27:29
この回答を支持する
(現在0人が支持しています)
回答:No.4
#3 をもうちょっと進めて
struct hoge_struct
{
 int a;
 int b;
 static const hoge_struct initializer;
};

static const hoge_struct hoge_struct::initializer; //初期化用変数。値は変えない。
のようにすると, グローバル名前空間の名前が 1つ減る.
投稿日時 - 2012-03-29 13:46:59
この回答を支持する
(現在0人が支持しています)
お礼
これは・・・?
どう使うんでしょう?
投稿日時 - 2012-04-01 00:12:44
回答:No.2
初期化のときにしか使えなくても
こういうこともできるけど。

構造体変数 = (構造体の型){0};
投稿日時 - 2012-03-28 23:53:02
この回答を支持する
(現在0人が支持しています)
お礼
なるほど!
コピーしてしまうわけですね。賢いです!
投稿日時 - 2012-04-01 00:05:26
回答:No.1
> 構造体変数に {0} を代入すると
代入の右辺に {0} はかけないと思うけど。少なくとも私の環境ではコンパイルエラーになる。
初期化なら右辺に {0} を書くことができる。
この違いは分かるかな?

> なんでこんなことが出来るのでしょう?
規格で決まっているから。
規格そのものの文章は知らないけど以下に説明があります。
http://www.kijineko.co.jp/node/681
投稿日時 - 2012-03-28 18:07:09
この回答を支持する
(現在0人が支持しています)
お礼
有難うございます。初期化の時だけでしたね。

ループの中で一括で初期化できれば便利だと思ったのですが、
一括で初期値に戻すのは無理みたいです。

一括初期化関数でも作るしかなさそうですね。
投稿日時 - 2012-03-28 18:30:56
もっと聞いてみる
関連するQ&Aはこちら
VC++6.0で typedef struct { int i; CString s; } StructTest; という構造体を作ったとして const StructTest m_STest...
printfで表示したアドレス値を、int変数に代入するのが目的です。 #include <iostream> using namespace std; main(){ char buf[20];...
タイトル通りです。やり方がわかりません。 構造体変数の初期化や多次元配列の初期化が載ってるページは多いのですが、コレだけは調べても解りませんでした。 typedef struct{ int flag...
この他の関連するQ&Aをキーワードで探す
プログラミングのサブカテゴリ
カテゴリ:C・C++
RSS
-PR-
PR
-PR-