2012-08-08 3 views
3

C에서 void 포인터는 암시 적으로 다른 유형으로 유형이 변환됩니다.C에서 void * 변환 C++에서

프로그램 아래 참조 :

int main() 
{ 
    void *p; 
    int* ptr,i=5; 
    p=&i; 
    ptr=p; <--------------------------- 
    return 0; 
} 

C 환경에서 실행 프로그램 compiles successfully. 같은 프로그램이 C에서 ++ 환경에서 실행되는 경우

그러나, 나는 아래 error 점점 오전 :

prog.cpp: In function ‘int main()’: 
prog.cpp:8: error: invalid conversion from ‘void*’ to ‘int*’ 

그것은 C++, 우리는에 명시 적으로 void 포인터 typecase해야한다는 것을 의미합니다.

따라서 new 연산자의 반환 형식이 void * 인 이유는 무엇입니까? 어떻게, 그것은 원하는 유형으로 변환되고 있습니까?

+0

나는 C 컴파일러에게 함축적 인 캐스팅과 관련하여 좀더 지적이되도록 지시 할 수 있다고 생각한다. – maba

답변

3

operator new을 오버로드하면 실제로 void*가 반환됩니다. 오버로드 operator new는 기본적으로 C.

에서 malloc() 같은 간단한 할당 기능입니다하지만 연산자 new을 사용 때, 당신은 단지 그 함수를 호출하는 것보다 더 많은 일을; 예를 들어 생성자를 암시 적으로 호출합니다. 정확히 올바른 유형을 반환하면 new으로 생성하는 것과 오버로드 된 operator new 함수 사이에 암시 적으로 다른 차이가 있습니다.

void*을 가리킬 수 있기 때문에 오류가 발생합니다.. 그래서 당신이 그것을 특정한 무엇인가에 할당하려한다면, 당신은 진실이 아닐 수도있는 가정을하고 있습니다. C++은 강력한 형식이므로 컴파일러에게 가정에 대해 알려주고 명시해야합니다. 그것이 유형 안전이 제공하는 보호 메커니즘입니다. C는 강력한 형식이 아니며 개발자의 책임입니다.

+0

+1 예 - 꽤 동의합니다. C++을 추가하면 강력하게 형식화해야합니다. C는 그렇지 않습니다. –

1

new 연산자는 특별히 컴파일러에서 처리되므로 인수 형식을 new으로 가져오고 올바른 형식으로 암시 적으로 캐스트합니다.

operator new을 직접 만드는 경우 void 포인터를 반환해야합니다. 실제로는 형식을 알지 못하기 때문에 할당 할 메모리 양만 알기 때문입니다.

1

new은 함수가 아니기 때문에 연산자이며 특별히 컴파일러에서 처리됩니다.

1

C++은 포인터 캐스트에보다 엄격한 규칙을 적용합니다. 이유 중 하나는 아마도 C++의 포인터 캐스트가 결국 기계 코드로 이어질 수 있기 때문입니다. 즉, 순수하게 외형적인 것이 아닙니다.

예를 들어, A 클래스는 BC (이 순서로)을 상속합니다. C에 대한 포인터를 가져 와서 A으로 캐스팅하면이 결과가 (원시) 포인터 이동으로 바뀝니다.new 연산자와 표현식 먼저 전화 새로운 기능 연산자 :

-1

http://www.cplusplus.com/reference/std/new/operator%20new/

새가 일반 함수로 명시 적으로 호출 할 수 있습니다 운영자하지만 C++에서 새로운는 매우 구체적인 행동 운영자입니다 크기 지정자 인 크기 을 첫 번째 인수로 사용하고이 값이 성공하면 이 자동으로 개체를 초기화하거나 생성합니다 (필요한 경우). 마지막으로 표현식은 적절한 유형에 대한 포인터로 평가됩니다.

마지막 문장에 유의하십시오. *

ptr = (int *) p; 

새의 결과가 무효되지 않습니다 :

1

당신은 입력해야합니다. 그것은 당신이 만드는 객체에 달려 있습니다. 할 경우

ptr = new int [2]; 

리 시드 관계가 없습니다.

+0

여기서 reinterpret_cast (p)가 C 스타일의 캐스트보다 선호됩니다. C++은 다른 캐스트 연산자를 제공하므로 사용해야합니다. – Thelvyn

+0

'reinterpret_cast' 피하기 -이 경우에는'static_cast'만으로 충분할뿐만 아니라 권장/권장됩니다. –

0

따라서 새 연산자의 반환 형식이 void * 인 이유는 무엇입니까?

이라는 키워드는 int * p = new int[42];과 같은 새 표현식에 사용됩니까? 이 표현식은 올바른 유형 (이 경우 int*)이므로 변환 할 필요가 없습니다.

또는 메모리 할당 기능 operator new()을 의미합니까? malloc()과 마찬가지로, 이는 유형이 지정된 객체가 아닌 원시 메모리를 처리하므로 반환 유형은 타입이 지정되지 않은 void*입니다. new-expression은 내부적으로 생성되는 객체의 유형을 알고 있으므로 객체가 완전히 구성되면 필요한 포인터 변환을 수행 할 수 있습니다.

매우 드문 경우지만 자신의 코드에서 사용하려는 경우 올바른 유형으로 직접 변환해야합니다. 그러나 당신은 거의 항상 새로운 표현을 통해 그것을 간접적으로 사용하고 그런 세부 사항에 대해 걱정할 필요가 없습니다.