[C++] Conversion Function | 변환 함수
Conversion Function
변환 함수
- C++ 연산자 함수의 특별한 형태이다.
- 사용자 정의 강제 데이터형 변환 기능을 구현하는 수단이다.
- \(\texttt{dataType variables = objectName;}\)과 같은 구문을 가능하게 만든다.
Conversion Function Definition (변환 함수 정의)
// Ex. 변환 함수 원형의 일반형
operator typeName();
- \(\texttt{typeName}\)형으로의 형변환을 구현하기 위해서는, 위와 같은 연산자 함수가 구현되어야 한다.
- 변환 함수는 해당 클래스의 멤버 함수이어야 한다.
- 변환 함수는 리턴형을 가지지 않는다. (함수명 \(\texttt{typeName}\)으로 어떤 데이터형으로 변환(리턴)할 것인지를 알 수 있기 때문이다.)
- 변환 함수는 매개변수를 가지지 않는다. (변환 함수는 반드시 클래스의 멤버 함수로 구현되는데, 변환 함수를 호출한 클래스 객체가 곧 변환해야할 값이므로, 따로 매개변수를 필요로 하지 않는다.)
// Ex. 변환 함수 정의 예시
Stonewt::operator int () const { // Stonewt는 사용자 정의 클래스이다.
return int (pounds + 0.5); // pounds는 Stonewt 클래스의 데이터 멤버이다.
}
- 함수 원형 맨 앞에 \(\texttt{explicit}\) 키워드를 추가할 경우, 암시적 데이터형 변환을 제한할 수 있다. (C++11)
// Ex. 암시적 데이터형 변환을 불허하는 변환 함수 원형의 일반형
explicit operator dataType() const;
// const 키워드는 선택사항이나, 변환 함수 내에서 멤버를 수정할 것이 아니라면, const 키워드를 추가하는 것이 권장된다.
- 변환 함수가 위와 같이 정의되어 있을 경우, 명시적인 데이터형 변환만 가능해진다.
- 어차피 암시적 데이터형 변환을 불허할 것이라면, 아예 변환 함수(연산자 함수)가 아닌 일반 함수(보통의 멤버 함수와 같은)로 정의하는 것도 좋은 방법이다. (보다 엄격한 개발방식)
-
Using the Conversion Function (변환 함수 사용)
- 변환 함수는 일반적인 Type Cast(강제 데이터형 변환)와 같은 문법을 공유한다.
// Ex. 변환 함수의 명시적/암시적 사용 예시
// 명시적 호출 방법
dataType variables = dataType(objectName);
dataType variables = (dataType)objectName;
// 암시적 호출 방법
dataType variables = objectName;
- 두 개 이상의 변환 함수가 정의되어 있을 경우, 변환 함수 호출시에 Ambiguity(모호성) 에러가 발생하지 않도록 주의해야 한다.
// Ex. 두 개 이상의 변환 함수로 인해 Ambiguity Error가 발생하는 예시
class Stonewt {
...
Stonewt(int, double);
operator int() const;
operator double() const;
};
...
Stonewt poppins(9, 2.8);
std::cout << poppins; // 모호성 에러가 발생한다.
// poppins대신, int(poppins)나 double(poppins)와 같이 하나의 데이터형을 명시해야 하는 경우이다.
// 이는, 변환 함수가 두가지 데이터형으로 정의되어 있기 때문이다.
// 만일, int형 변환 함수만 정의되어 있었다면, 컴파일러는 고민할 거리도 없이 암시적인 int형 변환을 수행했을 것이다.
- 따라서, 변환 함수가 두 개 이상 정의되어 있는 경우, 암시적 데이터형 변환은 지양하는 것이 좋다.