형변환은 묵시적(암시적)형변환과 명시적 형변환으로 이루어져있다.
묵시적 형변환
예시를 통해 묵시적 형변환을 이해하기 위해 아이템을 저장하는 클래스를 만들어보자.
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
|
#include<iostream>
#include <string>
using namespace std;
class Item {
public:
Item(int num):num(num) {
cout << "Item(int)" << endl;
}
Item(string name) :name(name) {
cout << "Item(string)" << endl;
}
Item(int num, string name):num(num),name(name) {
cout << "Item(int,string)" << endl;
}
private:
int num;
string name;
};
int main() {
Item i1 = Item(1);
Item i2(2);
Item i3 = 3;
i3 = 3;
}
|
cs |
i4 객체도 만들어준다. 얘는 i1이랑 변수의 위치가 다른데, 얘가 형변환이다.
출력값을보면
여기서 의문점이 생긴다. 내가 객체를 생성한건 4개밖에 없는데 어째서 출력값이 5개이며, i4는 정수가 어떻게 Item으로 형변환 되었을까?
우선 정수가 어떻게 Item으로 형변환 되었는지 알아보자.
첫번째 생성자를 주석처리 해줬더니 i4에도 빨간줄이 뜬다.
그리고 에러메세지가 "int"에서 "Item"으로 변환해주기 위한 적절한 생성자가 없다고 뜨는데
이는 정수형인 4가 Item으로 바뀌기 위해 Item(int num) 이라는 생성자를 사용한것으로 생각해줄 수 있다.
그래서 이 첫번째 생성자를 변환생성자로 생각해줄 수 있다.
변환생성자는 다른 타입을 자기 자신의 타입으로 바꿔주는 생성자라 생각해면 된다.
그 다음은 출력값이 5개인것에 대한 의문을 해결해 볼 것이다.
i3=3;에서 등호에 마우스 커서를 가져다 대면
이동대입연산자가 실행된 것을 볼 수 있다. item이 r-value가 되어있는데 int가 어떻게 i3로 이동했는지
신기방기하다.
이제 컴파일러의 입장에서 어떻게 진행된건지 살펴보겠다.
우선 대입연산자가 3이 i3로 변환될 수 있을까 생각한다. 근데 위에 보니까 변환 생성자가 있다!
그래서 변환생성자를 통해 임시객체가 생긴다.
임시객체의 num에는 3이 들어가면서 Item(int)가 호출된다.
임시객체는 사라질거지만 "=" 등호연산 덕분에 i3로 얕은복사된다.
그래서 i3=3; <--이걸 묵시적 형변환이라 하고
Item i4=(Item)4 <--이건 명시적 변환이라 한다. 얘는 Item i4=Item(4)와 같다.
형변환 연산자 오버로딩
이번에는 Item을 int형으로 바꿔볼것이다.
이게 가능하게 만들어볼 것인데, C++에서는 형변환도 연산자이다. 그래서 연산자 오버로딩을 통해 형변환을 해볼 것이다.
형변환 연산자 오버로딩할 때는 반환값이 뒤로가서 operator 반환값(){} 의 형태를 띈다.
int로 형변환해줬으니 num을 반환하면 되고,
main함수로 돌아와서
itemNum1은 명시적 현변환이고 itemNum2는 묵시적 형변환이 일어난 것을 볼 수 있다. 이처럼 형변환 연산자 오버로딩에서도 명시적,묵시적 형변환이 모두 일어날 수 있다.
explicit
묵시적 형변환이 위험한 경우 묵시적 형변환을 막기 위해 explicit 키워드를 사용할 수 있다.
explicit을 써주니 묵시적 형변환을 할 때 에러가 뜬다.
'C++ > 기초(두들낙서)' 카테고리의 다른 글
[C++기초] 정적 바인딩/가상함수와 동적바인딩 (0) | 2022.01.17 |
---|---|
[C++기초] 상속과 접근제어 ,오버라이딩 (0) | 2022.01.17 |
[C++기초] 깊은 복사, 얕은 복사 - 이동시맨틱,이동생성자,이동 대입연산자 (0) | 2022.01.16 |
[C++기초] 깊은복사, 얕은 복사 - 대입연산자 (0) | 2022.01.16 |
[C++기초] 깊은복사와 얕은 복사 ,복사생성자 (0) | 2022.01.15 |
댓글