-
[C/C++ 강좌] 72강. 묵시적 형변환 (2)C++ 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; }
'C++' 카테고리의 다른 글
[C/C++ 강좌] 75강. 상속과 접근 제어 (0) 2022.01.19 [C/C++ 강좌] 73강. 9부 종합문제 1 (동적 할당과 객체 복사) (0) 2022.01.18 [C/C++ 강좌] 71강. 묵시적 형변환 (1) (0) 2022.01.18 실습문제. 클래스를 이용하여 단어장 만들기. (0) 2022.01.17 객체지향 프로그래밍의 특징 (0) 2022.01.05