표준 데이터형의 어떤 값을 다른 표준 데이터형의 한 변수에 대입하는 명령문을 작성하면, C++는 그 값의 데이터형을, 대입받는 입장에 있는 변수와 동일한 데이터형으로 자동으로 변환하여, 두 데이터 형이 서로 호환이 되게 만든다. 단, C++는 호환되지 않는 데이터형은 자동으로 변환하지 않는다. 예를 들면, int *p = 10; // 데이터형이 불일치라서 컴파일 에러를 나타낸다. 강제 데이터형 변환을 하면 컴파일 에러를 넘길수 있다. int *p = (int*)10; 이렇게 자동변환을 할것인지 강제 변환을 할것인지를 사용자가 정할 수 있다.
// test.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다. // #include "stdafx.h" class CTest { public: CTest() : m_i(0) { } /// C++에서, 하나의 전달이자를 취하는 생성자는 /// 그 전달인자 데이터형의 값을 클래스형으로 변환하는 설계도처럼 동작. /// 다음의 생성자는 int형 값을 CTest형 값으로 변환하는 명령문 역활. /// 주의 : 하나의 전달인자만 사용할 수 있는 생성자만이 이와 같은 변환 함수로 동작. /// explicit는 아래 설명. /*explicit*/ CTest(int i) : m_i(i) /// int을 CTest 객체로 변환하는 템플릿. { } ~CTest() { } void Print() const { std::cout << "m_i의 값 : " << m_i << std::endl; } private: int m_i; }; int _tmain(int argc, _TCHAR* argv[]) { /// CTest(int i)을 사용하여 10을 CTest로 변환. /// CTest(int i) 생성자를 사용하여, CTest 임시 객체를 생성한다. /// 이때 10으로 초기화 한다. 그리고 나서 멤버별 대입으로 임시 객체의 내용을 /// Test에 복사한다. 이런 자동으로 이루어지는 형변환을 암시적 데이터형 변환이라 한다. /// explicit 주석시 암시적 형 변환. /// explicit 주석 없을시 컴파일 에러. /// error C2440: '초기화 중' : 'int'에서 'CTest'(으)로 변환할 수 없습니다. CTest Test = 10; Test.Print(); /// explicit 주석 없을시 명시적 형 변환. Test = CTest(11); Test.Print(); Test = (CTest)12; Test.Print(); return 0; } /// 이런 자동적인 데이터 형 변환으로 인해 편할수도 있지만, 오히려 독이 될수도 있다. /// 그래서 최신 C++ 시스템에는 자동 데이터형 변환을 못하게 하는 explicit라는 새로운 키워드가 /// 추가 되었다.
'[ Programming ]' 카테고리의 다른 글
값에 의한 전달 보다는 상수객체 참조자에 의한 전달 방식을 택하는 편이 대개 낫다. (2) | 2009.05.02 |
---|---|
opengl로 만든 배경 그림 (0) | 2009.05.01 |
팀 스위니 강연 (0) | 2009.04.22 |
VAssistX.RefactorCreateImplementation (0) | 2009.04.21 |
Tab키 Space바 처럼 사용하기 (0) | 2009.04.19 |