- 1. 概要
- 2. 暗黙のコンストラクタ・明示的コンストラクタによる違い
1. 概要
この項は、C言語でなく、「C++」の言語仕様になります。
「C/C++」に関しては、人に教えるくらいはできると思っていますが・・・。
まだまだ、甘いといいますか、知らない言語仕様がありました。
2. 暗黙のコンストラクタ・明示的コンストラクタによる違い
下記のようなソースを書いていて
#include <stdio.h>
struct Hoge
{
int i;
char c;
char dummy[3];
};
int main(int argc, char* argv[])
{
struct Hoge hoge = Hoge();
struct Hoge fuga;
printf("hoge i -> %d\n", hoge.i);
printf("hoge c -> %d\n", hoge.c);
printf("fuga i -> %d\n", fuga.i);
printf("fuga c -> %d\n", fuga.c);
return 0;
}
実行した場合、15~16行の出力も、18~19行の出力も、同じようなもの(不定値になるので何が出力されるのかわからん)になると思っておりました。
あにはからんや・・・。
実行してみると・・・。
hoge i -> 0
hoge c -> 0
fuga i -> -5168
fuga c -> -1
これは、12行目と、13行目の宣言の違いによるものだそうで・・・。
12行目は、明示的にコンストラクタを呼んでいるために、初期化が働いて、0 になるそうなのです。
13行目は、暗黙のコンストラクタになっているため、初期化されることはなく不定値がはいったままになるそうです。
まぁ、この場合も
#include <stdio.h>
struct Hoge
{
int i;
char c;
char dummy[3];
};
int main(int argc, char* argv[])
{
struct Hoge hoge = Hoge();
struct Hoge fuga = {};
printf("hoge i -> %d\n", hoge.i);
printf("hoge c -> %d\n", hoge.c);
printf("fuga i -> %d\n", fuga.i);
printf("fuga c -> %d\n", fuga.c);
return 0;
}
のように明示的に初期化を行えば、以下の結果が得られるわけですが・・・。
hoge i -> 0
hoge c -> 0
fuga i -> 0
fuga c -> 0
|
      |