2012-01-05 4 views
1

12.1/5 생성자는 간단하다 10.1) 및
- 그 클래스의 모든 직접베이스 클래스 사소한 생성자 및
이 - 클래스 타입 (또는 어레이 이의)로되어 그 클래스의 모든 비 정적 데이터 멤버를 들어, 이러한 각각의 클래스 가진 간단한 생성자.사용은

처음에는 사소한 생성자가 단순한 암시 적 기본 생성자라고 생각했습니다. 그러나 표준에서 위의 텍스트를 읽을 때, 사소한 생성자가 암시 적 기본 생성자 일뿐만 아니라 위에서 언급 한 다른 요구 사항을 갖고있는 것처럼 보입니다. 무슨 뜻이에요? 사소한 생성자를 갖는 점은 무엇입니까? 예를 들어

:

class X 
{ 
    // ... 
}; 

합니까 클래스 X는 사소한 또는 암시 적 기본 생성자가?

답변

2

무엇이 // ...에 따라 다릅니다.

모든 간단한 생성자는 암시 적으로 선언 된 기본 생성자이지만 모든 암시 적으로 선언 된 기본 생성자가 간단한 생성자는 아닙니다. 이 (등등뿐만 아니라 그 기저 클래스 '베이스 클래스 등) 암시 적 기본, 의베이스 클래스의 모든 하나가 암시 적 기본을 가지고있는 경우 클래스 X는 , 사소한 소멸자를 가지고 그 구성원은 모두 int과 같은 프리미티브이거나 암시 적 기본값 (멤버의 멤버 등등, 멤버의 기본 클래스 및 기본 클래스 등)이있는 유형입니다. 등등, 기본 클래스 멤버들과 멤버들, 등등).

반대 방향으로보기가 더 쉽습니다. 에 간단한 생성자가 없으면 확장 ("is-a")하거나 포함하는 클래스가 없습니다 ("has-a ")도 사소한 생성자를 가지고있다.

1

간단한 생성자는 전혀 수행하지 않습니다. 당신은 당신의 생성자를하지 않았다

  1. 일 관련 않는 생성자를하지 않았다
  2. 토대 클래스의 기본값이 아닌 생성자를 제공하여 작업을 수행 게시물의 목록이 때 생성자가 사소한 것을 말한다 생성자가 일 자신이 아닌 사소한 생성자에게 호출과 관련된 않습니다하지 않았다 클래스의 자신의
  3. 데이터 멤버의 가상 함수, 가상 기본 클래스, 또는 비 사소한 생성자를 처리 할 준비와

이 규칙은 함께 생성자가 아무 것도 할 수 없다는 것을 의미하므로, 간단히입니다.

X의 경우 모두 해당 데이터 멤버에 따라 다릅니다. 모든 생성자가 간단한 생성자를 갖고 있고 간단한 생성자를 제공하지 않은 경우 X도 간단한 생성자를 갖습니다.

+0

가상 함수를 처리하기 위해 준비하는 것과 관련하여 생성자가 어떻게 작동하는지 설명 할 수 있습니까? – user1086635

+0

@ user1086635 컴파일러는 가상 함수가있는 클래스 레이아웃에 숨겨진 포인터를 추가하여 가상 함수 테이블 (vtable이라고도 함)을 가리 킵니다. 이 포인터는 클래스를 사용할 준비가되기 전에 설정해야합니다. – dasblinkenlight

+0

그러나 컴파일 타임에 vtable이 만들어지고 객체가 만들어지면 숨겨진 포인터가 vtable로 설정됩니다. 이 프로세스에서 생성자는 런타임에 호출되지 않고 어떻게 사용됩니까? – user1086635