C++中的四种强制类型转换(静态、动态、去常、重解释)

强制类型转换

​ C++中有一套更安全的强制类型转换,分别是

1、静态类型转换

​ static_cast<目标类型>(源类型)

​ 源类型和目标类型只要有一个方向可以隐式转换,那么两个方向都可以做静态类型转换,如果不能则报错

#include <iostream>
using namespace std;

int main(int argc,const char* argv[])
{
    
    
	float num = 10;
	cout << sizeof(static_cast<short>(num)) << endl;
	int* p = NULL;
	cout << static_cast<int>(p) << endl;
}

​ 2、动态类型转换

​ dynamic_cast<目标类型>(源类型)

​ 源类型和目标类型必须同是引用或指针,且目标类型和源类型之间存在继承关系,否则报错

#include <iostream>
using namespace std;

int main(int argc,const char* argv[])
{
    
    
	int* p = NULL;
	cout << dynamic_cast<long*>(p) << endl;
	int num = 100;
	cout << dynamic_cast<long>(num) << endl;
}

​ 3、去常类型转换

​ const_cast<目标类型>(源类型)

​ 源类型和目标类型必须同是引用或指针,且目标类型和源类型之间只有常属性的区别,否则报错

#include <iostream>
using namespace std;

int main(int argc,const char* argv[])
{
    
    
	int* p = NULL;
	cout << const_cast<const int*>(p) << endl;
	cout << const_cast<long*>(p) << endl;
}

4、重解释类型转换

​ reinterpret_cast<目标类型>(源类型)

​ 源类型和目标类型必须同是指针,或者一个指针一个整数,否则报错

#include <iostream>
using namespace std;

int main(int argc,const char* argv[])
{
    
    
	cout << reinterpret_cast<int*>(100) << endl;	
	int* p = NULL;
	cout << reinterpret_cast<int>(p) << endl;
	cout << reinterpret_cast<short*>(p) << endl;
}

本贾尼·斯特劳斯特鲁普:如果让我重新设计,它们会更长。

原因:C++之父不希望程序员使用强制类型转换,如果程序中用到了强制类型转换则说程序设计的不完善,程序员应该去优化程序的设计而不应该强制类型转换。

猜你喜欢

转载自blog.csdn.net/qq_45662588/article/details/119085377
今日推荐