C++에서 캐스팅

黄舟
黄舟원래의
2017-02-06 13:43:521902검색

Q:C 스타일 변환이란 무엇인가요? static_cast,dynamic_cast,reinterpret_cast란 무엇입니까? 차이점은 무엇입니까? 우리는 왜 주의를 기울여야 합니까?


A: 변환의 의미는 변수의 유형을 다른 유형으로 변경하여 변수의 표현을 변경하는 것입니다. 하나의 간단한 객체를 다른 객체로 캐스팅하려면 전통적인 유형 변환 연산자를 사용합니다.


예를 들어, 이중형 유형의 부동 소수점 숫자에 대한 포인터를 정수로 변환하려면:

Code

int i;
double d;
i = (int) d;


또는

i = int (d);


는 표준 정의 변환을 사용하는 단순 유형에 적합합니다. 그러나 이러한 변환 연산자는 클래스 및 클래스 포인터에 무차별적으로 적용될 수도 있습니다. ANSI-C++ 표준은 클래스 간의 유형 변환을 제어하도록 설계된 'reinterpret_cast', 'static_cast', 'dynamic_cast' 및 'const_cast'라는 네 가지 새로운 변환 연산자를 정의합니다.


코드:

reinterpret_cast<new_type>(expression)
dynamic_cast<new_type>(expression)
static_cast<new_type>(expression)
const_cast<new_type>(expression)


1 reinterpret_cast


reinterpret_cast는 포인터를 다른 유형의 포인터로 변환합니다. 또한 포인터에서 정수 유형으로의 변환도 허용합니다. 그 반대. (주석: 포인터의 특정 주소 값이 정수값인가요?)


이 연산자는 관련 없는 유형 간에 변환할 수 있습니다. 작업의 결과는 단순히 한 포인터에서 다른 포인터로의 값에 대한 이진 복사본입니다. 유형 간을 가리키는 콘텐츠는 유형 확인이나 변환을 거치지 않습니다. 사례가 포인터에서 정수로의 복사본인 경우 내용의 해석은 시스템에 따라 다르므로 구현이 적절하지 않습니다. 포인터를 포함할 만큼 큰 정수 유형으로 변환된 포인터는 다시 유효한 포인터로 변환될 수 있습니다.


코드:

class A {};
class B {};
A * a = new A;
B * b = reinterpret_cast<B *>(a);


reinterpret_cast는 모든 포인터 유형 변환을 기존 유형 변환처럼 처리합니다.


2 static_cast


static_cast는 임의의 암시적 변환 및 역방향 변환 작업을 허용합니다. (암시적일 수는 없지만)


은 하위 클래스 유형의 포인터를 슈퍼클래스 유형의 포인터로 변환할 수 있음을 의미합니다. 변환) 동시에 반대 작업, 즉 상위 클래스를 하위 클래스로 변환하는 작업도 수행할 수 있습니다. 이 마지막 예에서는 변환된 상위 클래스가 대상 유형과의 일관성을 확인하지 않습니다.


코드:

class Base {};
class Derived : public Base {};
 
Base *a = new Base;
Derived *b = static_cast<Derived *>(a);


static_cast 유형 포인터에 대한 작업 외에도 static_cast를 사용하여 명시적인 작업을 수행할 수도 있습니다. 유형 정의 변환 및 기본 유형 간의 표준 변환:


코드:

double d = 3.14159265;
int i = static_cast<int>(d);


3 Dynamic_cast


dynamic_cast는 객체에 대한 포인터와 참조에만 사용됩니다. 다형성 유형과 함께 사용하면 임의의 암시적 유형 변환이 허용되며 그 반대의 경우도 마찬가지입니다. 그러나 static_cast와는 달리 후자의 경우(참고: 암시적 변환의 역과정) Dynamic_cast는 작업이 유효한지 확인합니다. 즉, 변환이 요청된 유효한 전체 개체를 반환할지 여부를 확인합니다.


런타임에 감지가 발생합니다. 변환된 포인터가 요청한 유효한 전체 개체 포인터가 아닌 경우 반환 값은 NULL입니다.


코드: >

참조에서 유형 캐스팅이 수행되는 경우 유형을 입력하고 이 변환이 불가능하면 bad_cast 예외 유형이 발생합니다:


Code:

class Base { virtual dummy() {} };
class Derived : public Base {};
 
Base* b1 = new Derived;
Base* b2 = new Base;
 
Derived* d1 = dynamic_cast<Derived *>(b1); // succeeds
Derived* d2 = dynamic_cast<Derived *>(b2); // fails: returns &#39;NULL&#39;

4 const_cast

이 캐스트 유형은 전달된 객체의 const 속성을 설정하거나 제거하여 조작합니다.


코드:

class Base { virtual dummy() {} };
class Derived : public Base { };
 
Base* b1 = new Derived;
Base* b2 = new Base;
 
Derived d1 = dynamic_cast<Derived &*>(b1); // succeeds
Derived d2 = dynamic_cast<Derived &*>(b2); // fails: exception thrown

다른 세 연산자는 객체의 불변성을 수정할 수 없습니다. 참고: 'const_cast'는 유형의 휘발성 한정자를 변경할 수도 있습니다.


C++의 네 가지 캐스트 형식은 각각 특정 목적에 적합합니다.


dynamic_cast는 주로 실행에 사용됩니다. "안전한 다운캐스팅", 즉 객체가 상속 계층 구조에서 특정 유형인지 여부를 결정합니다. 이전 스타일 구문으로는 수행할 수 없는 유일한 캐스트이며 상당한 런타임 비용이 발생할 수 있는 유일한 캐스트입니다.


static_cast를 사용하면 암시적 변환(예: const가 아닌 객체를 const 객체로, int를 double로 등)을 강제로 수행할 수 있으며 이러한 많은 변환을 되돌리는 데에도 사용할 수 있습니다(예: void* 포인터는 형식화된 포인터로 변환되고 기본 클래스 포인터는 파생 클래스 포인터로 변환되지만 const 개체를 C에 가장 가까운 non-const 개체로 변환할 수는 없습니다(const_cast만 가능). -스타일 변환.

const_cast는 일반적으로 객체의 불변성을 강제로 제거하는 데 사용됩니다. 이 작업을 수행할 수 있는 유일한 C++ 스타일 캐스트입니다.

reinterpret_cast는 구현에 따라 달라지는(예: 이식 불가능한) 결과(예: 포인터를 정수로 변환)로 이어지는 낮은 수준의 캐스트를 위한 것입니다. 이러한 캐스트는 하위 수준 코드 외부에서는 극히 드물어야 합니다.

위 내용은 C++ 강제형 변환 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.