2014-01-20 3 views
1

std::vector<Object *>을 고정 크기로 초기화하는 방법을 찾았습니다. 나중에 더 이상 변경할 필요가 없기 때문에. documentation에 따르면 두 번째 요소는 새로운 요소로 복사됩니다 기본을 지정하는 데 사용할 수 있습니다기본 유형의 기본 값 :

mControllerItem.resize(nLines, nullptr); 

, 그러나 이것은 선택 사항입니다 : 그래서이 코드를 사용하고 (벡터 전에 비어). 두 번째 인수가 제공되지 않으면 기본 생성자가 사용됩니다.

포인터, int 등 기본 유형의 경우 여기에 사용 된 것은 무엇입니까? 링크에서 그것에 대해 아무 말도하지 않습니다. 그들은 0으로 초기화 될 것인가, 정의되지 않은 상태로 유지 될 것인가, 또는 그들이 얻을 값을 결정하는 다른 메커니즘이 있는가? 링크의 예에서 출력은 0입니다. 따라서이 매크로가 iniatliezed라고 가정합니다. 그러나이 매크로는 정의 되었습니까 (또는 정의되지 않았습니까?)?

+0

그래서 // 기본 생성자가 호출되지 않습니다 'std :: vector v (nLines, nullptr); ' – Borgleader

+0

@Borgleader Thx! 나는 그것을 바꿨다. 차이가 있습니까? – Devolus

+0

0으로 초기화됩니다. – user3125280

답변

6

표준은 resize일 때 값을 초기화 할 것을 규정하고 있습니다. 여기에있는 동작은 완벽하게 정의되어 있습니다. 간단한 측면에서

는 값 초기화 의미 : 클래스 유형에 대한

  • 는 기본 생성자가 호출; 만일 어떤 생성자도 제공되지 않았다면, 어떤 멤버 타입 T의 스칼라에 대해서 각 멤버는 (재귀 적으로)
  • 값 초기화되고, 값은 (T)0으로 주어진다 (T가 포인터라면 사용 된 값은 이식 가능할 것이다)
+0

@MikeSeymour : 감사합니다. – Jon

3

동작은 C++ 03과 C++ 11에서 약간 다르게 정의됩니다. 전자에서는 값으로 초기화 된 객체가 만들어지고 벡터의 새 요소가 그로부터 복사 생성됩니다. 새 버전에서는 새 요소가 직접 값으로 초기화됩니다.

포인터와 같은 기본 제공 유형의 경우 값 초기화는 제로 초기화와 같으므로 실제로 두 가지 표준 버전 모두에서 요소가 0으로 보장됩니다.

기본 생성자가 사용된다고 가정 할 때 실제로는 정확하지 않습니다. 사용자 정의 유형에만 해당합니다. value-initialization 구문은 사용자 정의 유형에 대한 기본 생성자를 호출하고 내장 유형에 대해서는 0으로 초기화됩니다.

1

예 포인터의 경우 NULL로 초기화됩니다. 모든 기본 형식에는 기본 생성자가 있습니다. 유일한 차이점은 다음과 같습니다.

  1. int a; 값이 정의되지 않은
  2. class C {int a; C(): a()}; // 기본 생성자가 호출되고 값이 될 것입니다 0
  3. void f(int a = int()) // 기본 생성자가 호출되고 값이 될 것입니다 0