C++
[C/C++ 강좌] 72강. 묵시적 형변환 (2)
코다람쥐
2022. 1. 18. 15:53
https://www.youtube.com/watch?v=G6mi7za8JbE&list=PLlJhQXcLQBJqywc5dweQ75GBRubzPxhAk&index=77
1. 형변환 연산자 오버로딩
// 묵시적(암시적) 형변환 implicit conversion
// 명시적 형변환 explicit conversion
#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;
Item i4 = (Item)4;
Item it(5);
it = (string)"stone";
Item i6(1, "grass");
Item i7 = { 2, "dirt" };
i7 = { 2, "dirt" };
}
저번시간의 코드에서 메인함수에 아래의 코드를 추가한다.
Item i8{ 3, "wood" };
int itemNum = i8;
하지만 이렇게 하면 i8에 구문오류가 뜬다.
i8을 int형으로 바꾸기 위해 우리는 명시적 형변환(int)를 추가할 수 있지만 이것도 역시 구문오류가 뜬다.
이것을 올바르게 바꾸기 위해 우리는 (int)라는 키워드도 연산자라는 사실을 주목해봐야 한다.
그래서 연산자 오버로딩을 통해 이 문제를 해결할 수 있다.
operator int() const { // int로의 형변환 연산자 오버로딩
return num;
}
위의 코드를 추가해주면 Item클래스에 추가해주면 클래스 내에 있는 num값을 반환하게 되어서 성공적으로 형변환이 이루어진다. const 키워드는 안전성을 위해서 넣어준다.
(string)i8같은 것도 가능하며 아래와 같이 응용도 가능하다.
operator string() {
return to_string(num) + " : " + name;
}
to_string함수는 매개변수를 문자열로 바꿔주는 함수이며 string헤더파일에 포함되어 있다.
2. 묵시적 형변환 막는방법
묵시적 형변환은 우리가 모르는 새에 많이 일어난다. 그리고 내가 정의한 형변환 연산자 오버로딩도 마찬가지로 의도치않게 묵시적 형변환이 일어날 수 있는데 이런것을 막기위한 키워드는 explicit이다.
explicit operator int() const { // int로의 형변환 연산자 오버로딩
return num;
}
explicit를 넣어주면 명시적 형변환만이 가능하며 묵시적 형변환은 불가능해진다.
마찬가지로 변환 생성자도 explicit 키워드를 통해 명시적 형변환만 가능하게 할 수 있다.
explicit Item(int num) : num(num) {
cout << "Item(int)" << endl;
}