2011-08-29 2 views
1

NumericType Values (10, 3.1416, 20)의 값은 개체가 구성된 후에 20, 3.1416, 20이됩니다. union의 생성자에 대한 동작이 정의되어 있습니까?union에서 생성자가 정의되지 않은 동작을 일으키는 경우?

union NumericType 
{ 
    NumericType() {} 

    NumericType(int i, double d, long l) 
    { 
     iValue = i; 
     dValue = d; 
     lValue = l; 
    } 

private: 
    long  lValue; 
    int   iValue; 
    double  dValue; 
}; 


int main() 
{ 
    union NumericType Values (10, 3.1416, 20); 
} 
+0

당신은'노동 조합 '이 무엇인지 이해하지 못한다고 생각합니다. –

답변

2

당신이하고있는 것이 의미가 없습니다. 그것은 노동 조합이기 때문에 같은 영역의 메모리에 3 번 할당하고 있습니다. 마지막으로의 생성자에서 lvalue에 할당했기 때문에 모든 것이 그대로 유지됩니다. 세 변수는 모두 같은 위치에 있고 동일한 메모리를 사용합니다 (단, dValue은 다른 두 바이트보다 4 바이트 더 많이 사용합니다).

struct이 아닌 union이 필요합니다 (struct에 있기 때문에 모든 변수가 별도이고 다른 변수는 다른 변수에 영향을 미치지 않으므로).

Here's a good visualization (이 블록은 메모리의 한 8 바이트 청크 아닌 3 명심)

조합 공유 메모리 요소가 있으므로 생성자를 가지는 것을 명심

http://i.msdn.microsoft.com/dynimg/IC66560.gif

1

베어 어느 그들 모두를 초기화하면 정보가 버려집니다.

즉, 이것은 유효하지 않은 C++입니다.

+0

노조를 초기화하는 올바른 방법은 무엇입니까? 항상 첫 번째 요소가되어야합니까, 아니면 어떤 것이 될 수 있습니까? –

+0

초기화 유형 (있는 경우)은 컴파일러에 따라 다릅니다. –

+0

@Kerrek 노동 조합의 적절한 초기화는 반지입니다. –

관련 문제