=
연산자로 서로 변환이 가능https://cplusplus.com/doc/tutorial/typecasting/
C++에서 다른 타입끼리의 연산은 피연산자를 모두 같은 타입으로 만든 후에 수행
다른 타입끼리 대입, 산술 연산 수행 시 컴파일러가 자동으로 하는 타입 변환
타입 캐스트(cast) 연산자를 사용하여 강제로 수행하는 타입 변환
***_cast<타입>(표현식)
static_cast
: 논리적으로 변환 가능한 타입을 변환reinterpret_cast
: 임의의 포인터끼리 변환 허용static_cast
와 다르게 가능!)int num;
int* pNum;
num = reinterpret_cast<int>(&pNum);
const_cast
: const
나 volatile
속성을 잠시 제거dynamic_cast
: 상속 관계에 있는 클래스 간 타입 변환문자열을 인자로 받는 프로그램 작성
impossible
출력
- 범위를 넘어서는 값:
<climits>
활용- 무한대와 숫자가 아닌 값 검사:
<cmath>
,<limits>
의numeric_limits
활용
./convert 0
char: Non displayable
int: 0
float: 0.0f
double: 0.0
./convert nan
char: impossible
int: impossible
float: nanf
double: nan
./convert 42.0f
char: '*'
int: 42
float: 42.0f
double: 42.0
string 👉 int, float, double 변환 함수 사용 가능
👉<cstdlib>
의atoi()
,atof()
,strtol()
c
, a
, ...0
, -42
, 42
, ...0.0f
, -4.2f
, 4.2f
, ...-inff
, +inff
, nanf
도 처리해야 함0.0
, -4.2
, 4.2
, ...-inf
, +inf
, nan
도 처리해야 함uintptr_t
https://cplusplus.com/reference/cstdint/
포인터의 주소 저장
void *
에서 변환된 값을 가지고, 원래 포인터와 동일한 주소값으로 다시 변환할 수 있음Data
는 비어 있지 않은(멤버들을 가지고 있는) 구조체uintptr_t serialize(Data* ptr);
: 포인터를 받아서 unsigned integer 타입 uintptr_t
로 변환Data* deserialize(uintptr_t raw);
: unsigned integer를 받아서 Data *
로 변환Data
의 주소를 serialize()
로 넘기고 그 리턴값을 deserialize()
로 넘긴 후 다시 리턴값이 처음 주소와 같은지 비교dynamic_cast
상속 관계에 있는 객체의 포인터나 참조형의 타입 변환
typeinfo
헤더 사용 금지구현할 클래스들은 Orthodox Canonical Form을 가질 필요 없음
Base
클래스A
, B
, C
클래스Base
를 public으로 상속받음Base * generate(void);
A
B
C
중 하나의 객체를 Base *
로 리턴void identify(Base* p);
p
의 실제 타입 표시 (A
B
C
중 하나)void identify(Base& p);
p
의 실제 타입 표시 (A
B
C
중 하나)try ~ catch
활용