πŸ”₯μ½”λ”© 법칙 : c++μ—μ„œμ˜ 4가지 casting_ xvalue , glvalue

보물창고·2022λ…„ 8μ›” 13일
0

c++ basic μ½”λ“œλˆ„λ¦¬

λͺ©λ‘ 보기
23/50
post-custom-banner

μ—…λ°μ΄νŠΈ 240821 정리.

static_cast

  • μ„œλ‘œ 관련이 μ—†λŠ” λ‹€λ₯Έ κ°μ²΄κ°„μ˜ μΊμŠ€νŒ…μ€ λΆˆκ°€ν•˜λ‹€.
  • 상속 관계에 μžˆμ„ λ•Œλ§Œ κ°€λŠ₯ν•˜λ‹€.
  • 컴파일 μ‹œκ°„μ— μΊμŠ€νŒ…μ„ ν•œλ‹€.
  • μ „μ μœΌλ‘œ μ±…μž„μ€ μœ μ €μ—κ²Œ 있고, μ•ˆμ „μΉ˜ λͺ»ν•˜λ‹€.

dynamic_cast

  • μƒμ†κ΄€κ³„μ—μ„œ κ°€λŠ₯ν•˜λ‹€.
  • vTable의 rtti κ°€ μ‹€μ œ 객체λ₯Ό 가지고 μžˆμ„ λ•Œλ§Œ νŒλ³„μ΄ κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ—
    λ°˜λ“œμ‹œ κ°€μƒν•¨μˆ˜κ°€ ν•œκ°œλΌλ„ μžˆμ–΄μ•Ό ν•œλ‹€.
  • λŸ°νƒ€μž„ 도쀑에 μ§„ν–‰ν•œλ‹€.
  • rtti 객체λ₯Ό 톡해 μΊμŠ€νŒ…μ„ ν•˜κΈ° λ•Œλ¬Έμ— μ•ˆμ „μ„±μ΄ μžˆλ‹€.
  • ν•˜μ§€λ§Œ, static_cast λ³΄λ‹€λŠ” λŠλ¦¬λ‹€.

reinterpret_cast

  • λ‹€λ₯Έ 포인터 νƒ€μž…κ°„μ˜ ν˜•λ³€ν™˜μ„ ν—ˆμš©ν•œλ‹€.
  • 보톡 void* νƒ€μž…μœΌλ‘œ μΊμŠ€νŒ…ν•œλ‹€.
  • κ°•μ œμ μΈ ν˜•λ³€ν™˜μ΄λ‹€.
  • ν˜•λ³€ν™˜μ‹œ λ‹€λ₯Έ μΊμŠ€νŒ…μ€ λ©”λͺ¨λ¦¬κ°’듀이 λ‹¬λΌμ§€μ§€λ§Œ, reinterpret_cast λ°˜ν™˜κ°’μ˜ λ©”λͺ¨λ¦¬λŠ” κ·ΈλŒ€λ‘œλ‹€.
  • λ”°λΌμ„œ λ°˜λ“œμ‹œ 원본 νƒ€μž…μœΌλ‘œμ˜ ν˜•λ³€ν™˜μ„ ν•΄μ„œ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.
    reinterpret_cast λ°˜ν™˜ λ‚΄μš©μœΌλ‘œ μ‚¬μš©ν•˜λ©΄ μ ˆλŒ€ μ•ˆλœλ‹€. μ™œλƒν•˜λ©΄ μ–΄λ–€ νƒ€μž…μΈμ§€ λͺ¨λ₯Έλ‹€.

240614 μ•„λž˜μ— xvalueκ°€ λ‚˜μ˜¨λ‹€.

: λ°˜ν™˜ λ°›λŠ” νƒ€μž…μ— λ”°λΌμ„œ glvalue둜 인해 κ·Έλƒ₯ μ°Έμ‘° 처럼 λ°˜μ‘ν• μ§€?
rvalue둜 인해 이동 μ²˜λ¦¬ν• μ§€? 에 λŒ€ν•œ μ˜ˆμ‹œκ°€ μžˆλ‹€.

κ°’, μ°Έμ‘° μΊμŠ€νŒ…μ˜ 결과에 λŒ€ν•΄ 240427 μΆ”κ°€

ν΄λž˜μŠ€μ—μ„œμ˜ κ°’ λ³€ν™˜μ€ μž„μ‹œ 객체λ₯Ό λ§Œλ“œλŠ” κ²ƒμž„
μ°Έμ‘° νƒ€μž… λ³€ν™˜μ€ κΈ°μ‘΄ 객체의 λ©”λͺ¨λ¦¬λ₯Ό κ·ΈλŒ€λ‘œ μ‚¬μš©.

  • κ°’ μΊμŠ€νŒ…μ€ 볡사가 λ°œμƒν•˜λŠ” 것을 확인할 수 μžˆλ‹€.

  • μ°Έμ‘° μΊμŠ€νŒ…μ€ 볡사 λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€.

  • -> 그런데 λ°›λŠ” 객체의 νƒ€μž…μ΄ value 인 경우, μ°Έμ‘° μΊμŠ€νŒ…μ΄λ”λΌλ„
    볡사가 λ°œμƒν•œλ‹€. : μ‹€ν—˜ν•΄λ΄„.

xvalue -> glvalue? rvalue? 240614

  • rvalue 참쑰의 경우, μ‹ κΈ°ν•œκ²Œλ„ bκ°€ rvalue 인데도 moveκ°€ λ°œμƒν•˜μ§€ μ•Šκ³ , κ·Έλƒ₯ 참쑰둜 받아듀이고 μžˆλ‹€.

: 읭??? 뭐냐??? 넀이버 λΈ”λ‘œκ·Έ xvalue μ°Έκ³ .

-> μ—¬κΈ°μ„œλŠ” glvalue의 νŠΉμ„±μ„ 가지고 μžˆλŠ” 것이닀.
: rvalueλŠ” ν•œλ²ˆ μ΄ˆκΈ°ν™”λ˜λ©΄ , lvalue νŠΉμ„±μ„ κ°€μ§€κ²Œ λ˜λŠ”λ°, μ—¬κΈ°μ„œλŠ”
lvalue 참쑰둜 λ°˜μ‘ν•΄μ„œ 볡사, 이동 λ°œμƒν•˜μ§€ μ•ŠμŒ.

  • μ—¬κΈ°μ„œλŠ” rvalue의 νŠΉμ„±μ— μ˜ν•΄μ„œ move λ°œμƒν•¨.
    -> λ°˜ν™˜ λ°›λŠ” νƒ€μž…μ΄ value 이기 λ•Œλ¬Έμ— 이동이 λ°œμƒν•˜λŠ” 것을 확인할 수 μžˆλ‹€.

μœ„λ₯Ό ν†΅ν•΄μ„œ rvalue μ°Έμ‘° λ°˜ν™˜μ€ xvalue 라고 ν•˜λŠ”λ°,
λ°˜ν™˜ λ°›λŠ” νƒ€μž…λ„ μ€‘μš”ν•˜λ‹€.


이전 λ‚΄μš©.

  • bλ₯Ό 일반 value νƒ€μž…μœΌλ‘œ λ³€κ²½ν•˜λ©΄, 이동이 이루어진닀.

  • 즉, move ν•¨μˆ˜μ˜ κ²½μš°λ„ λ°˜ν™˜λ°›λŠ” νƒ€μž…μ— 영ν–₯을 λ°›λŠ”λ‹€.
    λ°˜ν™˜λ°›λŠ” νƒ€μž…μ΄ &&참쑰라고 ν•œλ‹€λ©΄, ν•˜λ‚˜μ˜ & lvalue 참쑰둜 μΈμ‹ν•˜κ³ ,
    λ°˜ν™˜λ°›λŠ” νƒ€μž…μ΄ value 라고 ν•œλ‹€λ©΄, moveκ°€ 이루어진닀.

상속 κ΄€κ³„μ—μ„œμ˜ μΊμŠ€νŒ… κ°œλ….

μžμ‹μ—μ„œμ˜ λΆ€λͺ¨λ‘œμ˜ ν˜•λ³€ν™˜μ€ μ–΄λ–€ ν˜•μ΄λ“  문제 μ—†μŒ
: λ‹Ήμ—°ν•œ κ²°κ³Ό (λ©”λͺ¨λ¦¬ κ΅¬μ‘°μ—μ„œ μžμ‹μ€ λΆ€λͺ¨μ˜ λ©”λͺ¨λ¦¬λ₯Ό 포함)
but, λΆ€λͺ¨μ—μ„œμ˜ μžμ‹μœΌλ‘œμ˜ ν˜•λ³€ν™˜μ˜ 경우, κ°’λ³€ν™˜μ€ λΆˆκ°€ν•¨.
-> μ΄λ•ŒλŠ” μ£Όμ†Œκ°€ μ•„λ‹ˆλ―€λ‘œ, λ©”λͺ¨λ¦¬ ꡬ쑰λ₯Ό 바라봄.
μ°Έμ‘° λ³€ν™˜μ˜ 경우, 클래슀의 λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό ν†΅ν•œ λŒ€μž…μ΄κΈ° λ•Œλ¬Έμ— κ°€λŠ₯함.
근데 μžμ‹μ˜ 멀버 μ°Έμ‘°μ‹œ λ―Έμ •μ˜ λ™μž‘ λ°œμƒν•¨. κ°œλ°œμžκ°€ μ•Œμ•„μ„œ...

virtual μƒμ†μ˜ 경우.

  • c++ νŠΉλ³„νŒ p.554 / fundamental : 좔후에
    : λΆˆκ°€ν•¨.

static_cast vs dynamic_cast

  • c++ νŠΉλ³„νŒ p.554

    static_cast
    : μ•ˆμ „ν•˜μ§€ μ•ŠμŒ. μ•ˆμ „μ„± λ¬Έμ œλŠ” κ°œλ°œμžκ°€ μ•Œμ•„μ„œ ν•΄.
    dynamic_cast
    : μ•ˆμ „ν•¨. λŸ°νƒ€μž„ λΉ„μš©μžˆκΈ° λ•Œλ¬Έμ— 느림. νƒ€μž… μ²΄ν¬λŠ” μ»΄νŒŒμΌλŸ¬κ°€ 함.
    -> μ—¬κΈ°μ„œμ˜ νƒ€μž…μ²΄ν¬λŠ” κ°€μƒν…Œμ΄λΈ”μ— μžˆλ‹€. funcda c++ 책에 있음.

void 포인터

: c++ νŠΉλ³„νŒ p.170

  • λͺ¨λ“  포인터λ₯Ό λŒ€μž… κ°€λŠ₯함.
  • void *λ₯Ό λ‹€λ₯Έ 포인터에 λ³€ν™˜ κ°€λŠ₯함.

    μ»΄νŒŒμΌλŸ¬λŠ” void 포인터가 μ–΄λ–€ 객체의 정보λ₯Ό 가지고 μžˆλŠ”μ§€ μ•Œμˆ˜ μ—†κΈ° λ•Œλ¬Έμ— μ—­μ°Έμ‘°, 증감연산 등은 λΆˆκ°€ν•¨.
    κ·Έλž˜μ„œ λ°˜λ“œμ‹œ μ›ν˜• νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•΄μ•Ό 함.
    κ·Έλƒ₯ μ£Όμ†Œκ°’λ§Œ μ•Œκ³  μžˆμ„ 뿐.. λ‚΄κ°€ κ°€λ¦¬ν‚€λŠ” λ©”λͺ¨λ¦¬ μ£Όμ†Œμ— μžˆλŠ” 데이터가 λͺ‡λ°”μ΄νŠΈμ— μžˆλŠ” 값인지 μ•Œ 수 μ—†λ‹€...

explicit casting

: c++의 4가지 μΊμŠ€νŒ… 방법.

κ°œλ…. λ‹€μš΄μΊμŠ€νŒ…μ΄ κ°€λŠ₯ν•˜λ‹€λŠ” 것은 상속관계 이더라도 포인터 λ˜λŠ” μ°Έμ‘° ν˜•μ‹μ΄μ–΄μ•Όλ§Œ 함.

1. static_cast

κ°œλ…. 컴파일 μ‹œκ°„μ— νƒ€μž… κ²€μ‚¬ν•˜μ§€ μ•Šκ³  μΊμŠ€νŒ…ν•˜λŠ” 것을 말함.

μ•„λž˜μ˜ λ²ˆν˜Έμ— 해당함.
1. μ •μˆ˜μ™€ μ‹€μˆ˜ μ‚¬μ΄μ˜ ν˜•λ³€ν™˜ : int <-> double
: μ‹€μˆ˜μ˜ 경우, λΆ€λ™μ†Œμˆ˜μ  잘림.
2. μ—΄κ±°ν˜•κ³Ό μ •μˆ˜ μ‚¬μ΄μ˜ ν˜•λ³€ν™˜
3. void*λ₯Ό λ‹€λ₯Έ νƒ€μž…μ˜ ν¬μΈν„°λ‘œ.
μ˜ˆμ‹œ : malloc둜 λ™μ ν• λ‹Ήν•œ 후에 포인터 λ³€μˆ˜μ— μ°Έμ‘°ν• λ•Œ .

  • but, λ‹€λ₯Έ νƒ€μž…μ˜ 포인터 끼리의 static_castλŠ” λΆˆκ°€ν•¨.
  • bind의 2λ²ˆμ§ΈλŠ” sockaddr둜 포인터 ν˜•λ³€ν™˜μ„ ν•΄μ•Όν•˜λ―€λ‘œ, μ΄λ•ŒλŠ” reinterpret_cast둜
    μΊμŠ€νŒ…ν•΄μ•Ό 함.
  1. λ™μΌν•œ νƒ€μž…μ˜ λ³€μˆ˜ μ£Όμ†Œμ™€ 포인터 κ°„μ˜ ν˜•λ³€ν™˜ 만 κ°€λŠ₯함.
    : int a <-> int * p κ°€λŠ₯
    :: double d <-> int
    *p λΆˆκ°€ν•¨.

μ£Όμ˜ν•  점.

  • μ•„λž˜ μ˜ˆμ‹œμ½”λ“œλ₯Ό 톡해 μ•Œ 수 μžˆλ“―μ΄ λ‹€λ₯Έ 포인터 <-> λ‹€λ₯Έ ν¬μΈν„°λŠ” λΆˆκ°€ν•¨.
    : reinterpret μ—μ„œ κ°€λŠ₯함
  1. λ°°μ—΄ -> 포인터
  2. ν•¨μˆ˜ -> ν•¨μˆ˜ ν¬μΈν„°λ‘œμ˜ ν˜•λ³€ν™˜
  • ν•¨μˆ˜ 포인터 μš©λ„λ‘œ μ‚¬μš©λ˜λŠ” μ½”λ“œ
void foo(int) {}

int main()
{
	auto p2 = static_cast<void(*)(int)>(&foo);
    
    p2(0); // ν˜ΈμΆœν•˜κΈ° 

}

  • λ‹€λ₯Έ ν¬μΈν„°κ°„μ˜ ν˜•λ³€ν™˜ λΆˆκ°€ν•˜λ‹€λŠ” 것을 λ³΄μ—¬μ£ΌλŠ” μ˜ˆμ‹œ μ½”λ“œ


6. μƒμ†κ΄€κ³„μ—μ„œ λ‹€μš΄μΊμŠ€νŒ…λ„ κ°€λŠ₯함.
- dynamic_cast 보닀 속도 빠름. but μ•ˆμ „ν•˜μ§€ μ•ŠμŒ.
-> λ§ˆμ§€λ§‰ 50번μž₯μ—μ„œ κ΄€λ ¨ μ½”λ“œ 있음.
7. μ—°κ΄€μ„± ν•˜λ‚˜λ„ μ—†λŠ” 클래슀 λΆˆκ°€ν•¨.
8. λ³€ν™˜ μ—°μ‚°μž ν•¨μˆ˜λ₯Ό λ§Œλ“ λ‹€λ©΄ κ°€λŠ₯함.
μ˜ˆμ™Έ : μ μ ˆν•œ μƒμ„±μž A(const& B ) ν˜•μ‹μœΌλ‘œ λ§Œλ“€μ–΄μ€€λ‹€λ©΄,
A a = b; κ°€λŠ₯
9. κ°’ ν˜•μ‹μ˜ λ‹€μš΄μΊμŠ€νŒ… λΆˆκ°€ν•¨.

2. reinterpret_cast

: κ°•μ œμ„±μ„ 가지고 있음.
κ°€) μ„œλ‘œ λ‹€λ₯Έ 포인터 끼리의 ν˜•λ³€ν™˜μž„.
λ‚˜) μ •μˆ˜μ™€ 포인터 μ‚¬μ΄μ˜ ν˜•λ³€ν™˜.

1) reinterpret_cast λ³€ν™˜ν›„, ν•΄λ‹Ή 객체의 νƒ€μž… 정보, μ‚¬μ΄μ¦ˆλ“± μ•Œ 수 μ—†κΈ° λ•Œλ¬Έμ— λ‹€μ‹œ μ›λž˜ ν˜•μœΌλ‘œ reinterpret_cast ν•΄μ•Ό 함.

: νŒ¨ν‚·μ§λ ¬ν™” μ—μ„œ μ‚¬μš©!
-> BufferReader / BufferWrite 클래슀의 μ‹œν”„νŠΈ μ—°μ‚°μž μ˜€λ²„λ‘œλ”© ν•¨μˆ˜μ—μ„œμ˜ μ˜ˆμ‹œ μ½”λ“œ.

2) κ°’λ³€ν™˜μ— μ‚¬μš© λͺ»ν•¨.

3) μ—°κ΄€μ„± μ—†λŠ” 객체 ν¬μΈν„°κ°„μ˜ ν˜•λ³€ν™˜ κ°€λŠ₯. (κ°•μ œμ„±μ„ 가지고 있기 λ•Œλ¬Έμž„.)

-> 이 λ•ŒλŠ” μ°Έμ‘°ν•  경우 λ―Έμ •μ˜ λ™μž‘ λ°œμƒ.

4) λ©”λͺ¨λ¦¬ μ£Όμ†Œ μ •λ³΄λ§Œ 가지고 있기 λ•Œλ¬Έμ— μ•ˆμ „ν•˜μ§€ μ•ŠμŒ.

  • νŠΉμ§•
    : ν˜•λ³€ν™˜ 이후에, μ—­μ°Έμ‘°ν•΄μ„œ κΈ°μ‘΄ 데이터 λ²”μœ„ λ²—μ–΄λ‚˜λŠ” 값을 넣을 경우, λ―Έμ •μ˜ λ™μž‘μ΄ λ°œμƒν•¨.
  • void포인터일 경우, μ—­μ°Έμ‘° λΆˆκ°€ν•¨.
  • μ½”λ“œ
    : μ΄μ „μ‹œκ°„μ— double* κ³Ό int ν˜•λ³€ν™˜μ„ ν•΄λ³΄μž.
    -> ν•΄κ²°λ˜μ§€ μ•ŠμŒ.

  • κ²°λ‘ 
    : λ‹€λ₯Έ νƒ€μž…μ˜ ν¬μΈν„°λ‘œμ˜ ν˜•λ³€ν™˜μ€ ν•˜μ§€ 말자!

  • μ•„λž˜ 그림을 보면, n 의 데이터가 λ§κ°€μ§€λŠ” 것을 확인할 수 있음.

3. const_cast

: 포인터 와 ref λ³€μˆ˜μ˜ μƒμˆ˜μ„±(const)κ³Ό volatile을
μ œκ±°ν•˜λŠ” ν˜•λ³€ν™˜. (일반 const λ³€μˆ˜λŠ” μ£Όμ†Œκ°’μœΌλ‘œ μž‘μ„±ν•΄μ•Ό 함.)

  • μΈμžλ‘œλŠ” λ°˜λ“œμ‹œ ν¬μΈν„°λ‚˜ λ ˆνΌλŸ°μŠ€κ°€ λ“€μ–΄κ°€μ•Ό 함.

    // error : κ°œλ…μ— 어긋남.

https://clucle.tistory.com/entry/c-constcast-%EA%B0%80-%ED%95%84%EC%9A%94%ED%95%9C-%EC%9D%B4%EC%9C%A0

μ€‘μš”!

  • const_cast 포인터 μ—­μ°Έμ‘°λ‘œ μˆ˜μ • λΆˆκ°€ν•¨.
    : κ²°κ³Όκ°€ λͺ¨μˆœ 덩어리닀....
    μ•„λ‹ˆ μ•„λž˜ κ²°κ³Όλ₯Ό ν†΅ν•΄μ„œ μΊμŠ€νŒ…μ„ ν•˜κ²Œλ˜λ©΄ μž„μ‹œκ°μ²΄κ°€ 생성됨을 확인할 수 있음.
  • const 값을 μ§„μ§œ λ³€κ²½ν•˜κΈ° μœ„ν•΄μ„œλŠ” 포인터 λ³€μˆ˜λ‘œ μ—­μ°Έμ‘°ν•˜λŠ” 것이 μ•„λ‹ˆλΌ, ν•΄λ‹Ή constλ³€μˆ˜λ₯Ό λ‹€μ΄λ ‰νŠΈλ‘œ const_castν•΄μ„œ λ°”λ‘œ λ³€κ²½ν•΄μ•Ό 함.

  • const ν¬μΈν„°μ˜ 경우 예제 μ½”λ“œ
    -> μ§„μ§œ cλ₯Ό λ°”κΎΈκΈ° μœ„ν•΄μ„œλŠ” μ•„λž˜μ˜ 그림처럼 c에 직접 μ ‘κ·Όν•΄μ•Ό 함.

4. dynamic_cast

κ°œλ…

λŸ°νƒ€μž„ 에 νƒ€μž…μ²΄ν¬λ₯Ό ν•˜λŠ” ν˜•λ³€ν™˜.
λ‹€μš΄ μΊμŠ€νŒ… κ΄€κ³„μ—μ„œ νƒ€μž… 체크 ν•˜λŠ” μš©λ„λ‘œ μ‚¬μš©.

ν™œμš©

  • λ‹€μš΄ μΊμŠ€νŒ…μ— μ‚¬μš©ν•¨.
  • λ°˜λ“œμ‹œ λ‹€ν–₯성을 띄고 μžˆμ–΄μ•Ό 함.
  • 포인터 νƒ€μž…μΈ 경우, μ‹€νŒ¨ν•˜λ©΄ 0 , μ„±κ³΅ν•˜λ©΄ ν•΄λ‹Ή ν˜•μœΌλ‘œ λ°˜ν™˜ν•¨.
    : νŒŒμƒ 객체둜의 ν˜•λ³€ν™˜ 체크할 λ•Œ μ‚¬μš©ν•¨.
  • μ°Έμ‘° νƒ€μž…μ΄λ©΄ μ˜ˆμ™Έμ²˜λ¦¬λ¨.

dynamic_cast κ°€ μ„±κ³΅ν•˜λŠ” 쑰건

  • μ—…μΊμŠ€νŒ…λœ 포인터λ₯Ό 인수둜 전달해야 μ˜¬λ°”λ₯Έ λ°˜ν™˜κ°’μ„ 얻을 수 있음.
    Base (포인터)base = new derived; -> μ΄κ±°λŠ” λ‹Ήμ—°μ‹œ
    derived (포인터) dd = dynamic_cast<derived >(base );
    : μ™œλƒν•˜λ©΄ base ν¬μΈν„°λŠ” derived의 λ©”λͺ¨λ¦¬λ₯Ό μ•Œκ³  있기 λ•Œλ¬Έμ—

  • μΆ”κ°€ 쑰건
    : λ°˜λ“œμ‹œ virtual ν•¨μˆ˜κ°€ μžˆμ–΄μ•Ό 함.
    -> μ‹€ν–‰μ‹œκ°„μ— μ²˜λ¦¬ν•˜κΈ° μœ„ν•¨.

https://velog.io/@kwt0124/rtti

πŸ”₯dynamic_cast μ–Έμ œ ν™œμš©ν• κΉŒ?

: 포인터 객체가 νŒŒμƒ 객체에 μ†ν•˜λŠ”μ§€ 확인할 λ•Œ μ‚¬μš©ν•¨.

예λ₯Ό λ“€λ©΄, ν”Œλ ˆμ΄μ–΄κ°€ 좩돌처리 ν•˜λ €κ³  ν•˜λŠ”λ°, 전방에 μžˆλŠ” 것이 λͺ¬μŠ€ν„°μΌ λ•Œ hp κ°μ†Œν•˜λŠ” λ™μž‘μ„ κ΅¬ν˜„ν•˜κ³ μž ν•  λ•Œ, μ „λ°©μ˜ μ˜€λΈŒμ νŠΈκ°€ λͺ¬μŠ€ν„°μΈμ§€, μž₯애물인지 ?
-> 이 λ•Œ dynamic_cast λ₯Ό ν™œμš©ν•˜λŠ” 방법이 있음.
: 이 λ•Œ λ°˜λ“œμ‹œ ν•΄μ•Όν•  것이 λͺ¨λ“  였브젝트λ₯Ό 기반 으둜 ν•˜λŠ” ν΄λž˜μŠ€κ°€ μžˆμ–΄μ•Ό 함.

μ‚¬μš©λ²•.

static_cast<λ³€ν™˜ν•˜κ³ μž ν•˜λŠ” νƒ€μž…>(객체λͺ…μ΄λ‚˜ λ³€μˆ˜λͺ…)

problem

κ°€) μœ„μ˜ λ‚΄μš©μ„ ν† λŒ€λ‘œ μ½”λ”©ν•˜λΌ.

  • μ½”λ“œ
    : double을 intν˜•μœΌλ‘œ
    :: void * 을 int * ν˜•μœΌλ‘œ
    ::: νƒ€μž…μ΄ λ‹€λ₯Έ 포인터 κ°„μ˜ ν˜•λ³€ν™˜μ€ λΆˆκ°€ν•¨.
    - void 포인터 μ—μ„œ λ‹€λ₯Έ νƒ€μž… ν¬μΈν„°λ‘œμ˜ λ³€ν™˜λ§Œ κ°€λŠ₯함.
double d = 3.7;
int n = static_cast<int>(d);

int *p = static_cast<int*>(malloc(sizeof(int)));

int *p2 = static_cast<int *>(&d); // error

const int c = 10;
int *p3 = static_cast<int *>(&c); // error

λ‚˜) reinterpret_cast

  • static_cast λŠ” void 포인터 -> λ‹€λ₯Έ 포인터 νƒ€μž…μœΌλ‘œμ˜ ν˜•λ³€ν™˜ κ°€λŠ₯!
  • reinterpret_caseλŠ” λ‹€λ₯Έ 포인터 타인 -> λ‹€λ₯Έ 포인터 νƒ€μž…μœΌλ‘œμ˜ ν˜•λ³€ν™˜ κ°€λŠ₯!

int n = 10;
double * p1 = &n; // error : λΆˆκ°€ν•¨. 
double * p2 = static_cast<double *>(&n);
// error : staticμœΌλ‘œλŠ” λΆˆκ°€.
double *p3 = reinterpret_cast<double *>(&n);
// ok : reinterpret으둜 κ°€λŠ₯.

// μ •μˆ˜μ™€ 포인터 μ‚¬μ΄μ˜ λ³€ν™˜
int *p4 = 10; // error : μ£Όμ†Œκ°’ 10을 μ–΅μ§€λ‘œ λ„£κ³  μ‹Άλ‹€λŠ” μ˜μ§€μž„.
int *p5 = reinterpret_cast<int *>(10); // ok
double d2 = n; // ok : μ•”μ‹œμ  ν˜•λ³€ν™˜ κ°€λŠ₯함. // μ •μˆ˜κ°„ ν˜•λ³€ν™˜.
double d3 = reinterpret_cast<double>(n); 
// error : reinterpret_cast의 μš©λ„μ— λΆ€ν•©ν•˜μ§€ μ•ŠμŒ. 

λ‹€) const_cast

const int c = 10;
	volatile int v = 20;

	int n = c; // ok 
	//int* p = &c;
	// error : μ„œλ‘œ μ™„μ „νžˆ λ‹€λ₯Έ νƒ€μž…μ΄λ―€λ‘œ, μ•”μ‹œμ  ν˜•λ³€ν™˜ λΆˆκ°€ν•¨.
	int* p2 = const_cast<int*>(&c);
	// ok : c의 μƒμˆ˜μ„±μ„ μ œκ±°ν•¨! 
	int* p3 = reinterpret_cast<int*>(&c);
	// error : reinterpret_cast λŠ” const 속성이 있으면 포인터라도 λΆˆκ°€ν•¨. 

	double* p4 = const_cast<double*>(&c);
	// error : const_castλŠ” μƒμˆ˜μ„±λ§Œ μ œκ±°ν•  수 있음. 
	double* p5 = reinterpret_cast<double*>(const_cast<int*>(&c));

라) const int ν˜• λ³€μˆ˜μ˜ μ£Όμ†Œλ₯Ό char*λ³€μˆ˜μ— 넣어라.
- 2가지 방법이 있음.
1) reinterp -> const_cast
2) const_cast -> reinterp

κ²°λ‘ 

  • ν˜•λ³€ν™˜ ν•  λ•ŒλŠ” 일단 static_cast둜 μ‹œλ„ν•˜μž.
  • λ‹€λ₯Έ ν˜•μœΌλ‘œ λ³€ν™˜ν• λ•Œ, κΈ°μ‘΄ ν˜•μ˜ 데이터λ₯Ό μ΄ˆκ³Όν•œ 값을 λ„£μœΌλ©΄ , λ―Έμ •μ˜ λ™μž‘μ΄ λ°œμƒν•¨.
    -> ν˜•λ³€ν™˜μ€ 쒋지 μ•ŠμŒ!
profile
πŸ”₯πŸ”₯πŸ”₯
post-custom-banner

0개의 λŒ“κΈ€