unionのコンストラクタでメンバ変数の初期化 – プログラミング – Home

unionのコンストラクタでメンバ変数...
 
通知
すべてクリア

[解決済] unionのコンストラクタでメンバ変数の初期化


sulume
 sulume
(@sulume)
ゲスト
結合: 19年前
投稿: 6
Topic starter  

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


引用未解決
トピックタグ
sulume
 sulume
(@sulume)
ゲスト
結合: 19年前
投稿: 6
Topic starter  

class,structで代用出来ますが、変わった処理だったんで気になったて質問しました。

あと初期化というより引数自体に問題があるのか、
test( ~ ){ a = a_; b = b_; }
こういうかき方でも結果は同じでした。


返信引用
RAPT
 RAPT
(@RAPT)
ゲスト
結合: 22年前
投稿: 310
 

バグでも仕様でもありません。おそらくあなたの勘違いでしょう。

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
となります。


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

> NULL はポインタに使う値であり、int型変数に使うべきではありません。

NULL 参照のつもりだったりする?
C++ に NULL 参照はありません(NULL ポインタを参照外しすれば作れるけど、作るべき
ではありません)。


返信引用
sulume
 sulume
(@sulume)
ゲスト
結合: 19年前
投稿: 6
Topic starter  

unionの意味を理解していなかった様です。
ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました