explicit
Programming/C++ 2012. 5. 23. 00:51 |변환에 의한 초기화를 막는 키워드 "explicit"
Simple sim2 = sim1; => Simple sim2(sim1);
묵시적 변환이 일어나서 복사 생성자가 호출된다.
이는 결국, 복사 생성자가 묵시적으로 호출된 것으로 볼 수 있다. 따라서 위와 같은 유형의 변환이 마음에 들지 않느다면, 복사 생성자의 묵시적 호출을 허용하지 않으면 된다. 그리고 이러한 목적으로 사용되는 키워드가 explicit 이다.
13행:
explicit Simple(const Simple ©)
:num(copy.num)
{ }
더 이상 묵시적 변환이 발생하지 않아서 대입 연산자를 이용한 객체의 생성 및 초기화는 불가능하다.
※ 묵시적 변환이 좋은 것만은 아니다.
자료형이든, 문장이든 자동으로 변환되는 것이 늘 좋은 것만은 아니다. 묵시적 변환이 많이 발생하는 코드일수록 코드의 결과를 예측하기가 어려워지기 때문이다. 따라서 키워드 explicit 는 코드의 명확함을 더하기 위해서 자주 사용되는 키워드 중 하나이다.
그리고 이러한 문장의 묵시적 변환은 복사 생성자에서만 일어나는 게 아니다. 전달인자가 하나인 생성자가 있다면, 이 역시 묵시적 변환이 발생한다.
ex)
class ABC
{
int num;
public:
ABC(int n) : num(n) { }
...
};
다음의 문장을 통해서 객체생성이 가능하다.
ABC obj = 3; // ABC obj(3); 으로 변환.
이 경우에도 마찬가지로 키워드 explicit 가 생성자에 선언되면, 묵시적인 변환을 허용하지 않기 때문에 다음의 형태로 객체를 생성할 수밖에 없다.
ABC obj(3);
'Programming > C++' 카테고리의 다른 글
복사 생성자의 호출시점 (0) | 2012.05.25 |
---|---|
깊은 복사 & 얕은 복사 (0) | 2012.05.24 |
복사 생성자(Copy Constructor) (0) | 2012.05.22 |
this 포인터 (0) | 2012.05.21 |
객체 배열 & 객체 포인터 배열 (0) | 2012.05.21 |