= 연산자로 서로 변환이 가능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_thttps://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 활용