2017-12-20 25 views
6
I 0으로 배열의 모든 구성원을 초기화 할

, 또는C++에서 C 배열을 초기화하는 이러한 방법에는 차이점이 있습니까?

struct Window{ int a;}; 


int main() 
{ 
    Window* list[4] = { 0, 0, 0, 0 }; 
    Window* list2[4] = {0}; 
    Window* list3[4] = {}; 
    Window* list4[4]{ 0, 0, 0, 0 }; 
    Window* list5[4]{0}; 
    Window* list6[4]{}; 
} 

nullptr 나는 임의의 값으로 적어도 하나 명의 멤버를 초기화하는 경우 다른 사람들은 모두 내가 할, 그래서 만약 제로는, 초기화 것으로 알고 있습니다 :

int list[4] = { 6 }; 

첫 번째 구성원은 6이되고 나머지는 모두 0으로 초기화됩니다. 그러나 나는 혼동 해요 :

int list[4]{0}; 

int list[4]{}; 

나는 초기화 기본 반대로 같은없이 선언 등호 직후 빈 구불 구불 한 괄호가 0 초기화를 무엇이라고한다고 가정하지만, 그래서 역시 int list[4]{0}, 그렇지 않습니까? 여기에 std::initializer_list이 숨겨져 있거나 포함되어 있지 않습니까? 나는 이것들이 non-POD 타입에만 사용되었다고 생각했기 때문에 여기서는 std::initializer_list을 사용하지 않습니까?

+1

이들은 모두 [집합 초기화] (http://en.cppreference.com/w/cpp/language/aggregate_initialization)의 다른 형태이며 동일한 최종 효과를가집니다. – Praetorian

+2

[이 사이트] (http://en.cppreference.com/w/cpp/language/value_initialization)을 좋아합니다. [초기화 프로그램]에 대한 모든 것을 설명합니다. (http://en.cppreference.com/w/cpp/ 언어/list_initialization). – lakeweb

+0

@lakeweb 감사합니다.오, C++ 03과 C++ 11의 차이점은 아주 미묘한 점입니다. – Zebrafish

답변

3

C++에서 C 배열을 초기화하는 이러한 방법에는 차이점이 있습니까?

아니요. 의미 상 동일합니다.

기본 초기화와 반대되는 제로 초기화이지만 int list [4] {0}이 아닙니까?

첫 번째 요소는 0으로 복사 초기화됩니다. 나머지 요소는 초기화 된 값이며, int은 실제로 0으로 초기화됩니다. int의 경우 특히 값, 0 및 복사 초기화가 0으로 적용되는 차이는 없습니다. 이 경우 문법적으로 구분됩니다.

std :: initializer_list가 장면 뒤에서 발생하는지 여부

std::initializer_list은 포함되어 있지 않습니다.

0

은 C++에서 배열을 저장하는 포인터를 사용하지 마십시오, 그것은 C 대신 :)

사용 컨테이너 스타일도 있습니다. 나는 항상 일반적인 목적을 위해 객체 배열을 만들기 위해 vector을 고수한다. 벡터의 초기화는 클래스 생성자를 따릅니다. Window 클래스를 조금 수정 해 드리겠습니다.

struct Window { 
    // Class constructor 
    Window(const int _a_) { 
     a = _a_; 
    } 

    // Class member 
    int a; 
}; 

std::vector<Window> windows (4, Window(0)); 

귀하의 창 a의 0으로 초기화 값으로 4 Window을 포함합니다. 희망이 답변 귀하의 질문.

+0

OP가 컨테이너를 잘 알고 있다는 것이 확실합니다. 그의 질문은 특정 언어 구조 간의 차이점에 관한 것입니다. – dasblinkenlight

+0

오, 그건 내 잘못이야. 나는 결론을 뛰어 넘어이 배열의 모든 멤버를 0으로 초기화하고 싶다. –