2014-04-20 4 views
2

, 제대로 작동호출 멤버 함수는 C++ 다음 코드를 고려

생성자가 호출되지 않았 음을 의미
g() 
g() 
g() 
g() 
g() 

. 그러나 배열에서 someClassArray는 someClass 유형에 대한 것이므로 g() 함수를 호출하고 적절한 출력을 얻을 수 있습니다.

someClass 유형의 객체가 생성되지 않는데도이 프로그램이 올바르게 실행되는 이유는 무엇입니까?

+1

왜 제대로 실행되는지 놀랍습니까? 이는 정의되지 않은 동작이므로 올바르게 작동하는 것은 확실한 옵션입니다. 구현은 현명하게도 함수 호출 일 뿐이므로 올바르게 작동 할 것입니다. 그냥 의지하지 마세요. –

+1

예, 근본적으로 운이 좋았습니다. reinterpret_cast 규칙의 요약은 다음과 같습니다. "유형 앨리어싱"섹션 참조 : http://en.cppreference.com/w/cpp/language/reinterpret_cast – user823981

답변

2

멤버 함수 g()가 호출되면 컴파일러는 객체의 포인터 (someClass *로 해석되는 void * 유형의 할당 된 배열의 요소)를 첫 번째 인수로 전달하기 만하면됩니다. 이 함수는이 포인터를 사용하여 클래스의 데이터 멤버에 액세스하지 않습니다. 사실이 간단한 클래스의 경우에는 생성자가 생성해야하는 것이 없습니다. 클래스에는 데이터 멤버가 없습니다. 따라서 함수를 호출하는 데 아무런 문제가 없습니다.

+0

이것은 (일반적으로 양성 인) UB입니다. 아마 관찰 된 취급이 보장되지 않는다는 것을 강조 할 것입니다. – Deduplicator

0

을 호출하여 someClass 객체에 대한 메모리 할당이 완료되었습니다. 그러나 호출이 new void이고 new someClass이 아니기 때문에 someClass 생성자를 호출하지 않았습니다.

의 호출은 this 포인터가 할당 되었기 때문에 작동합니다. 생성자 연산 만 실행되지 않습니다.

1

someClass은 상태가없는 클래스입니다. g()가 vtable 포인터처럼 처리되지 않고 오히려 일반 함수처럼 처리되는 것은 놀라운 일이 아닙니다.

당신이 여기서하고있는 일은 specs가 아닌 reinterpret_cast 인 직관적 인 자세로 미지의 행동입니다.

관련 문제