[C++] 생성자 타입변환과 explicit
[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 [개발이 하고 싶어요]
'기타 > C++' 카테고리의 다른 글
[C++]템플릿 (0) | 2021.03.30 |
---|---|
[C++] 클래스 템플릿 사용 Array 클래스 예제 (0) | 2019.07.30 |
[C++] 함수 템플릿 사용 template<typename T> (0) | 2019.07.30 |
[C++] 함수객체 기본 예제 (0) | 2019.07.30 |
[C++] 스마트 포인터, operator*(), operator->() 연산자 오버로딩 (0) | 2019.07.30 |
[C++] 연산자 오버로딩 정의 (operator) (0) | 2019.07.30 |
[C++] 파일 쓰기 예제 ofstream (0) | 2019.07.30 |
[C++] LinkedList 구현하기 예제 (0) | 2019.07.30 |