ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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;
    	}

     

Designed by Tistory.