2015-02-05 6 views
2

A를 상속하고 멤버 변수가있는 클래스 B에 대해 복사본 c'tor를 정의한다고 가정합니다. 콥트 바디 안에는 코드를 작성하지만 초기화 목록에는 명시 적으로 콜터 (c'tor)를 호출하지 않으며 멤버 변수를 초기화하지 않습니다.정의 된 복사 생성자의 기본 동작 C++

기본 C'tor는 B 'copy c'tor body에 도달하기 전에 기본적으로 호출됩니다. 그러나 멤버 변수는 무엇이 될까요? 은 기본 c'tor 또는 인수 복사본의 c'tor 또는 arguement 객체의 멤버 (인수 객체 == B copy c'tor)로 초기화됩니다.

또한 일부 회원의 사본 또는 사본 또는 부모 클래스 사본에 '초기화'목록이있는 경우 해당 동작이 변경됩니까?

나는 c'tor : Parent Class와 members copy c'tor 's가 명시 적으로 정의되어 있지 않은 경우를 대비하여 알고있다.

여기서 무엇을 기대해야합니까?

답변

2

기본 클래스 하위 개체가이 경우에 초기화 기본값이됩니다 : 여기

이 보여 몇 가지 샘플 코드입니다. 참조 [class.base.init]/8 : 비 위임 생성자에서

주어진 잠재적 구성 하위 개체는 경우가 어디를 포함하는 MEM- 이니셜-ID (의해 지정되지 않으면 더 MEM-초기화리스트이없는 실체가 브레이스 또는 동등-initi되어있는 비 정적 데이터 멤버이면 생성자 다음

  • 의 ctor-이니셜)을가 없으므로 alizer [..]
  • 그렇지 않은 경우 엔티티가 익명 공용체 또는 변형 멤버 인 경우 (9.5) 초기화는 수행되지 않습니다.
  • 그렇지 않으면 엔터티가 기본값으로 초기화됩니다 (8.5).

그리고 잠재적으로 구성된 하위 객체는 [스페셜]/5로 정의되고, 클래스

그 비 정적 데이터 멤버 그 비 가상 직접베이스 클래스 클래스가 추상 클래스가 아닌 경우 (10.4), 가상베이스 클래스를 잠재적으로 생성 된 하위 객체라고합니다.

1

복사 생성자를 작성하고 멤버 변수를 초기화하지 않으면 기본값으로 초기화됩니다.

동일한 내용이 기본 클래스에 적용되며, 대부분의 경우 멤버 변수와 동일하게 처리됩니다.

#include <iostream> 

using namespace std; 

struct S 
{ 
    S() { cout << "S()\n"; } 
    S(S const &) { cout << "S(S&)\n"; } 
}; 

struct T : S 
{ 
    T() {} 
    T(T const &t) {} 

    // you have to explicitly write this if you want it 
    // T(T const &t): S(t) {} 
    //    ^^^^ 
}; 

int main() 
{ 
    T t; 
    T u(t); 
}