c++

C++ 개인 필기(14) 변환

Voitcon 2024. 2. 26. 18:42

타입 변환 유형(비트열 재구성 여부)

1. 값 타입 변환

(의미를 유지하기 위해, 원본 객체와 다른 비트열 재구성)

int a=123456789 //2의 보수

float b= (float)a //부동소수점

->1.234567e ... -> 메모리에 다른 값 구성 (비트열 재구성)

 

2. 참조 타입 변환 

(비트열을 재구성 하지 않고 관점만 바꾸는것)

int a= 123456789 ->메모리의 데이터는 같지만 (관점만 바뀌어)

float b= (float)a ->엉뚱한 값 구성

->참조 타입 변환은 포인터 타입 변환과 동일한 룰을 같는다.

 

안전도 분류

(1) 안전한 변환

특징) 의미가 항상 100프로 완전히 일치하는 경우

같은 타입이면서 크지만 더 큰 가방으로 이동

작은 가방 -> 큰 가방 good (업캐스팅)

char -> short , short -> int ...

int a= 123456789, int64=a ->데이터 손실x

 

(2) 불안전한 변환

의미가 항상 100프로 일치한다고 보장x

타입이 다르거나, 같은 타입이지만 큰 가방 -> 작은 가방 이동(다운 캐스팅)

 

프로그래머 의도 분류

(1) 암시적 변환(반드시 경고가 뜸)

이미 알려진 타입 변환 규칙에 따라서 컴파일러가 자동으로 타입변환

(2)명시적 변환

int a

float b=(float) a;

 

아무런 연관관계가 없는 클래스 사이의 변환

class Warrior | class Bag

(1) 연관 없는 클래스 사이에 값 변환

warrior w

Bag b=(Bag) w -> 거부

만약 생성자에 

Bag(const Warrior& w) //타입변환 생성자 작성시

컴파일 통과(일반적 상황은 아니다)

 

연관 없는 클래스 사이의 참조 타입 변환

Bag& b=w or (Bag&)w ->왜 통과가 될까?

어셈블리 관점 : 포인터 = 참조

 

상속 관계에 있는 클래스 사이의 변환

 

(1) 상속 관계 클래스의 값 타입 변환

자식 -> 부모 o , 부모 ->자식 x

(2) 상속 관계 클래스의 참조 타입 변환

부모->자식(명시적으로만 가능)

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

C++ 개인 필기(15완) 복사  (0) 2024.03.04
C++ 개인 필기(13) 동적 할당  (0) 2024.02.14
C++ 개인 필기(12) static  (1) 2024.02.13
C++ 개인 필기(11) 클래스의 연산자  (0) 2024.02.07
C++ 개인 필기(10) 초기화 리스트  (0) 2024.02.06