[C++] keyword: static_cast, dynamic_cast, reinterpret_cast, const_cast
1. μ€λͺ
Cμ μΊμ€νΈ μ°μ°μλ λ³μμ νμ μ λ°κΏ μ μλ€λ λ©΄μμ νΈλ¦¬νκ³ μ μ°ν μ½λ μμ±μ λμμ€λ€. νμ§λ§ λ무 λ¬΄μ± μνκ³ κ°λ°μμκ² λͺ¨λ κ²μ λ λκΈ΄λ€. C++μμλ μ’ λ μμ νκ³ λ³ν λͺ©μ μ λ§κ² κ³¨λΌ μΈ μ μλ 4κ°μ μλ‘μ΄ μΊμ€νΈ μ°μ°μλ₯Ό μ 곡νλ€.
-
static_cast
-
reinterpret_cast
-
dynamic_cast
-
const_cat
1.1) static_cast
static_cast μ°μ°μλ μ§μ ν νμ μΌλ‘ λ³κ²½νλλ° λ¬΄μ‘°κ±΄ λ³κ²½νλ κ²μ΄ μλλΌ λ Όλ¦¬μ μΌλ‘ λ³ν κ°λ₯ν νμ λ§ λ³ννλ€.
void main()
{
const char* str = "korea";
int* pi;
double d = 123.456;
int i;
i = static_cast<int>(d); // κ°λ₯
pi = static_cast<int*>(str); // μλ¬
pi = (int*)str; // κ°λ₯
}
μ€μνμ dλ₯Ό μ μνμΌλ‘ μΊμ€ν νκ±°λ λ°λμ κ²½μ°λ νμ©λλ€. κ·Έλ¬λ ν¬μΈν°μ νμ μ λ€λ₯Έ κ²μΌλ‘ λ³ννλ κ²μ νμ©λμ§ μμΌλ©° μ»΄νμΌ μλ¬λ‘ μ²λ¦¬λλ€.
μνν μΊμ€νΈ μ°μ°μ μ»΄νμΌ μ€μ μλ € μ€μΌλ‘μ¨ μ€μλ₯Ό λ°©μ§ν μ μλ€.
class Parent {};
class Child : public Parent {};
void main()
{
Parent p, * ptrP;
Child c, * ptrC;
int i = 1;
ptrP = static_cast<Parent*>(&c); // κ°λ₯
ptrC = static_cast<Child*>(&p); // κ°λ₯νμ§λ§ μν
ptrP = static_cast<Parent*>(&i); // μλ¬
ptrC = static_cast<Child*>(&i); // μλ¬
}
Parentμ Childλ μμ κ΄κ³μ μλ ν΄λμ€λ€. μμ κ΄κ³μ μλ ν΄λμ€ ν¬μΈν°λΌλ¦¬λ μνΈ νμ λ³νν μ μλ€. λΆλͺ¨ κ°μ²΄μ λ²μ§λ₯Ό μμ κ°μ²΄μ ν¬μΈν°λ‘ λ€μ΄ μΊμ€ν (Down casting)νλ κ²μ μννμ§λ§ static_castλ μ€ν μ€μ νμ 체ν¬λ₯Ό νμ§ μμΌλ―λ‘ μ΄ λ³νμ΄ μννλ€λ κ²κΉμ§λ λͺ¨λ₯΄λ μΌλ¨ νμ©νλ€.
1.2) dynamic_cast
dynamic_castλ ν¬μΈν°λΌλ¦¬ νΉμ λ νΌλ°μ€λΌλ¦¬ λ³ννλλ°, λ°λμ ν¬μΈν°λ ν¬μΈν°λ‘ λ³νν΄μΌ νκ³ λ νΌλ°μ€λ λ νΌλ°μ€λ‘ λ³νν΄μΌ νλ€. ν¬μΈν°λΌλ¦¬ λ³νν λλ λ°λμ μμ κ³μΈ΅μ μν ν΄λμ€λΌλ¦¬λ§ λ³νν μ μλ€.
dynamic_castλ static_castμ λ¬λ¦¬ λΆλͺ¨ μμκ°μ λ³νν λ λ€μ΄ μΊμ€ν μ κ²½μ° λ¬΄μ‘°κ±΄ λ³νμ νμ©νμ§ μκ³ μμ νλ€κ³ νλ¨λ λλ§ νμ©νλ€.
#include <iostream>
using namespace std;
class Parent
{
public:
virtual void print_me() { cout << "I am Parent\n"; }
};
class Child : public Parent
{
private:
int num;
public:
Child(int anum = 1234) : num(anum) { }
virtual void print_me() override { cout << "I am Child\n"; }
void print_num() { cout << "Hello Child = " << num << endl; }
};
void main()
{
Parent p, * ptrP, * ptrP2;
Child c, * ptrC, * ptrC2;
ptrP = &p;
ptrC = &c;
ptrP2 = dynamic_cast<Parent*>(ptrC); // μ
μΊμ€ν
- μμ
ptrC2 = dynamic_cast<Child*>(ptrP2); // λ€μ΄ μΊμ€ν
- κ²½μ°μ λ°λΌ λ€λ₯΄λ€
cout << "ptrC2 = " << ptrC2 << endl;
ptrC2 = dynamic_cast<Child*>(ptrP); // μΊμ€ν
λΆκ°λ₯(nullptr)
cout << "ptrC2 = " << ptrC2 << endl;
}
ptrC2 = 000000E4B9EFFA68
ptrC2 = 0000000000000000
λΆλͺ¨ ν΄λμ€ν ν¬μΈν°κ° λΆλͺ¨ κ°μ²΄λ₯Ό κ°λ¦¬ν€κ³ μλ μν© μΌ λ μμ ν΄λμ€νμΌλ‘μ λ€μ΄ μΊμ€ν μ μμ νμ§ μμ λ³νμ΄λ€. μ΄λ° κ²½μ° μΊμ€ν μ νμ©νμ§ μκ³ nullptrμ 리ν΄νλ€.
dynamic_cast μ°μ°μμ λ³ν λμ νμ λ€λΌλ¦¬λ μμ κ΄κ³μ μμ΄μΌ νκ³ μ΅μν νλ μ΄μμ κ°μ ν¨μλ₯Ό κ°μ ΈμΌ νλ€.
λ νΌλ°μ€μ λν΄μλ μΊμ€ν ν μ μλλ° λ νΌλ°μ€μ κ²½μ°λ μλ¬μ ν΄λΉνλ NULLμ 리ν΄ν μ μμΌλ―λ‘ bad_cast μμΈλ₯Ό λμ§λ€.
1.3) const_cast
const_cast μΊμ€νΈ μ°μ°μλ ν¬μΈν°μ μμμ±λ§ λ³κ²½νκ³ μΆμ λ μ¬μ©νλ€.
μμ μ§μ ν¬μΈν°λ₯Ό λΉμμ μ§μ ν¬μΈν°λ‘ μ μ λ°κΎΈκ³ μΆμ λ const_cast μ°μ°μλ₯Ό μ΄λ€.
λ°λμ κ²½μ°λ λ¬Όλ‘ μ΄ μ°μ°μλ₯Ό μ¬μ©ν μ μκ² μ§λ§ λΉ μμ μ§μ ν¬μΈν°λ μμ μ§μ ν¬μΈν°λ‘ νμ λ³ν κ°λ₯νλ―λ‘ μΊμ€νΈ μ°μ°μλ₯Ό μΈ νμκ° μλ€.
#include <iostream>
using namespace std;
void main()
{
char str[] = "string";
const char* c1 = str;
char* c2;
c2 = const_cast<char*>(c1);
c2[0] = 'a';
cout << c2 << endl;
}
atring
μμ μ§μ ν¬μΈν° c1μ λΉ μμ μ§μ ν¬μΈν° strμ λ³λ€λ₯Έ μ μ½ μμ΄ λμ λ°μ μ μλ€.
μ΄λ κ² λμ λ°μ ν¬μΈν°λ₯Ό λ€λ₯Έ λΉμμ μ§μ ν¬μΈν° c2μ λμ νκ³ μ ν λλ c2=c1μΌλ‘ λ°λ‘ λμ ν μ μλ€.
λ ν¬μΈν°μ μμμ±μ΄ λ€λ₯΄λ©° c1μ΄ κ°λ¦¬ν€λ μ½κΈ° μ μ© κ°μ c2λ‘ λΆμ£Όμνκ² λ°κΏ λ²λ¦΄ μνμ΄ μκΈ° λλ¬Έμ΄λ€.
κ·Έλ¬λ μ΄ κ²½μ° c1μ΄ κ°λ¦¬ν€λ λμ(μ΅μ΄ λμ λ°μ str)μ΄ λ³κ²½ κ°λ₯ν λμμ΄λΌλ κ²μ νμ€ν μκ³ μμΌλ―λ‘ c1μ μμμ±λ§ μ μ 무μνλ©΄ λμ κ°λ₯νλ€. μ΄λ const_cast μ°μ°μλ‘ c1μ char *λ‘ μΊμ€ν ν μ μλ€.
1.4) reinterpret_cast
reinterpret_cast μ°μ°μλ μμμ ν¬μΈν° νμ λΌλ¦¬ λ³νμ νμ©νλ μλΉν μνν μΊμ€νΈ μ°μ°μλ€.
μ¬μ§μ΄ μ μνκ³Ό ν¬μΈν°κ°μ λ³νλ νμ©νλ€. μ μν κ°μ ν¬μΈν° νμ μΌλ‘ λ°κΎΈμ΄ μ λ λ²μ§λ₯Ό κ°λ¦¬ν€λλ‘ νλ€κ±°λ ν λ μ΄ μ°μ°μλ₯Ό μ¬μ©νλ€.
int *pi;
char *pc;
pi=reinterpret_cast<int *>(12345678);
pc=reinterpret_cast<char *>(pi);
μ΄ μ°μ°μλ ν¬μΈν° νμ κ°μ λ³νμ΄λ ν¬μΈν°μ μμΉν λ°μ΄ν°μ λ³νμλ§ μ¬μ©νλ©° κΈ°λ³Έ νμ λ€λΌλ¦¬μ λ³νμλ μ¬μ©ν μ μλ€. μλ₯Ό λ€μ΄ μ μνμ μ€μνμΌλ‘ λ°κΎΈκ±°λ μ€μνμ μ μνμΌλ‘ λ°κΎΈλ κ²μ νλ½λμ§ μλλ€. μ΄λ΄ λλ static_cast μ°μ°μλ₯Ό μ¬μ©ν΄μΌ νλ€.
2. μ°Έκ³ λ° μΆμ²
http://soen.kr/
'Language > C++' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[C++11] keyword: static_assert (1) | 2020.07.23 |
---|---|
[C++] keyword: enum class (0) | 2020.07.23 |
[C++] keyword: noexcept (0) | 2020.07.23 |
[C++11] keyword: constexpr (0) | 2020.07.23 |
[C++] keyword: using (0) | 2020.07.23 |
λκΈ
μ΄ κΈ κ³΅μ νκΈ°
-
ꡬλ
νκΈ°
ꡬλ νκΈ°
-
μΉ΄μΉ΄μ€ν‘
μΉ΄μΉ΄μ€ν‘
-
λΌμΈ
λΌμΈ
-
νΈμν°
νΈμν°
-
Facebook
Facebook
-
μΉ΄μΉ΄μ€μ€ν 리
μΉ΄μΉ΄μ€μ€ν 리
-
λ°΄λ
λ°΄λ
-
λ€μ΄λ² λΈλ‘κ·Έ
λ€μ΄λ² λΈλ‘κ·Έ
-
Pocket
Pocket
-
Evernote
Evernote
λ€λ₯Έ κΈ
-
[C++11] keyword: static_assert
[C++11] keyword: static_assert
2020.07.23 -
[C++] keyword: enum class
[C++] keyword: enum class
2020.07.23 -
[C++] keyword: noexcept
[C++] keyword: noexcept
2020.07.23 -
[C++11] keyword: constexpr
[C++11] keyword: constexpr
2020.07.23