2008.10.03 11:07 책 정리/Exceptional C++

다음에 나오는 코드들은 무엇이 다를까요?(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 타입이 아닌 경우

T의 생성자 중 변수 u로 직접 초기화 하는 것을 뜻하는데, 만약 u가 int 형이고, 다른 매개변수가 하나만 받는 다른 생성자가 없다면, 컴파일러는 기본 자료형 아무것이나 넣을 경우, 묵시적으로 형변환 되고, T::T(u) 를 호출하게 되는 문제가 발생될수 있다. (Effective C++ 2판, 3판 참조)

(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); 형으로 초기화 하도록 하자. 왜냐하면. 후자는 전자의 기능도 하고, 여러 매개변수를 사용 할수 있고, 명시적으로 보이기 때문이다. 역시 쉬운 코드가 제일 좋은 코드이다.

posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요