2011-04-25 4 views
14
class A : public B 
{ 
    ... 
} 

// case I : explicitly call the base class default constructor 
A::A() : B() 
{ 
... 
} 

// case II : don't call the base class default constructor 
A::A() // : B() 
{ 
... 
} 

케이스 II가 케이스 I과 같습니까?C++ - 초기화 목록의 기본 클래스 기본 생성자를 호출해야합니까?

나에게 나는 기본 클라 사 B의 기본 생성자가 case II에서 호출되지 않는다고 가정합니다.

는 VS2008

B constructor 
A constructor 
Press any key to continue . . . 

답변

21

기본 클래스 생성자는 두 경우 모두이라고에서 당신에게

/// 갱신 ///

class B 
{ 
public: 
    B() 
    { 
     cout << "B constructor" << endl; 
    } 
}; 
class A : public B 
{ 
public: 
    A() 
    { 
     cout << "A constructor" << endl; 
    } 
}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    A a; 
    return 0; 
} 

// 출력을 감사드립니다.

여기에 자세한 정보가있는 기사의 link이 있습니다.

+0

링크가 매우 좋다 :) - 고맙습니다. – q0987

7

기본 클래스 생성자가 인수를 사용하지 않으면 초기화 목록에 명시 적으로 언급 할 필요가 없습니다.

1

다른 클래스에서 파생 된 모든 클래스는 기본 클래스의 생성자를 호출해야합니다. 파생 클래스는 모든 기본 클래스가 완전히 구성되면 생성 될 수 있습니다. 따라서 기본 클래스의 생성자를 호출하는지 여부는 중요하지 않습니다. 호출하지 않으면 컴파일러가 결정할 수있는 기본 생성자가있는 한 호출됩니다. 그렇지 않으면 컴파일러에서 오류가 발생합니다.

4

학습 경험을 마치고 더 깊은 이해를하기 위해 약간 수정을 시작할 수 있습니다. 예를 들어 B에 기본 생성자가없는 경우 어떻게됩니까? 그것은 심지어 컴파일합니까? 이와 같은 기타 약간의 수정은 훌륭한 학습 경험을 제공 할 것입니다.

, 내 경험으로는 전자가 더 명확하기 때문에이

A::A() : B() { ... } 

보다

A::A() { ... } 

을 할 수 일반적으로 더 나은, 그리고 당신이 정말 무슨 일이 일어나고 있는지에 대해 생각 얻을 것이다 말했다 기본 클래스 초기화. 당신은 아마도 명시 적으로 것들을 철자함으로써 숨겨진 행동을 피할 것입니다.

+0

나는이 주제에 대한 이해를 향상시킬 방법을 제안했기 때문에 더하기 하나를주었습니다. – Krythic

+0

"해야합니다 ..."라는 질문에 대답했기 때문에 +1했습니다. 다른 답변의 대부분은 관련 질문 "해야합니다 ..."입니다. –

3

B에 사용자가 생성자를 선언하지 않은 경우 동작이 다릅니다. 비교 :

struct SimpleAggregate { 
    int a; 
    float b; 
}; 

struct ClassWrapper : SimpleAggregate { 
    ClassWrapper() : SimpleAggregate() { } 
}; 

ClassWrapper w; 

이제 w.aw.b 제로 보장된다. 기본 클래스의 명시 적 초기화를 중단하면 불확정 값이 생깁니다.


그것은 당신이 알 수없는 수 있으며, 구문에도 불구하고, SimpleAggregate()의 위의 사용은하지만, 하지 호출 기본 생성자를 수행합니다. 간단히 value는 기본 클래스를 초기화합니다 (우리는 Stackoverflow에 "value initialization"에 대한 몇 가지 좋은 대답이 있습니다). 선언 된 사용자가 없으므로 기본 생성자를 호출하지 않습니다.

관련 문제