[C++] cast operator

cast operator

C++에서는 형변환을 위한 연산자를 제공한다

dynamic_cast

dynamic cast는 두 가지의 경우에서 사용할 수 있다.
첫째는 상속 관계에 놓여 있는 두 클래스 사이에서 유도 클래스의 포인터 및 참조형 데이터를 기초 클래스의 포인터 및 참조형 데이터로 형 변환하는 경우이다.
둘때는 polymorphic 클래스에서 상속 관계에 놓여있는 두 클래스 사이에서 기초 클래스의 포인터 및 참조형 데이터를 유도 클래스의 포인터 및 참조형 데이터로 형 변환하는 경우이다.

static_cast

유도 클래스의 포인터 및 참조형 데이터를 기초 클래스의 포인터 및 참조형 데이터뿐만 아니라 기초 클래스의 포인터 및 참조형 데이터도 유도 클래스의 포인터 및 참조형 데이터로 조건 없이 변환한다. 하지만 책인은 개발자의 몫이다.

const_cast

포인터와 참조자의 const 키워드의 성향을 제거한다.

reinterpret_cast

전혀 상관없는 자료형의로의 형 변환에 사용된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
namespace VirtualClass {
class A {
public:
A() { cout << "A 생성자" << endl; }

~A() { cout << "A 소멸자" << endl; }

void f() { cout << "A function" << endl; }
};

class B : public A {
public:
B() { cout << "B 생성자" << endl; }

~B() { cout << "B 소멸자" << endl; }

void f() { cout << "B function" << endl; }
};

class AA {
public:
AA() { cout << "AA 생성자" << endl; }

virtual ~AA() { cout << "AA 소멸자" << endl; }

virtual void f() { cout << "AA function" << endl; }
};

class BB : public AA {
public:
BB() { cout << "BB 생성자" << endl; }

~BB() override { cout << "BB 소멸자" << endl; }

void f() override { cout << "BB function" << endl; }
};

void castingOperator() {
B *b = new B();
A *a = dynamic_cast<A *>(b);
a->f();
b->f();

A *prime_a = new B();
//B *prime_b = dynamic_cast<B*>(prime_a); //impossible;
B *prime_b = static_cast<B *>(prime_a);
prime_a->f();
prime_b->f();

AA *aa = new BB();
BB *bb = dynamic_cast<BB *>(aa); //가상 클래스 이기 때문에 가능하다;
aa->f();
bb->f();

delete a;
delete prime_a;
delete aa;
}
}
Author: Song Hayoung
Link: https://songhayoung.github.io/2020/08/03/Languages/Cplusplus/cast-operator/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.