본문 바로가기

C++

[C++] 값 타입 변환 vs 참조 타입 변환

비트열 재구성 여부

 

1.값 타입 변환

의미를 유지하기 위해 원본과 다른 비트열 구성

int a = 123456789;
float b = (float)a;

b는 정수형 a와 유사한 값의 의미를 가지지만 

비트단계에서는 완전히 다른 비트열을 가지게됨

 

2.참조 타입 변환

비트열을 재구성하지 않고 관점만 바꾼다. (포인터 타입 변환도 동일한 룰을 따름)

int a = 123456789;
float b = (float&)a;

b는 a와 같은 비트열을 가지지만

의미에서는 전혀 다른 값을 가지게 된다.

 

 

연관 없는 클래스 사이 변환

 

1.값 타입 변환

일반적으로는 안되고 타입 변환 생성자나 타입 변환 연산자가 있어야 함

Knight knight;
Dog dog = (Dog)knight; // 타입 변환 생성자
Knight knight2 = dog;  // 타입 변환 연산자

 

2.참조 타입 변환

명시적 변환하면 허용해줌 (void 포인터처럼 일단 허용)

Knight knight;
Dog& dog = (Dog&)knight;

 

 

값 타입 변환은 비트열을 바꾸고 논리적으로 말이 되게 변환한다. 말이 안되면 변환 안시켜준다. 

(ex. 전혀 상관 없는 클래스, 부모 -> 자식 변환)

참조 타입 변환은 비트열은 냅두고 관점을 바꾼다. 명시적 요구하면 변환은 해주고 암시적 변환은 안전한 것만 해준다.

(ex. 자식->부모처럼 안전한 변환은 암시적으로 해줌)

'C++' 카테고리의 다른 글

[C++] auto  (0) 2022.06.25
[C++] algorithm 헤더의 remove, remove_if 주의점  (0) 2022.06.24
[C++] new vs malloc  (0) 2022.06.22
[C++] 초기화 리스트는 선처리 영역에서 실행된다.  (0) 2022.06.22
[C++] 포인터 vs 배열  (0) 2022.06.21