C++、コンパイラは主にBCC551
class及びstructでは期待の値が得られましたが、unionでは良く分からない値で初期化
されました。
この期待外れの処理はコンパイラのバグか仕様なんでしょうか?
/* test.cpp */
#include <ostream>
using namespace std;
union test{
int a,b;
test(const int& a_ = NULL,const int& b_ = NULL):a(a_),b(b_){}
void out(){
cout << a << ',' << b << endl;
}
};
int main(){
test a;
test b(5,10);
test c = test(20,30);
a.out();
b.out();
c.out();
return 0;
}
/* EOF */
出力は、以下のようになりました。
0,0
10,10
30,30
class,structで代用出来ますが、変わった処理だったんで気になったて質問しました。
あと初期化というより引数自体に問題があるのか、
test( ~ ){ a = a_; b = b_; }
こういうかき方でも結果は同じでした。
バグでも仕様でもありません。おそらくあなたの勘違いでしょう。
unionの意味分かっていますか?
class, struct とは全然別物です。
unionは、ブロックで囲まれた中にあるメンバ変数はそれぞれ、別名のようなものです。
union test1{
int a,b;
}
は、test1::a と test1::b は同じ領域を示します。
test1 foo;
foo.a = 100;
cout << foo.b << endl; // 100
foo.b = 200;
cout << foo.a << endl; // 200
C++の union は、コンストラクタやメンバ関数は持てますが、仮想関数や
静的データメンバが持てなかったり、継承できない点が struct と異なります。
> test(const int& a_ = NULL,const int& b_ = NULL):a(a_),b(b_){}
NULL はポインタに使う値であり、int型変数に使うべきではありません。
test(const int& a_ = 0, const int& b_ = 0):a(a_),b(b_){}
のようにすべきです。
さて、test b(5,10); としたとき、
b.a = 5;
b.b = 10;
となりますが、ここで、b.a と b.b は同じ領域を指しているので、
b.a = 5;
b.a = 10;
としているのと同じことになります。
結果的に、後に行なった代入が残るので、
cout << b.a << , << b.b << endl; // 10, 10
となります。
> NULL はポインタに使う値であり、int型変数に使うべきではありません。
NULL 参照のつもりだったりする?
C++ に NULL 参照はありません(NULL ポインタを参照外しすれば作れるけど、作るべき
ではありません)。
unionの意味を理解していなかった様です。
ありがとうございました。