C++:类型转换

Posted studying~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++:类型转换相关的知识,希望对你有一定的参考价值。

一.静态转换

static_cast<待转换的类型>(待转换的数据)
1.static_cast可以用来转换基本的内置数据类型 int char double…
2.static_cast不能转换没有发生继承关系之间的类
3.static_cast可以用来转换发送继承关系之间的类,但是不保存安全性
4.不能用来转换指针

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <string>
using namespace std;

void  test01()
{
	//static_cast 用来转换内置的数据类型 和c语言的强制类型转换一样
	int a = 1;
	char  b = 2;
	double c = 3.14;
	a = static_cast<int>(b);
	a = static_cast<int>(c);
	c = static_cast<double>(a);	
}
class A
{
public:
	int  a;
};
class B:public A
{
public:
	int  b;
};
void test02()
{
	A *p1 = new  A;
	B *p2 = new  B;
	//static_cast不能转换没有发生继承关系之间的类
	//如果两个类之间发生了继承关系,可以类型转换 但是static_cast不会保证转换的安全性
	p1 = static_cast<A *>(p2);//子转父 向上转换 是安全的
	p2 = static_cast<B*>(p1);//父转子 向下转换  是不安全的 且没有错误提示
}
void  test03()
{
	int *p1 = NULL;
	char  *p2 = NULL;
	//static_cast不能用来转指针
	//p1 = static_cast<int *>(p2);

}
int main() {
	return 0;
}

二.动态转换

1.不能用于转换基本的数据类型
2.可以用于转换发送继关系之间的类,保证转换是安全的 子转父是可以的
3.如果发生了多态,子转父和父转子总是安全的

void   test04()
{
	//动态转换不能转内置的基本数据类型
	int  a = 1;
	char  b = 2;
	//a = dynamic_cast<int>(b);

}
void  test05()
{
	A *p1 = new  A;
	B *p2 = new  B;
	//dynamic_cast不能用于没有发生继承关系之间的类转换
	//dynamic_cast可以用于发生继承关系之间的类号转换

	p1 = dynamic_cast<A *>(p2);//子转父 是安全的
	//p2 = dynamic_cast<B*>(p1);//父转子 不安全  不允许 且有错误提示

}

三.常量转换

const_cast 一般用来加const或去除const

//const转换
void  test06()
{
	  int  *p1 = NULL;
	  const  int *p2 = NULL;
	  //int  *p1 = static_cast<int  *>(p2);
	  p1 = const_cast<int  *>(p2);
	  p2 = const_cast< const  int *>(p1);
}

四.重新解释转换

reinterpret_cast 一般用来转换指针 整数和指针之间都可以转换

//reinterpret_cast
void  test07()
{
	int  *p = NULL;
	char  *p2 = NULL;
	p = reinterpret_cast<int  *>(p2);
	p2 = reinterpret_cast<char  *>(p);
	int  c = 0;
	c = reinterpret_cast<int>(p2);
}

五. 总结

static_cast 一般用来转换内置的基本数据类型
dynamic_cast 一般用来转发生继承关系之间的自定义的数据类型
const_cast 一般用来转换加const和去除const
reinterpret_cast 一般用来转指针

以上是关于C++:类型转换的主要内容,如果未能解决你的问题,请参考以下文章

C++用来检测数据类型的声明工具源码

C++ 级联类型转换

这些 C++ 代码片段有啥作用?

C++中 OOP相关的类型转换

C++中指针类型转换的解释

有趣的 C++ 代码片段,有啥解释吗? [复制]