치춘짱베리굿나이스
[Rank 4] CPP 06 본문
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
부턴 문자열이므로 endptr
은 aaa22333
의 주소를 가리키게 된다
딱 하나의 자료형으로 형변환을 하라고 명시되어 있으므로 가장 범용성이 좋고 크기가 큰 (혼자 64비트) double형으로 형변환하는 것이 좋다
inf, nan
inf
는 무한대, nan
은 not a number를 의미한다
inf
는 어떤 값을 0으로 나누었을 때 반환된다
inf
, +inf
(양의 무한대), -inf
(음의 무한대) 가 존재한다
nan
은 0을 0으로 나누었을 때 또는 루트 연산 중 음수가 들어왔을 때 반환된다
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 *
로 형변환된다거나, int
가 int *
또는 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 |