C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 강좌/문서
C++Builder Programming Tutorial&Docments
[228] 캐스팅......
김상면 [windyboy] 24186 읽음    2012-05-29 16:56
먼저... 제 글이 오강(잘못된강의)일수 있다는 사가지없는 전제를 합니다.

C++책 몇권을 읽어보아도 새로운 캐스팅 연산자에대해서 정확하게 기술한 책이 별로 없습니다.
그래도 제가 누굽니까!
안가르쳐주면 가르쳐 줄때까징 따라다니고
책이 이해가 안가면 무슨말인지 알때까지 물고 들어지는 스타일....
한마디로 저한테 걸리면 둬집니다.

static_cast
요놈이 가장 C스타일의 캐스팅과 비슷하다고 하는데....
절대로 거짓말입니다.

C언어 기본에 보면 기본형과 유도형으로 타입을 나누는데...
여기서 기본형간의 변환을 지원합니다.
특이한것은 실수와 정수  열거형과 정수 문자형과 정수형의 변환을 지원한다는 아주 아주 반가운면서도 고수가 아니면 필요성조차 느끼지 못한다는 엄청난 사실...
캐스팅에 사용되는 두타입이 기본형이면 무조건 허락합니다.

상속관계의 포인터끼리 변환을 허락합니다.
한가지 문제는 포인터가 어떤값을 가지든지 상속관계에 있다면 무조건 허락한다는겁니다.
상속관계라 하더라도 다중상속이 개입되면 여러가지로 문제가 많기 때문에 안된다고 생각하시고 사용하시기 바랍니다. 특히 다중상속 관계에서 크로스 캐스팅은 절대로 허락하지 않습니다.

void*를 임의의 포인터로 변환하는 아주 정다운 기능합니다.
그외의 포인터간의 변환은 에러입니다.



dynamic_cast
요건 캐스팅 연산자라기보다는 RTTI입니다.
하는일이 캐스팅이라 캐스트 연산자로 분류되었을뿐 본래의 기능은 RTTI입니다.
그래서 이연산자를 사용하기 위해서 RTTI옵션의 작동해야 하고 캐스팅에 사용되는 대상들은 상속관계에 있어야 하며
하나 이상의 가상함수를 가져야 한다는 정말로 머리아픈 규약이 있습니다.

상속관계의 포인터나 레퍼런스간의 변환을 허락합니다.
RTTI를 이용하여 실시간 타입 정보를 활용하여 캐스팅 하기 때문에 다중 상속관계의 캐스팅 가능하며
(다중 상속 관계에서  기반 클래스간의 크로스 캐스팅 가능)

포인터를 캐스팅할때는 불가능한 캐스팅이라면 NULL를 리턴하는 아주 효자같은 놈입니다.
레퍼런스를 캐스팅할대는 불가능한 캐스팅이라면 bad_cast예외를 던지므로 정말 사랑스럽습니다.
그외의 캐스팅은 허락지 않습니다.

가상 상속이나 다중 상속을 받은 경우에는 객체의 주소가 여러개 나옵니다.
왜만한 고급 사용자도 이부분은 잘 모르는데.....
무슨말인가 하면 가상 상속이나 다중상속은 받은 객체를 함수의 인수로 넘길 때
함수의 인수에 명시된 타입의 주소가 함수의 인수로 넘어갑니다.
이렇게 되면 함수 내에서는 객체의 시작 주소를 알 수 가 없습니다.
이때 dynamic_cast(void*)하면 객체의 시작 주소를 얻을수 있습니다.


class A
class B : virtual public A
class C : virtual public A
class D : public B, pubic C

D d;
int fucB( B* b)  
int fucC( C* c)

r = fucB(&d),  r= funcC(&d)

위 함수 funcB(&d)는 객체 d의 class B부분의 주소가 넘어가고
funcC(&d)는 객체 d의 class C부분의 주소가 넘어갑니다.

근데 함수내에서 dynamic_cast(void*) <d>하면 d의 시작 주소를 알수 있습니다.

cost_cast
요놈 정말이 별거 아니지만 사랑스러운 놈입니다.
포인터나 레퍼런스의 const, volatile, __unaligned 을 변경합니다.
그외의 타입변환은 허락하지 않습니다.
별거인것 같지만 정말 사랑스러운 놈입니다.

reinterpret_cast
요놈이 정말 간단합니다. 임의의 포인터간의 변환  수치형과 포인터간의 변환
요 두가지를 수행하는데....
임의의 포인터간의 변환은 이해가 쉽지만,
수치형과 포인터간의 변환의 약간의 오해가 있을수 있어 추가 기술합니다.
int 호환타입과 포인터간의 변환을 허용합니다.




PS.
C++을 잘하기 위해서는 C기본이 아주 착실해야 합니다.
int호환 타입이라면 대부분 short int long요렇게 생각하는데...
모든 기본형이 int호환 타입니다.
요걸 모른다면 캐스트 연산자에대한 이해가 좀 어렵지요..
그리고 bool도 C++에서 새로이 기본 타입으로 추가되었다는 사실도 절대로 잊지마세요..
(1바이트의 수치형 타입이라는것,   그러나 가질수있는값은 true false뿐이라는 사실도)

그럼
아루스 [tinydew4]   2012-08-08 14:43 X
cost_cast -> const_cast

+ -

관련 글 리스트
228 캐스팅...... 김상면 24186 2012/05/29
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.