[C++] 생성자 타입변환과 explicit

2019. 7. 30. 00:07 기타/C++

[C++] 생성자 타입변환과 explicit


C++ 에서 클래스의 객체를 생성할 때 생성자를 사용해서 형변환을 할 수 있다.


아래와 같은 예제에서 class B 는 4개의 생성자를 가지고 있다.


class A{


};

class B{
public:
    B() { }
    B(A& _a){}
    B(int n){}
    B(double d){}
};


B 클래스를 생성할 때, 아래와 같이 하면


B b;    // B() 생성자 호출

b = a;   // b = B(a)  암시적 생성자 호출 후 대입

b = n;   // b = B(n)  암시적 생성자 호출 후 대입

b = d;  // b = B(d) 암시적 생성자 호출 후 대입


위와 같이 대입을 할때, 해당 타입을 인자로 가지는 생성자가 있다면,

형변환이 이루어지며 대입이 된다.


하지만 이러한 대입 방법은 의도하지 않은 형변환에 의한 실수로 버그를 만들 수 있다.

따라서, 생성자를 호출 할 때는


b = B(a) 와 같은 명시적인 방법으로 생성하는게 좋다.


위의 암시적인 형변환을 막기 위해서 생성자에 explicit  키워드를 지정한다.

그러면 명시적인 생성자만 호출할 수 있다.


#include <iostream>
using namespace std;

class Point{
    int x;
    int y;

public:
    explicit Point(int _x = 0, int _y = 0)
        :x(_x), y(_y){
    }

    void Print() const{
        cout << x << ',' << y << endl;
    }
};


int main(){

    Point pt;
    pt.Print();

    // pt = 10;  // 에러
    pt = Point(10);
    pt.Print();

    return 0;
}


결과


0,0

10,0



출처: https://hyeonstorage.tistory.com/313?category=601868 [개발이 하고 싶어요]