2011-11-08 7 views
1

클래스 자체에 클래스 인 인스턴스 멤버가있는 경우 생성자는 항상 생성자 이니셜 라이저 목록에 초기화를 제공해야합니까?클래스 인스턴스 멤버 초기화

내 코드에 따라 매우 긴 이니셜 라이저 목록이 나타나는 경우가 있습니다. 나는 그것이 부끄러워 보이기 때문에 묻는다. 그러나 그것이 그것이 그 다음 잘게되면 그것은 멋지다.

도 상수 인스턴스 멤버 변수의 경우와 동일합니까?

+0

이전 질문에 대한 코드를 보면 취향을 바꿔야한다고 생각합니다. 긴 initializer리스트를 통해 생성자 본문에 초기화의 긴 목록을 선호해서는 안됩니다. 좋아요. 그래서'x (y) '는'x = y;'에 익숙해지면 익숙한 맛이납니다. –

답변

1

의 경우 기본 생성자가이 아닌 모든 멤버를 으로 초기화해야합니다. 초기화 목록에서 멤버를 생략하면 기본 생성자가 사용됩니다 (또는 해당 값은 기본 유형에 대해 정의되지 않습니다). 기본 유형 (int, pointers)에 대한

,을 초기화하지 않는 법이지만, 그 값은 정의되지 않은 될 것입니다.

마지막으로 은 다른 개체 (std::string&)에 대한 참조을 초기화해야합니다.

자세한 내용은 this answer을 참조하십시오.

또한 클래스에 구성원이 많은 경우 여러 개의 작은 클래스로 나누어야한다는 징후가있을 수 있습니다. 가장 좋은 방법은 하나의 책임 만있는 클래스를 갖는 것입니다 (single responsibility principle 참조).

+0

상수는 무엇입니까? – SirYakalot

+0

컴파일러는 에러를냅니다 : '오류 : 초기화되지 않은 멤버 'A :: num' 'const'type 'const int '' – Antoine

+0

... 초기화리스트에서 항상 상수를 초기화해야합니까? 그게 유일한 방법 이니? – SirYakalot

2

매개 변수가없는 기본 생성자가있는 경우 명시 적으로 초기화하지 않아도됩니다.

상수 인스턴스의 경우 기본 초기화가 필요하지 않습니다. 그래서 초기화 할 무언가가 없다면, 그것들을 가지고있는 것이 합리적이지 않을 것입니다. (그러나 당신이하고있는 것이 무엇이든간에 그것은 가능합니다.

+0

다음과 같이 헤더 파일에 상수를 넣으면 : const int BLAH = 1; 오류가 발생하여 컴파일러를 조용히하는 initialiser 목록에 넣어야한다고 가정했습니다. 잘못인가? – SirYakalot

+0

그리고 클래스 유형의 인스턴스 멤버는 항상 기본 생성자가 없으면 초기화 프로그램 목록에 있어야한다고 말하는 것입니까? – SirYakalot

+0

@SirYakalot - 첫 번째 질문에 대해서는 실제로 코드를 보지 않고도 대답 할 수 있는지 확신 할 수 없습니다. 두 번째 질문은 매개 변수에 대한 기본값이 없으면 컴파일러에서 'classname :: classname()'호출에 대해 오류 : 일치하는 함수가 없습니다. 참고 - 이것은 ** 자신 만의 수업 **입니다. 내장 된 유형 및 대부분의 STL 클래스에는 기본 생성자가 있습니다. – littleadv

관련 문제