2017-09-05 4 views
1

저는 C++에서 잠시 떨어져 있었고 정의 된 클래스의 private 멤버 변수 (있는 경우)의 두 기본 생성자 초기화 사이의 차이를 확인하려고합니다. 구현은 별도의 파일에 있지만 클래스 정의는 헤더 파일에 있습니다. 모든 private 멤버 변수는 "0"또는 의미없는 값으로 초기화되어야합니다.Constructor (C++)의 개인 멤버 초기화 차이점

참고

int 데이터 [MAX_SIZE] 고정 크기가 시간 배열을 컴파일한다. int used : 배열의 인덱스 추적기입니다.

// Default Constructor 
IntSet::IntSet() : used(0) 
{ 
    data[MAX_SIZE-1] = {0}; 
} 

인가가 : 완전히 다른 구문을

// Default Constructor 
IntSet::IntSet() 
{ 
    data[MAX_SIZE-1] = {0} 
    used = 0; 
} 

좀 레거시 코드를 빗질하고있어 찾는 :

일반적으로 나는 다음과 같은 방법으로 멤버를 초기화에 익숙해있어, 말하기 최종 결과의 차이점은 무엇입니까?

+0

두 번째 발췌 문장에서와 같이 [이니셜 라이저 목록] (http://en.cppreference.com/w/cpp/language/initializer_list)을 선호하십시오. VLAs는 C++에서 허용되지 않습니다. – Ron

+0

여기에 VLA가 사용되지 않습니다. 모든 일은 '데이터'의 마지막 값을 0으로 설정하는 것입니다. – user4581301

답변

5

구성원은 생성 될 때 초기화되고 전에 앞에 생성자의 본문에 도달합니다. 서로 다른 경우가 있습니다. 예를 들면 :

  • 회원이 CONST 또는 참조가,이 이니셜 라이저 목록에 초기화되어야하고, 회원이 디폴트 생성자가없는 경우 생성자 몸

  • 초기화 할 수없는 경우 (또는 액세스 권한이없는 경우) 생성자를 제공해야합니다. 생성자는 인수를 사용해야하며 이니셜 라이저 목록에서만 수행 할 수 있습니다.

  • 오브젝트가 "크고 비싸다"면 오브젝트를 구성하고 할당 연산자를 사용하여 비효율적으로 작업을 수행 할 수 있습니다. (오히려 동시에 초기 값을 구성하는 이상.) 기준에 상기 제한 주어 기본적 구조는 간단하다 때문에 어느 쪽 상당 바와 같은 정수 및 프리미티브 POD 유형의

, const 등

+0

부록 : [Member Initializer List] (http://en.cppreference.com/w/cpp/language/initializer_list)에 대한 추가 정보 – user4581301

+0

감사합니다. 설명 및 다른 독서에 대한 참조. 정말 감사합니다! "used"를 "0"으로 설정하는 동안 배열의 모든 요소를 ​​NULL 값으로 초기화하는 더 좋은 방법이 있습니까? –

+0

@AlexanderMaxwell 생성자 이니셜 라이저 목록에서 배열을 초기화 할 수 없습니다. 이를 위해서는 각 요소를 NULL로 초기화하는 데 for 루프 또는 동등한 루프를 사용해야합니다. –