유형 변환 (C ++)

1. 소개

유형 변환의 의미는 변수의 유형을 다른 유형으로 변경하여 변수가 표시되는 방식을 변경하는 것입니다.

둘째, C ++ 필수 유형 변환

C 스타일 강제는 안전하지 않습니다.

C ++ 강제 유형 변환 :

  • 4 개의 키워드 static_cast, const_cast, reinterpret_cast 및 dynamic_cast가 C ++ 언어에 추가되었습니다. 이 네 가지 키워드는 강제 유형 변환에 사용됩니다.
  • 새로운 유형의 강제 변환은 강제 변환 프로세스를 더 잘 제어 할 수 있으므로 다양한 유형의 강제 변환을 제어 할 수 있습니다.
  • C ++의 스타일은 static_cast (content)입니다. C ++ 스타일 캐스트의 또 다른 이점은 수행중인 작업을 명확하게 나타낼 수 있다는 것입니다. 프로그래머가 그러한 코드를 훑어 보는 한 그는 강제의 목적을 즉시 알 수 있습니다.

세, 구체적인 소개

1. static_cast : 데이터 유형의 강제 변환에 사용되는 일반 변환으로 한 데이터 유형을 다른 데이터 유형으로 강제 변환합니다.

	int a = 98;
	char c = static_cast<char>(a);
	cout << c << endl;// b

기본 데이터 형식 포인터, 개체 포인터를 변환 할 수 없습니다.

	//基础数据类型指针
	int* p = NULL;
	char* sp = static_cast<char*>(p);//无效

	//对象指针
	Building* building = NULL;
	Animal* ani = static_cast<Animal*>(building);//无效



상속을 사용하여 포인터 또는 참조를 변환 할 수 있습니다.

	//父类指针转成子类指针
	Animal* ani = NULL;
	Cat* cat = static_cast<Cat*>(ani);
	//子类指针转成父类指针
	Cat* soncat = NULL;
	Animal* anifather = static_cast<Animal*>(soncat);

	//还有具有继承关系的指针或者引用
	Animal aniobj;
	Animal& aniref = aniobj;
	Cat& cat = static_cast<Cat&>(aniref);

	Cat catobj;
	Cat& catref = catobj;
	Animal& anifather2 = static_cast<Animal&>(catref);	

2. dynamic_cast <type_id> (표현식), 포인터 또는 참조를 상속 관계로 변환 할 때 변환 전에 개체 유형을 확인
하고 하위 유형에서 기본 유형으로 의 변환 이 실패 할 수 있습니다.

  1. 나머지 세 개는 컴파일 시간에 완료되고 dynamic_cast는 런타임에 처리되며 유형 검사는 런타임에 수행됩니다.

  2. 기본 제공 기본 데이터 유형의 강제 변환에는 사용할 수 없습니다 .

    int a = 10;
    char c = dynamic_cast<char>(a);//无效
    
  3. dynamic_cast 변환은 성공하면 클래스에 대한 포인터 또는 참조를 리턴하고 변환이 실패하면 NULL을 리턴합니다.

  4. 변환에 dynamic_cast를 사용하는 경우 기본 클래스에 가상 함수가 있어야합니다. 그렇지 않으면 컴파일이 통과되지 않습니다.

    B中需要检测有虚函数的原因:类中存在虚函数,就说明它有想要让基类指针或引用指向派生类对象的情况,此时转换才有意义。这是由于运行时类型检查需要运行时类型信息,而这个信息存储在类的虚函数表中,只有定义了虚函数的类才有虚函数表。

  5. 클래스 변환에서 dynamic_cast와 static_cast의 효과는 클래스 레벨 간의 업스트림 변환을 수행 할 때 동일합니다. 다운 스트림 변환을 수행 할 때 dynamic_cast에는 static_cast보다 안전한 유형 검사 기능이 있습니다.

    상향 변환, 즉 하위 클래스 포인터가 상위 포인터를 가리키고 (일반적으로 문제 없음) 메모리가 크고 작습니다. 하향 변환, 즉 상위 포인터가 안전하지 않은 하위 클래스 포인터로 변환됩니다. 다운 변환의 성공 여부는 변환 할 유형과도 관련이 있습니다. 즉, 변환 할 포인터가 가리키는 개체의 실제 유형은 변환 후 개체 유형과 동일해야합니다. 그렇지 않으면 변환이 실패합니다. .

    C ++에서 컴파일 타임에 형식 변환은 특히 클래스 개체의 포인터 또는 참조 작업과 관련된 경우 런타임에 오류를 일으킬 수 있습니다. Dynamic_cast 연산자는 런타임에 문제를 일으킬 수있는 유형 변환을 테스트 할 수 있습니다.

	//非继承关系的指针
	Animal* ani = NULL;
	Building* building = dynamic_cast<Building*>(ani);//报错
	//具有继承关系指针
	Animal* ani = NULL;
	Cat* cat = dynamic_cast<Cat*>(ani);//报错  原因在于 dynamic做类型安全检查

	Cat* cat = NULL;
	Animal* ani = dynamic_cast<Animal*>(cat);

** 3, const_cast : ** const 한정자는 일반적으로 변수를 제한하는 데 사용되며 변수의 값을 수정할 수 없음을 나타내는 데 사용되며 const_cast는 수정할 수없는이 상수 기능을 강제로 제거하는 데 사용되지만 const_cast는 변수의 불변성을 제거하는 데 사용되는 것이 아니라 상수 개체에 대한 포인터 또는 참조의 불변성을 제거하는 데 사용됩니다. 불변성을 제거하는 개체는 포인터 또는 참조 여야합니다.

  1. 상수 포인터는 비 상수 포인터가되어야하며 여전히 원래 객체를 가리 킵니다.
  2. 상수 참조는 상수가 아닌 참조가되며 여전히 원래 객체를 가리 킵니다.
  3. 상수 객체는 상수가 아닌 객체로 강제됩니다.
	//基础数据类型
	int a = 10;
	const int& b = a;	//b = 10;
	int& c = const_cast<int&>(b);
	c = 20;
	cout << "a:" << a << endl;//20
	cout << "b:" << b << endl;//20
	cout << "c:" << c << endl;//20

	const int a = 10;
	const int& pp = a;
	int& cc = const_cast<int&>(pp);
	cc = 100;
	

	//指针   增加或者去除变量的const性
	const int* p = NULL;
	int* p2 = const_cast<int*>(p);

	int* p3 = NULL;
	const int* p4 = const_cast<const int*>(p3);

4 、 reinterpret_cast 용법 : reinterpret_cast <type_id> (표현식)

강제 변환을위한 reinterpret_cast의 세 가지 주요 목적이 있습니다.

  1. 포인터 또는 참조 유형 변경,
  2. 포인터 또는 참조를 충분한 길이의 정수로 변환하십시오.
  3. 정수 유형을 포인터 또는 참조 유형으로 변환합니다.

type-id는 포인터, 참조, 산술 유형, 함수 포인터 또는 멤버 포인터 여야합니다.

포인터를 정수로 변환 할 수 있으며 정수를 포인터로 변환 할 수도 있습니다 (먼저 포인터를 정수로 변환하고 정수를 원래 유형의 포인터로 변환 한 후 원래 포인터 값을 얻을 수도 있습니다).

reinterpret_cast를 사용할 때 강제 변환 프로세스는 비트의 복사본 일 뿐이므로 사용 중에 특히주의해야합니다!

	//1. 无关的指针类型都可以进行转换
	Building* building = NULL;
	Animal* ani = reinterpret_cast<Animal*>(building);

	//2. 函数指针转换
	FUNC1 func1;
	FUNC2 func2 = reinterpret_cast<FUNC2>(func1);

4. 결론

  • 변환 할 변수, 변환 전의 유형, 변환 후의 유형, 변환 후 결과는 무엇인지 명확하게 알아야합니다.
  • 일반적으로 유형 변환을 피하기 위해 유형 변환을 사용하지 않는 것이 좋습니다.

추천

출처blog.csdn.net/weixin_45341339/article/details/111993677