치춘짱베리굿나이스

[Rank 4] CPP 06 본문

42/42s Cursus

[Rank 4] CPP 06

치춘 2022. 9. 17. 10:49

CPP06

C++ casts

C++ 캐스팅

strtod

std::string tmp = "33 44 55";
char* endptr;
double value = strtod(tmp.c_str(), &endptr);

// value = 33
// endptr = " 44 55"

char* 형식의 문자열을 받아 double 자료형으로 변환한다

이때 두 번째 인자에는 char* 형식의 변수 주소가 들어가게 되는데, strtod는 첫 번째 문자열에서 숫자 (double) 로 추정되는 부분을 변환하고, 문자열 안에서 숫자로 변환된 부분문자열 다음 포인터를 두 번째 인자 주소에 넣어준다

예시에서 “33 44 55”를 인자로 넣으면, 33까지가 숫자이고 공백 문자열은 숫자가 아니므로 strtod는 공백 전까지를 숫자로 판단하여 변환하고, 공백 부분의 주소를 &endptr에 넣어준다

 

std::string tmp = "3.3aaa22333";
char* endptr;
double value = strtod(tmp.c_str(), &endptr);

// value = 3.3
// endptr = "aaa22333"

이 예시에선 3.3까지가 숫자 (double) 이고, aaa22333부턴 문자열이므로 endptraaa22333의 주소를 가리키게 된다

딱 하나의 자료형으로 형변환을 하라고 명시되어 있으므로 가장 범용성이 좋고 크기가 큰 (혼자 64비트) double형으로 형변환하는 것이 좋다

inf, nan

inf는 무한대, nan은 not a number를 의미한다

inf는 어떤 값을 0으로 나누었을 때 반환된다

inf, +inf (양의 무한대), -inf (음의 무한대) 가 존재한다

nan은 0을 0으로 나누었을 때 또는 루트 연산 중 음수가 들어왔을 때 반환된다

isprint

isprint

isprint("a"); // printable
isprint(""); // non-printable

char 자료형 문자들 중 출력이 가능한 문자열인지 판별해주는 함수이다

static_cast

static_cast<바꾸려는 타입>(변수명);

컴파일 타임에 형변환을 진행하는 정적 캐스팅이다

명시적으로 형변환을 할 수 있는 방법 중 하나이고, 가장 기본적인 형태의 타입 캐스팅이다

dynamic_cast

https://blockdmask.tistory.com/241

dynamic_cast<자식 클래스 포인터 또는 참조>(변수명);
dynamic_cast<부모 클래스 포인터 또는 참조>(변수명);

런타임에 형변환을 진행하는 동적 캐스팅이다

상속 관계에 놓여 있는 두 클래스 중 부모 클래스의 데이터를 자식 클래스 포인터로 형변환할 때 사용된다 (다운캐스팅)

자식 클래스 포인터를 부모 클래스로 형변환할 때 사용되기도 하지만 (업캐스팅) 보통 이럴 때는 static_cast를 사용한다

만약 부모-자식 관계가 아닐 경우 캐스팅에 실패하며, 포인터 캐스팅이냐 참조 캐스팅이냐에 따라 다른 결과를 반환한다

 

안전한 타입캐스팅을 지원하지만 런타임 시간에 타입 캐스팅이 가능한지 검사하기 때문에 비교적 느리고, virtual 함수가 있어야 한다

부모 클래스 생성자로 생성한 부모 클래스 형식 인스턴스는 캐스팅할 수 없고, 자식 클래스 생성자로 생성한 부모 클래스 형식 인스턴스는 캐스팅할 수 있다

  • 포인터
    • 형변환에 성공했을 경우 주소를 반환한다
    • 주소는 원본으로부터 바뀌지 않는다
    • 형변환에 실패했을 경우 널 포인터를 반환한다
  • 참조
    • 형변환에 성공했을 경우 해당 참조를 반환한다
    • 주소가 원본으로부터 바뀐다
    • 형변환에 실패했을 경우 예외를 발생시킨다

reinterpret_cast

reinterpret_cast<바꾸려는 포인터 형식>(변수명);

static_cast가 자료형끼리의 형변환이었다면, reinterpret_cast는 포인터 타입끼리의 캐스팅이다

int *char *로 형변환된다거나, intint * 또는 int *int로 형변환될 수 있다

평범한 int값을 int *로 형변환하면 해당 주소가 어디를 가리킬 지 모르기 때문에 잘못 사용하면 이상한 포인터를 건드릴 수도 있다

const_cast

const_cast<자료형>(변수명);

상수 성질을 잠깐 제거한다

원래 상수는 한번 초기화하면 값을 바꿀 수 없었지만, const_cast를 통해 임시적으로 상수 성질을 제거하여 값을 바꿀 수 있게끔 한다

uintptr_t

포인터 주소값을 저장하기 위한 자료형으로, 시스템에서의 포인터 변수 크기와 같다

32비트에서는 32비트, 64비트에서는 64비트 라는 뜻

intptr_t는 부호가 있는 버전, uintptr_t는 부호가 없는 버전이다

묵시적 형변환, 명시적 형변환

char c = '1';
int i;
i = c;

묵시적 형변환은 어떤 자료형으로 형변환을 할 것인지 명시하지 않고 대입 등의 특수 행동으로 암시적인 형변환을 진행한다

 

char c = '1';
int i;
i = (char) c;
i = static_cast<char>(c);

명시적 형변환은 어떤 자료형으로 변환해줄 것인지 확실하게 명시하는 방법이다

'42 > 42s Cursus' 카테고리의 다른 글

[Rank 4] CPP 08  (0) 2022.09.18
[Rank 4] CPP 07  (0) 2022.09.17
[Rank 4] CPP 05  (0) 2022.09.11
[Rank 4] CPP 04  (0) 2022.09.11
[Rank 4] CPP 03  (0) 2022.09.11
Comments