이 가능하면 C++ 컴파일러는, 각 클래스에 대해 생성됩니다 네 가지 기능이있다, 당신이 그들을 제공하지 않는 경우 : 기본 생성자 , 복사 생성자, 대입 연산자 및 소멸자가 포함됩니다.C++ 표준 (12 장, "특수 함수")에서 이러한 함수는 "암시 적으로 선언 된"및 "암시 적으로 정의 된"이라고합니다. 그들은 공개적으로 접근 할 것입니다.
생성자에서 "암시 적으로 정의 된"과 "기본값"을 혼동하지 마십시오. 기본 생성자는 인수없이 호출 할 수있는 생성자입니다 (있는 경우). 생성자를 제공하지 않으면 기본 생성자가 암시 적으로 정의됩니다. 각 기본 클래스 및 데이터 멤버에 대해 기본 생성자를 사용합니다.
그래서 Foo 클래스에는 암시 적으로 정의 된 기본 생성자가 있고 Bar (사용자 정의 생성자가없는 것)는 Foo의 기본 생성자를 호출하는 암시 적으로 정의 된 기본 생성자를 사용합니다.
Bar의 생성자를 작성하려는 경우 초기화 프로그램 목록에서 foo를 언급 할 수 있지만 기본 생성자를 사용하고 있으므로 실제로 지정하지 않아도됩니다.
Foo 용 생성자를 작성하면 컴파일러는 자동으로 기본 생성자를 생성하지 않으므로 필요한 경우 생성자를 지정해야합니다. 따라서 Foo(int n);
과 같은 것을 Foo의 정의에 넣고 기본 생성자 (Foo();
또는 Foo(int n = 0);
)를 명시 적으로 작성하지 않은 경우 사용할 수 없으므로 현재 양식으로 바를 가질 수 없습니다 푸의 기본 생성자. 이 경우 bar 생성자가 Foo를 초기화하는 것과 같은 생성자가 있어야합니다. Bar(int n = 0): foo(n) {}
. (Bar 생성자가 먼저 foo를 초기화하려고 시도 했으므로 Bar(int n = 0) {foo = n;}
등이 작동하지 않는다는 것에주의하십시오.
나는 C++에 익숙해 있으며, 나는 아직도이 정도까지 각각의 의심을 가지고있다. 더욱이 대부분의 대답은 Foo 기본 생성자가 호출 될 것이고 그 사실은 Foo 자체의 정의에 달려 있다는 사실을 분명하게 설명합니다. 사용자 제공 또는 암시 적 기본 생성자입니까? 그것은 어떤 개인 회원 속성을 가지고 있습니까? C++의 초기화는 간단하지 않습니다. –
@xtofl이 포스터에 'C++에 익숙합니다'라는 메시지를 보내는 것은 대단히 재미 있습니다 ... 거의 대부분의 사람들이 거의 모든 대답이 잘못되었을 때 C++에 익숙하지 않은 것 같습니다. 사실 초기 초기화는 어렵습니다. 응답 한 사람들 중 일부는 C++ 지식 @ JaredPar, @dirkgently, @ David Shornley를 입증했지만 아직 실패했습니다. –