{

즉, 암시적 타입 변환을 피하기 위해 오버로딩을 쓰라는 것이다, 그 이유는 C++은 동일한 이름의 함수라면 매개변수로 함수들을 구분짖는데, 이런 함수들 중에서 전달된 인자와 타입이 가장 "비슷한" 함수가 있다면, 암시적으로 형이 변하기전에 그 함수가 호출 되고, 없다면 모호성 에러를 벹어내게 해주기 때문이다.

즉, 이런 C++의 특징을 이용하여, 암시적 타입 변환을 피하라는 것이다.

다음 코드는 함수 f() 들 중에 float 매개변수를 받는 함수가 없을 때, 모호성 에러를 벹어내며서 컴파일 되지 않는 것을 보여 준다.

모호성 에러 예)


사실 정수형의 경우 상호 암시적인 형변환이 가능하며, 실수형 역시 마찬가지고, 기분 좋게도 참조형의 경우 암시적인 형변환은 절대 발생하지 않는다. 예외적으로 오버로딩된 함수 호출 에선, 함수의 매개변수가 객체이고, 객체의 생성자가 함수에 들어온 인자를 받아주지 않는 이상, 형 변환은 이러나지 않는다. 그래서 위의 코드에선 모호성 에러를 벹어 내는 것이다.

아참, 암시적 형변환이 일어날 때를 정리 안했다. 암시적 형변환을 볼수 있는 대표적인 예로 std::string 클래스를 볼 수 있다. std::string의 생성자 중 char* 를 받는 녀석이 있있기 때문인데,  만약 std::string 을 매개변수로 받는 함수가 있을 경우, char*를 그 함수에 전달하면 std::string 의 생성자(char*)가 호출 되면서 임시 객체 std::string 이 만들어 지고, std::string 을 매개변수로 하는 함수가 호출 되어 진다.

암시적 형 변환의 예 )

자 정리 끝

}


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

항목 34 : 상속성을 주의해서 사용하라. ( Prefer composition to inheritance. )  (0) 2009.02.28
항목 33 : 최소화된 클래스를 사용 하라. ( Prefer minimal classes to monolithic classes. )  (0) 2009.02.27
항목 32 : 만들고 있는 클래스가 무엇인지 확실히 하라. ( Be clear what kind of class you’re writing. )  (0) 2009.02.26
항목 31 : 함수의 인자의 처리 순서에 좌우되는 코드는 좋지 않다. ( Don’t write code that depends on the order of evaluation of function arguments. )  (0) 2009.02.26
항목 30 : &&, || 그리고 콤마의 오버로딩은 피하라. ( Avoid overloading &&, ||, or , (comma) )  (0) 2009.02.26
항목 29 : 간접적인 타입 변환을 피하기 위해 오버로딩을 활용하라. ( Consider overloading to avoid implicit type conversions. )  (0) 2009.02.25
항목 28 : ++와 --의 표준적인 형식과 접두 형식을 사용하라. ( Prefer the canonical form of ++ and --. Prefer calling the prefix forms. )  (0) 2009.02.25
항목 27 : 표준적인 형식의 산술 및 할당 연산자를 사용하라. ( Prefer the canonical forms of arithmetic and assignment operators. )  (0) 2009.02.25
항목 26 : 오버로딩된 연산자의 본래 의미를 유지하라. ( Preserve natural semantics for overloaded operators. )  (0) 2009.02.24
항목 25 : 값, (스마트) 포인터, 참조 중 적절한 방식으로 인자를 얻어라.(Take parameters appropriately by value, (smart) pointer, or reference. )  (0) 2009.02.24
항목 24 : 내부 #include 가드를 사용하라. 외부 #include 가드를 써서는 안 된다. ( Always write internal #include guards. Never write external #include guards. )  (0) 2009.02.24
posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요