'데이터형 변환'에 해당되는 글 1건

  1. 2009.04.30 explicit
[ Programming ]2009. 4. 30. 01:07
표준 데이터형의 어떤 값을 다른 표준 데이터형의 한 변수에 대입하는 명령문을 작성하면, 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라는 새로운 키워드가
/// 추가 되었다.
Posted by 냉동