{

무엇을 간접 변환이라고 하는가?

하나의 타입이 개발자가 눈치 못채게 다른 타입으로 변환 되는 것을 뜻하거나, 타입 변환이 정의하지 않아도 되는 것, 또는 변환 연산자 정의로 인하여, 변환되는 것을 뜻한다.(operator char*() 같은 것)


이것을 왜 피해야 하는가?

이것은 생성자의 호출이 예측하기 어렵게 만들고, 함수의 호출 역시 예측하기 어렵게 만들기 때문이다.

음~ 예를 들어 달라.

Display(5) 에서 무엇이 호출 될까? MSVC2005, 2008 에선 void Display( double ) 호출 되어 졌다.

만약 void Display( double ) 가 없다면 무엇이 호출 될까?
Widget( unsigned int ) 호출되어 Widget 이 생성 되고
void Display( const Widget& ) 이 호출 되어 진다.

참 아리송한 호출 형태인데, 이 것을 막기 위해선 Widget의 생성자에 explicit 키워드를 넣어 줌으로써 막아 줄 수 있다 주의, MSVC 2005 2008 에선 explicit 키워드가 잘 먹히지만, 다른 컴파일러는 모르겠다.

변환 연산자도 정리해야 되나, 알고 있는 사항이므로, 그냥 패스. ;;


요약.

1. 변환 연산자를 정의하지 말고, 명시적 변환을 사용 할 것, as_char 같은 것들
2. 단일 매개변수를 갖는 생성자의 경우 explicit 키워들 사용 할 것


부수적인 이야기

MSVC 라면, /WX, /RTCc 등의 컴파일 옵션을 통해서 상당히 높은 수준의 방어를 할 수 있다. 이 이야기는 최초 KGC2008 에서 강연을 통해서 알게 되었고, 파리체 책에서 자세히 볼수 있었으며, MSDN 에 자세히 설명 되어 있음을 여기에 기록한다.

'책 정리 > C++ Coding Standards : C++ 코딩의 정석' 카테고리의 다른 글

항목 45 : new와 delete는 항상 같이 제공하라. ( Always provide new and delete together. )  (0) 2009.04.01
항목 44 : 비멤버 함수를 활용하라. ( Prefer writing nonmember nonfriend functions. )  (0) 2009.03.31
항목 43 : Pimpl을 적당히 활용하라. ( Pimpl judiciously. )  (0) 2009.03.31
항목 42 : 내부의 것은 너무 노출시키지 말라. ( Don’t give away your internals. )  (0) 2009.03.31
항목 41 : 특징 없는 값의 집합을 제외하고는 모든 데이터 멤버를 사영으로 하라. Make data members private, except in behaviorless aggregates (C-style structs).  (0) 2009.03.31
항목 39 : 가상 함수는 비공용으로, 공용 함수는 비가상으로 설정하라. ( Consider making virtual functions nonpublic, and public functions nonvirtual. )  (0) 2009.03.30
항목 38 : 안전한 오버라이딩을 연습하라. ( Practice safe overriding. )  (0) 2009.03.02
항목 37 : 상속의 정확한 의미를 이해하자. 재사용을 위해 상속하는 것은 아니지만, 재사용은 필요하다. ( Public inheritance is substitutability. Inherit, not to reuse, but to be reused. )  (0) 2009.03.02
항목 36 : 추상 인터페이스를 활용하라. ( Prefer providing abstract interfaces. )  (0) 2009.03.02
항목 35 : 기반 클래스로 디자인되지 않은 클래스로부터의 상속을 피하라. ( Avoid inheriting from classes that were not designed to be base classes. )  (0) 2009.03.01
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기