2011-11-20 18 views
5

answer, C++ 03에서 ()을 생략하면 POD 유형이 기본값으로 초기화되고 그렇지 않으면 값 초기화됩니다.기본 초기화 대 값 초기화

// POD type 
struct foo { 
    int x; 
}; 

// value-initialized 
new foo(); 

그러나 사용자 정의 생성자가 제공되면 아래의 개체 중 하나라도 기본값 또는 값으로 초기화되는 것으로 간주됩니까?

// non-POD type 
struct bar { 
    bar(int x = 0):x(x) {} 
    int x; 
}; 

new bar(); 
new bar(42); 
+1

예에서 'bar'의 생성자를 호출하면 'x'를 초기화하는 동안 값을 제공하게됩니다. – Chad

답변

2

클래스에 사용자 정의 기본 생성자가있는 경우 기본 및 값 초기화 모두 해당 생성자가 호출됩니다. 무엇이든 다음에 일어날 생성자에 달려있다 :

struct UDT 
{ 
    int a; 
    int b; 
    Foo c; 
    Foo d; 
    UDT() : a(), c() {} 
}; 

이니셜 라이저 목록이 그렇게 말한다 때문에 (그래서 a가 제로) UDT::aUDT::c 값 초기화 원인이 될 것이다 클래스 UDT의 객체 모두 기본 및 값 초기화, UDT::bUDT::d은 기본적으로 초기화되므로 (b은 초기화되지 않으며 d은 동일한 논리를 재귀 적으로 적용 함)

초기화에 대한 자세한 내용은 8.5를 참조하고 이니셜 라이저 목록에서는 12.6.2 (특히 8 절)를 참조하십시오.

3

C++ 03에서는()을 생략하면 POD 유형이 기본값으로 초기화되고 그렇지 않으면 값 초기화됩니다.

정확히 어떤 일이 발생하지 않습니다. C++ 03 스펙 8.5/9 절에 따르면 비 정적 POD 유형 오브젝트에 대해 초기화자가 지정되지 않은 경우, 해당 오브젝트와 해당 서브 오브젝트는 "불확정 초기 값을가집니다". 즉, 이 아니고이 기본값 초기화와 같습니다. 디폴트 초기화는 POD 유형의 값 초기화와 동일합니다. 즉 객체가 제로 (8.5/5)로 초기화되었지만 빈 이니셜 라이저 (예 : 빈 괄호 8.5/7 당). 따라서 빈 이니셜 라이저가있는 POD 유형 만 기본값 및/또는 값 초기화 할 수 있습니다. 초기자를 지정하지 않으면 비 정적 POD 유형의 기본 초기화가 발생하지 않습니다.

두 번째 예에서는 사용자 정의 생성자가있는 POD 유형이 아닌 경우 value-initializer (괄호) 기호를 생략하면 default-initialization이 기술적으로 발생합니다. 즉 :

bar* ptr_a = new bar; //default initialization 
bar* ptr_b = new bar(); //value initialization 

은 명심 비 POD 구조체 또는 두 클래스 유형, 8.5/5 당 사용자 정의 생성자, 기본 초기화 및 값 초기화가 존재하는 경우, 모두 호출하지만 사용자 정의 생성자. 결국, 타입이 bar으로 선언되었으므로, 디폴트와 값 초기화는 똑같은 일을 끝냅니다.