explicit

Programming/C++ 2012. 5. 23. 00:51 |

변환에 의한 초기화를 막는 키워드 "explicit"



Simple sim2 = sim1;    =>    Simple sim2(sim1);

묵시적 변환이 일어나서 복사 생성자가 호출된다.


이는 결국, 복사 생성자가 묵시적으로 호출된 것으로 볼 수 있다. 따라서 위와 같은 유형의 변환이 마음에 들지 않느다면, 복사 생성자의 묵시적 호출을 허용하지 않으면 된다. 그리고 이러한 목적으로 사용되는 키워드가 explicit 이다.




13행:

explicit Simple(const Simple &copy)

: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
Posted by scii
: