C++ 스타일의 캐스팅

·2022년 5월 30일
0

cpp_study

목록 보기
9/25

기존 c언어 캐스팅

암시적 캐스팅

int, double 변수와의 덧셈을 수행할 때 int형 변수가 자동으로 double 변수로 캐스팅되는 경우에 해당

명시적 캐스팅

void * 타입의 주소를 특정 구조체 포인터 타입의 주소로 바꾸는 경우에 해당

(예시)

ptr = (Something *)other_ptr;
int_variable = (int)float_variable;

(문제)

  • 말도 안되는 캐스팅에 대해서 컴파일러가 오류를 발생시키지 않음.
  • 따라서 프로그래머의 실수에 취약함.
  • 괄호가 많아져서 가독성이 떨어짐.

cpp이 제공하는 4가지 캐스팅

  • static_cast: 언어적 차원에서 지원하는 일반적 타입 변환
  • const_cast: 객체의 상수성(const)을 없애는 타입 변환(const int -> int)
  • dynamic_cast: 파생 클래스 사이의 다운 캐스팅 ❓
  • reinterpret_cast: 서로 관련이 없는 포인터들 사이의 캐스팅

캐스팅을 사용하는 방법

(원하는 캐스팅 종류) <바꾸려는 타입> (무엇을 바꿀 것인가?)

static_cast

(예시)

static_cast <int> (float_variable)

const_cast

포인터 또는 참조형의 상수성을 잠깐 제거해주는 데 사용한다.
(예시)

#include <iostream>
 
using namespace std;

int main(void){
    
    char str[] = "BlockDMask";
    const char * ptr = str;
    cout << "before :" << str << endl;
    
    char * c = const_cast<char *> (ptr);
    c[0] = 'Q';
    cout << "after: "<< str << endl;
    
    return 0;
}

이때 상수형 포인터는 다음과 같이 까다롭게 정의될 수 있으니(변수가 const인 경우, non-const인 경우, 본인 자체가 const인 경우, const를 가리키는 포인터인 경우 등)
링크를 참고해서 나중에 필요할 때 보는 걸로 하자.

dynamic_cast

가장 일반적인 용도는 Base 클래스 포인터를 Derived 클래스 포인터로 변환하는 것
그 외는 추상 클래스 배우고 나서 공부하는 게 나아 보여서 skip

reinterpret_cast

임의의 포인터 타입끼리 변환을 허용하는 캐스트 연산자
정수형 -> 포인터로 바꿀 수 있음

오픈소스 코드를 가져다가 쓸 때 디버깅하기 좋은 것이다.
타입이 안 맞으면 내 코드 선에서 해결할 수 있는 방법이다.

그 외는 여기 링크 참고

profile
이것저것 개발하는 것 좋아하지만 서버 개발이 제일 좋더라구요..

0개의 댓글