다음에 나오는 코드들은 무엇이 다를까요?(T는 어떤 클래스 형식을 의미합니다)?
T t;
T t();
T t(u);
T t = u;
5분안에 답하지 못한다면, 모르는 것이므로... 정리를 시작할까 한다.
해당 코드는 T 클래스의
1. 기본 생성자로 인한 초기화(기본 초기화)
2. 인자가 있는 생성자로 인한 초기화(직접 초기화)
3. 복사 생성자로 인한 초기화(복사 초기화)
의 차이를 말하고 있다.
1. T t;
해당 코드는, 기본 생성자로 인한 초기화를 뜻하며, 그 어떠한 생성자가 없거나, T::T() 가 있다면, T::T() 로 초기화를 하는 코드이다.
2. T t();
나도 이 코드는 T::T() 의 호출이다. 라고 단정 지었다.(이렇게 사용한적이 없어서..) 하지만 이 코드는 .. T 타입을 반환하고, 매개변수가 void 인 t 함수를 선언한것이다. 헷갈리지 않는가? ... 헷갈린다..
3. T t(u);
이 코드의 경우, 두가지로 나누어서 생각을 해야 한다.
(1) u가 T 타입이 아닌 경우
(2) u가 T 타입인 경우
T 클래스의 복사 생성자가 호출되며, 정의되지 않았다면, 컴파일러는 얕은 복사를, 정의되었다면, 정의된 되로 복사 생성자를 호출하게 된다.
4. T t = u;
이 코드 역시 두가지로 나누어서 생각이 된다.
(1) 우선 u가 T 타입인 경우
T 의 복사 생성자를 호출하여 u로써 초기화가 이루어 진다. 절대 operator= 이 아니올시다!
(2) u가 T 타입이 아닌 경우
이 경우 많은 행동을 하게 된다. 우선 u가 T 타입으로 전환된다.(물론 이떄 T 가 u타입을 받는 생성자가 있어야 하거나 묵시적 형변환 될수 있어야 한다). 그리고 T의 복사 생성자가 호출되어 초기화가 이루어진다.
즉. T::T( T(u) ); 이 형태인데, ... 묵시적 형변환 이야기가 나오면 알다시피, 컴파일러가 임의적으로 행해지기 때문에, 여러 컴파일러마다 .. 다른 행동을 하게 된다. 이 경우, 문제점을 찾는데 시간이 많이 걸리므로.. 이런 코딩은 피해야 한다.
가이드라인
가능하다면 T t = u; 로 .. 초기화하지 말고 T t(u); 형으로 초기화 하도록 하자. 왜냐하면. 후자는 전자의 기능도 하고, 여러 매개변수를 사용 할수 있고, 명시적으로 보이기 때문이다. 역시 쉬운 코드가 제일 좋은 코드이다.
'책 정리 > Exceptional C++' 카테고리의 다른 글
항목 4 : 최대 재사용 가능한 일반 컨테이너 - 파트 1 (난이도 8) (0) | 2008.10.06 |
---|---|
항목 47 : 흐름 제어 (난이도 : 6) (0) | 2008.10.04 |
항목 46 : 포워딩 함수 (난이도 : 3) (0) | 2008.10.04 |
항목 45 : BOOL (난이도 7) (0) | 2008.10.04 |
항목 44 : 캐스트 (난이도 : 6) (2) | 2008.10.04 |
항목 43 : const - 정확성 (난이도 : 6) (0) | 2008.10.03 |
항목 3 : 대·소문자 구분 없는 문자열 - 파트 2 (난이도 5) (0) | 2008.09.10 |
항목 2 : 대·소문자 구분 없는 문자열 - 파트 1 (난이도 7) (0) | 2008.09.09 |
항목 1 : 반복자( iterator ) 난이도 7 (0) | 2008.09.09 |
Exceptional C++ : C++ 프로그래머를 자극하는 47개의 재미있는 퍼즐 문제 (0) | 2008.09.08 |
최근댓글