2013-06-02 3 views
1

새로운 Stroustrup 책의 17 장을 살펴보고 초기화 목록으로 클래스를 초기화하여 혼란 스럽습니다.C++ 클래스 초기화 목록 예제

예 : .HPP에

:

class A 
{ 
    public: 
     A() : _plantName(std::string s), _growTimeMinutes(int 1); 
     virtual ~A(); 

    private: 
     std::string _plantName; 
     int _growTimeMinutes; 
}; 
.CPP에

:

A::A() : _plantName(std::string s), _growTimeMinutes(int i) 
{ 

} 

또는 .CPP 그것을이다

A::A(std::string s, int i) : _plantName(std::string s), _growTimeMinutes(int i) 
{ 

} 

그 호출 :

A a {"Carrot", 10}; 

저는 1998 년에 C++을 배웠으며 최근까지도 그 프로그램을 몇 년 동안 꺼내어 프로그래밍했습니다. 이 물건들은 얼마나 오래 전에 바뀌 었습니까? 나는 아직도 그 오래된 방법을 할 수 있지만 나는 정말로 새로운 것을 배우고 싶다는 것을 압니다!

+0

같은 새를 만들어야합니다

A::A(std::string s, int i) : _plantName(s), _growTimeMinutes(i) { } 

귀하의 시간 파일이 있어야합니다. 버팀대 초기화가 아닙니다. – chris

+0

이것을 편집하여 실제 질문이 무엇인지 명확히 해 주실 수 있습니까? 다양한 생성자 구현 및 선언은 존재하지 않는 멤버를 초기화하려고하므로 요청한 부분을 말하기 어렵습니다. –

+0

아마도 도움이 될 것입니다 : http://stackoverflow.com/questions/1711990/what-is-this-weird-colon-member-syntax-in-the-constructor – chris

답변

1

이 _plantName 및 _growTimeMinutes 클래스 A 또는 그의 슈퍼 클래스 중 하나에 선언 된 변수를 상정 예

위한

A::A(std::string s, int i) : _plantName(s), _growTimeMinutes(i) { 

} 

이어야한다. s 및 i가 클래스 A의 생성자 매개 변수이면 초기화는 인수가있는 _plantName의 문자열 생성자를 호출하고 인수가 i 인 _growTimeMinutes의 int 생성자를 호출하여 두 변수를 모두 초기화합니다.

const 참조를 초기화하려면 초기화 목록이 특히 필요합니다. 생성자 내의 할당은 작동하지 않습니다. 내가

+0

Pedantic, 어쩌면,하지만 그것은 정수가 없기 때문에 int 생성자를 호출 할 수 없습니다. – chris

+0

그리고 헤더가 맞습니다. 헤더 (http://stackoverflow.com/questions/7665021/c-member-initialization-list)에 넣어 두지 않았지만 헤더에 다른 예제가 있습니다. 너무 (http://www.geeksforgeeks.org/when-do-we-use-initializer-list-in-c/) – Jason

+0

@chris 당신은 절대적으로 옳습니다. int는 필수 데이터 유형이므로 기술적 인 의미에서는 실제 생성자가 아닙니다. 나는이 경우 명확하게하기 위해이 용어를 사용했다. – voidpointercast

4

먼저 도움을 줄 수

희망은 당신이 다음 기본 생성자 실제 assignement를 호출 피할 때문에 매개 변수로 물체를 통과 할 때 상수 멤버를 처리 한 경우 또는 초기화리스트가 유용하다 생각합니다.

cpp 파일에 다음 코드를 작성해야합니다. 초기화 목록의 매개 변수 유형을 다시 작성할 필요가 없습니다.

class A 
{ 
    public: 
     A(std::string, int); 
    private: 
     std::string _plantName; 
     int _growTimeMinutes; 
}; 

당신은 객체 그 긴 C++ 11 전에 주변에 있었다 그

A new_object("string", 12); 
+0

명확화 지점으로 인해 속도 상 이점이있을 수있는 것처럼 보입니다. Stroustrup은 다음과 같이 보여줍니다 :'double d2 {2.3}; '사용자 정의 타입에 대해 그렇게 할 수 없습니까? 따라서 당신이 그것을 위에 적어 놓은 방식입니까? – Jason

+2

그 표기법을 알지 못했습니다. 두 양식을 모두 쓸 수있는 것으로 보이며, 대부분의 경우에 동등 할 것입니다. [이 스레드] (http://stackoverflow.com/questions/9976927/when-to-use-the-brace-enclosed-initializer)를 읽어보십시오. –

+0

그래서 지금 내가 배우고있는 것은 _plantName과 _growTimeMinutes가 A()가 확장하는 다른 클래스의 일부이기 때문에 나는이 다른 것에 대해 생각할 필요가있다. – Jason