2013-07-20 2 views
3

내가 값 초기화의 개념을 이해하려면이 페이지를 읽고있다 http://en.cppreference.com/w/cpp/language/value_initialization사용자 정의 생성자와 암시 적 기본 생성자

값 초기화의 효과는 다음과 같습니다

  • 은 T는 경우 모든 종류의 사용자 제공 생성자가 하나 이상있는 클래스 유형의 경우 기본 생성자가 호출됩니다.

하지만이있을 경우 적어도 사용자 정의 생성자, 다음 컴파일러는 암시 적 기본 생성자를 생성하지 않음을 설명하는 다른 소스와 직접 모순 것 같다 (같은 표현 "T의 t;" 컴파일되지 않습니다). 어떤 설명도 환영합니다.

답변

3

이 컨텍스트의 "기본 생성자"는 매개 변수가 없거나 선택적 매개 변수 만 있기 때문에 인수를 허용 할 수없는 생성자를 의미합니다.

"암시 적 생성자"는 자동으로 생성되는 생성자를 의미합니다. 이것은 args가없는 생성자, 복사 생성자 또는 (C++ 11 현재) 이동 생성자가 될 수 있습니다.

따라서 모순이 없습니다. T가 사용자 제공 생성자가있는 클래스 유형이면 value initialization은 기본 생성자를 호출합니다. (다른 생성자를 정의했기 때문에 생성자를 지정하지 않았기 때문에) 존재하지 않거나 액세스 할 수없는 경우 (private 또는 protected로 표시 한 다음 해당 함수를 사용할 수없는 곳에서 사용했기 때문에) 초기화가 잘못되어 컴파일러가 코드를 거부합니다. 그것이 선언되었지만 정의되지 않았다면 프로그램은 링크되지 않습니다. 이 복사 생성자 = default;

+0

을 정의 할 수 있어요 그리고 뭔가를 호출 할 경우, 존재하지 않기 때문에 C++ 11 단어 "기본"이후

는, 아마도 다소 모호 프로그램이 컴파일되지 않습니다. 여전히 * *라고 불리며, 누락되어 오류가 있습니다. – Yakk