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

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기