컴파일러가 사용할 수 있는 타입변환 함수는 2가지.
1. 단일
인자 생성자.
: 이런 생성자는 매개변수가 하나를 받도록 선언 되어 있든지, 매개변수가 여러 개인데 처음
것을 제외한 나머지가 모두 기본값을 갖도록 선언 되어 있는 것.
두가지 방법이 있음.
①
explicit 키워드를 사용.
② 두 번의 사용자 정의 변환.
// Test.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다. // #include "stdafx.h" template< class T > class Array { public: /// 클래스 내부에 클래스를 넣어서 Array에서만 사용한다는것을 강조. /// public에 선언 해서 다른 사람들도 사용할 수 있도록... class ArraySize { public: ArraySize(int numElements) : theSize(numElements) { } int size() const { return theSize; } private: int theSize; }; Array(int lowbound, int highBound) { } /// 단일 인자를 int 대신 ArraySize로 받음. Array(ArraySize _size) :m_ArraySize(_size) { } T& operator [] (int index) { } friend bool operator== (const Array< int >& lhs, const Array< int >& rhs); private: ArraySize m_ArraySize; }; bool operator== (const Array< int >& lhs, const Array< int >& rhs) { /// 비교후 리턴. return true; } int _tmain(int argc, _TCHAR* argv[]) { /// int 10을 ArraySize _size에 있는 단일 인자를 사용하여 /// 임시 _size에 넣고 임시 _size로 m_ArraySize를 초기화. Array< int > a(10); /// 이렇게 두번의 사용자 정의 변환을 하게 해서 /// 컴파일 에러가 나게 해서 오작동을 예방 할 수 있음. /// 모어 이펙티브 C++ 항목5. return 0; }
2. 암시적
타입변환 연산자
: 변환 함수 => 객체에서 하나의 수로 변환 할 때.
ex> operator double() const;
생성자를 사용하지 않음. 변환 함수를 이용.
변환 함수는 클래스의 메소드 여야 한다.
변환 함수는 리턴형을 가지면 안 된다.
변환 함수는 전달인자를 가지면 안 된다.
암시적 타입변환 연산자를 사용되면 프로그래머가 의도하지 않은 결과를 초래 할 수 있는데 이를 방지 하기 위해서 타입변환 함수를 직업
정의하고 호출하는 방법으로 하면 된다.
// test2.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다. // #include "stdafx.h" #include < iostream > using namespace std; class Rational { public: Rational(const int _iFint, const int _iSint) :m_iFint(_iFint), m_iSint(_iSint) { } // /// 변환 함수가 있을 경우. // /// 변환 함수. // operator double() const // { return static_cast< double >( static_cast< double >(m_iFint) / static_cast< double >(m_iSint) ); // } /// 변환 함수가 없을 경우. /// 변환 함수를 사용하지 않고 함수를 직접 만듬. double asDouble() const { return static_cast< double >( static_cast< double >(m_iFint) / static_cast< double >(m_iSint) ); } private: int m_iFint; int m_iSint; }; int _tmain(int argc, _TCHAR* argv[]) { Rational test(1, 2); /// 변환 함수가 있을 경우. /// operator <<를 작성 하지 않았는데 /// 암시적 타입변환으로 에러를 발생하지 않는다. /// 즉, 프로그래머가 의도하지 않은 결과를 만들 수 있음. // cout << "operator double() const : " << test << endl; /// 변환 함수를 없을 경우, /// 에러 발생. operator double() const가 있을 경우 됨. cout << "operator double() const : " << test << endl; /// 함수를 직접 호출로 의도 하지 않았던 잘못된 호출을 막을 수 있음. cout << "double asDouble() const : " << test.asDouble() << endl; return 0; }
'[ Programming ]' 카테고리의 다른 글
지연 평가(lazy evaluation) (0) | 2010.09.02 |
---|---|
멤버 함수 보다는 비멤버 비프렌드 함수에 더 가깝게 쓰자. (0) | 2009.10.18 |
컴파일러의 분석. (4) | 2009.07.31 |
상속 받는 기본 매개변수 값 변경 금지! (0) | 2009.07.29 |
인터페이스 상속과 구현 상속의 차이를 제대로 파악하고 구별하기. (0) | 2009.07.15 |