アプリ版:「スタンプのみでお礼する」機能のリリースについて

構造体変数に {0} を代入すると、CString は空文字、 intは0に一括で初期化されるようです。
なんでこんなことが出来るのでしょう?
{0}は何?
仕組みを教えて下さい!!

A 回答 (6件)

> 一括初期化関数でも作るしかなさそうですね


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;
}
真っ白に何度も初期化したいなら、こんな感じでどうでしょう?
関数を用意して初期化すると、構造体のメンバが増えると関数も修正しないといけない
ですが、これだと関数を変更しなくてすむし。
    • good
    • 1
この回答へのお礼

なるほど!2個用意するんですね!

お礼日時:2012/04/01 00:09

> 構造体変数に {0} を代入すると



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

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

といったことができますから。
ただし、代入後は1要素だけになってしまいます。
(その構造体とやらをどんな仕様にするかにもよりますが...)
    • good
    • 1

> {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}; // ゼロで初期化

このことを知っていると理解しやすいと思いますがいかがでしょう。
    • good
    • 6

#3 をもうちょっと進めて


struct hoge_struct
{
 int a;
 int b;
 static const hoge_struct initializer;
};

static const hoge_struct hoge_struct::initializer; //初期化用変数。値は変えない。
のようにすると, グローバル名前空間の名前が 1つ減る.
    • good
    • 0
この回答へのお礼

これは・・・?
どう使うんでしょう?

お礼日時:2012/04/01 00:12

初期化のときにしか使えなくても


こういうこともできるけど。

構造体変数 = (構造体の型){0};
    • good
    • 0
この回答へのお礼

なるほど!
コピーしてしまうわけですね。賢いです!

お礼日時:2012/04/01 00:05

> 構造体変数に {0} を代入すると


代入の右辺に {0} はかけないと思うけど。少なくとも私の環境ではコンパイルエラーになる。
初期化なら右辺に {0} を書くことができる。
この違いは分かるかな?

> なんでこんなことが出来るのでしょう?
規格で決まっているから。
規格そのものの文章は知らないけど以下に説明があります。
http://www.kijineko.co.jp/node/681
    • good
    • 0
この回答へのお礼

有難うございます。初期化の時だけでしたね。

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

一括初期化関数でも作るしかなさそうですね。

お礼日時:2012/03/28 18:30

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A