1. reinterpret_cast

reinterpret_cast<new type>(expression)

将一个类型的指针转换为另一个类型的指针,它允许从一个指针转换为整数类型。

void test01() {
	char a = 0;

	int* p = reinterpret_cast<int*>(&a);
	//不安全
}


  1. const_cast

常量const指针与普通指针之间的相互转化。

如果不用const_cast:一般编译器直接报错。

浅谈C++类型转换函数_dynamic_cast

用const_cast之后

void test02() {
	const int a = 4;
	int b = 10;
	//int* p = &a;
	int* p = const_cast<int*>(&a);//可以强制转换,但很危险
	cout<<--p; //可以直接打印出地址;
	*p =  b; //直接抛出异常并中止程序。
}

浅谈C++类型转换函数_static_cast_02

可见还是很危险的。语法生成的时候虽然没报错,但运行说不定就会出错。

  1. static_cast

主要用于基本类型之间的相互转换,和具有继承关系间的类型转换。

一般情况下的基类指针或引用指向子类时

浅谈C++类型转换函数_dynamic_cast_03

用static_cast强制转换。

void test03() {
	A a;
	//B& p = a;

	B& p = static_cast<B&>(a);
	//可以这样转,但是也比较危险
}

浅谈C++类型转换函数_static_cast_04


  1. dynamic_cast

只有类中有虚函数才能用dynamic_cast

dynamic_cast具有类型检查功能,比static_cast更安全

void test04() {
	try {
		A a;
		B& p = dynamic_cast<B&>(a);
	}
	catch (bad_cast err) {
		cout << err.what() << endl;
	}
}

浅谈C++类型转换函数_reinterpret_cast_05

结果出现Bad dynamic_cast;

总结:C++中提供的四种强制类型转换在一定的特殊情况下可以使用,但各有各的危险。

但,在C++中可以自己实现 自定义转换函数。











下篇更新自定义转换函数