c++의 명시적 캐스트 연사자들이다.


1. const_cast

클래스에서 const, volatile 및 __unaligned 특성을 제거합니다. 


void main()

{

char str[] = "String";

const char  *c1=str;

char *c2;


c2 = const_cast<char *>(c1);

c2[0] = 'a';

printf("%s\n", c2);

}


결과 : atring


2. static_cast

명시적 형 변환을 위한 캐스트 연산자.


class super

{

};

class sub : public super

{

};


int main()

{

sub* ss  = static_cast<sub*>(new super());

}


// sub* ss = new super();

// '초기화 중' : super *'에서 'main::sub *'(으) 로 변환할수 없습니다.

// 기본 형식에서 파생 형식으로 캐스팅하려면 dynamic_cast 또는 static_cast가 필요합니다.


3. dynamic_cast

포인터나 레퍼런스를 기본 클래스 -> 파생 클래스로의 다운 캐스팅과,

다중 상속에서 클래스 간의 안전한 타입 캐스팅에 사용된다.

안전하지만 느리다.

이 연산자를 사용하려면 '하나 이상의 virtual 함수' 가 존재해야한다.


class super

{

};

class sub : public super

{

};


int main()

{

sub* ss  = dynamic_cast<sub*>(new super());

}


위 코드는 실행이 불가능하다

해당 클래스가 '다형 형식'이 아니라고 경고문이 나온다.

그럼 다형 형식이란?


위에서. 이 dynamic_cast연산자를 사용하려면 

하나 이상의 virtual함수 가 존재해야한다. 

virtual함수. 즉 가상 함수는 오버라이딩을통해 '다형성'을 구축한다. 


class super

{

public:

virtual void func()

{

prtinf_s("부모의 가상 함수.\n");

}

};

class sub : public super

{

};


int main()

{

sub* ss  = dynamic_cast<sub*>(new super());

if(ss == NULL)

{

prtinf_s("변환 실패\n");

}

ss->func(); 

}



4. reinterpret_cast

타입이니 뭐니 하는 것을 따지지 않고 무조건적으로 변환해버린다.

(reinterpret 다시 해석하다, 새로해석하다)

대단히 위험한 방법으로, 안전하다는 보장이 없다.


void main()

{

int a = 123;

double *b = nullptr;


b = reinterpret_cast<double*>(a);


printf_s("%d\n", a);

printf_s("%d\n", b);

}

'게임 프로그래밍 > C++ 기초' 카테고리의 다른 글

오버라이딩 (Overriding)  (0) 2020.03.02
C++ Map [STL]  (0) 2019.02.23
C++ 증감연산자 (전,후) 구현  (0) 2019.01.25
C++ memcpy_s 함수 구현  (0) 2019.01.25
C++ memset 함수 구현  (0) 2019.01.25

+ Recent posts