2013-06-23 3 views
3

C++ 표준을 읽는 동안 static_cast이 일종의 직접 초기화 (C++ 표준 8.5/15)이라는 것을 읽었습니다.
이것은 static_cast 동안 해당 오버로드 된 생성자이 호출됨을 의미한다고 생각합니다.
예를 들어 B에서 파생 된 유형 B 및 유형 D와 객체 D d이 있습니다. 그런 다음 표현 static_cast<B>(d)static_cast 표현입니다.파생 클래스에서 기본 클래스로 static_cast를하면 어떻게됩니까?

표준 수단으로, static_cast 표현은 직접 초기화입니다. 이것이 B 유형의 생성자를 호출하고 B 유형의 새 생성 객체를 반환한다는 것을 의미합니까?


편집
또 다른 문제는 방법에 대한 B & b = d 또는 B b = d입니까? 이 두 문장에는 B의 생성자가 관련되어 있습니까?

답변

1

예, 개체 유형 (참조 또는 포인터 유형에 대한 캐스트가 아님)에 대한 static_cast은 적절한 생성자를 사용하여 임시 개체를 만듭니다.

+0

다른 문제를 제기하기 위해 내 게시물을 수정했습니다. 좀 봐 줄래? – Zachary

0

직접 초기화는 클래스 B의 객체 내의 각 바이트가 생성자 호출없이 클래스 D의 객체에서 복사된다는 것을 의미합니다.

+2

아니요, 사실이 아닙니다. 어떤 상황에서는'reinterpret_cast'가 그 일을하지만,'static_cast'는 타입 시스템을 알고 존중합니다. –

1

표준에서 의미하는 바는 예를 들어 부동 소수점을 정수로 변환 할 수 있다는 것입니다. 이 시점에서 전환이 발생합니다. 결과적으로 int이이 시점에서 직접 초기화된다고 말할 수 있습니다.

캐스팅에 참여하는 클래스에 상응하는 오버로드 된 변환이 있으면 예, 호출됩니다. 개인적으로이 기능을 적극적으로 사용하지 않는 것이 좋습니다. 코드를 읽기가 어려울 것입니다.

+0

당신 말이 맞아요. 나는 overriden를 생각하고 있었다. 내 게시물을 수정했습니다. –