항목 5 : 사용자 정의 타입변환 함수에 대한 주의를 놓지 말자.

개념정리
매개변수(parameter)는 함수를 선언할 때 괄호 안에 명시하는 데이터
인자(argument)는 함수를 호출할 때 넘기는 데이터
사용자 정의 타입변환 함수는 operator char () 같은 함수를 말한다.(쉽게 생각해 형변환 연산자 오버로딩이다)

이유
1. 프로그래머의 의도와 달리 함수가 잘못 호출될 수 있다. 예)std::cout << 객체;
예)객체에 operator<< 가 없어도 컴파일러는 적절한 형변환을 하므로 형병환 연산자만 되어 있으면 출력되는 경우
2. 타입 변환은 생성자를 통해서도 일어 날 수 있기 때문이다.
(Effective C++ 2판 19항목에 자세히 적어 두었다)

해결 방법
1. 이유 1인 경우, 형변환 연산자를 쓰지 않고(operator) 다른 이름의 함수로 정의하여 사용 한다.
(위원회에서도 이렇게 사용 된다고 말한다. String 객체의 경우. string.c_str 로 형 변환 하듯이)

2. 이유 2인 경우, explicit  키워드를 사용하여, 묵시적 타입변환을 일어나지 못하게 막는다.
(const 매개변수와 매겨변수 는 .. 분명 차이를 보이는것을 반드시 기억해 두고 있어야 한다)

코드 : operator << 정의를 하지 않아도 객체가 출력되는 경우

more..



개인적인 생각
1. 업계 최고의 전문가는 누가 모래도 위원회 사람들 일것이다.
2. 이런 경우는 대개 매개변수가 1개일 경우 발생할 위험이 있다.
2. 디폴트 매개변수로 생성자를 정의 했을 경우 발생할 위험이 있다.



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

댓글을 달아 주세요