C++类型转换

一 C风格类型转换

void test01(){
	//一:
	/************C风格的转换*********************/
	int a1 = 80;
	char c1 = a1;
	cout << c1 << endl;
	c1++;
	cout << c1 << endl; //C风格的自动类型转换

	int a2 = 80;
	cout << (char)a2 << endl;//C风格的强制转换
}

二 C++风格的类型转换

  1. reinterpret_cast<new_type>(expression)
  2. dynamic_cast<new_type>(expression)
  3. static_cast<new_type>(expression)
  4. const_cast<new_type>(expresson)

1 static_cast

用法: static_cast < type-id > ( expression )
说明:1 该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。
2 对 type-id 的类型无要求
它主要有如下几种用法:
1.1.用于类层次结构中基类和子类之间指针或引用的转换。进行上行转换(把子类的指针或引用转换成基类表示)是安全的;进行下行转换(把基类指针或引用转换成子类指针或引用)时,由于没有动态类型检查,所以是不安全的。
1.2.用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。
把void指针转换成目标类型的指针(不安全!!)
1.3把任何类型的表达式转换成void类型。
注意:1 static_cast不能转换掉expression的const、volitale、或者__unaligned属性。
2 此种转换不能实现将string转换从int,所以使用时暂时按照推荐的几种方法使用。

#include<iostream>
using namespace std;
class A{};
class B :public A {};
class C{};
void test02() {
	//二C++转换:
	//1.static_cast
	/************static_cast*********************/

	/*基础数据类型转换*/
	int a1 = 80;
	char c1 = static_cast<char>(a1);
	cout << c1 << endl;

	/*基础数据类型指针转换*/
	//int *p3 = nullptr;
	//char *p3 = static_cast<char*>(p3);//错误 类型转换无效

	/*具有继承关系的对象指针(或者引用)互相转换*/  //对象不行 对象指针或者引用行
	A *ca1 = NULL;
	B *cb1 = static_cast<B*>(ca1);//父转子
	B *cb2 = NULL;
	A *ca2 = static_cast<A*>(cb2);//子转父

	/*没有具有继承关系的对象指针(或者引用)互相转换*/
	//static_cast不能由于没有具有继承关系的对象指针(或者引用)互相转换
}

用法: dynamic_cast < type-id > ( expression )
说明:1 该运算符把expression转换成type-id类型的对象。 Type-id必须是类的指针、类的引用或者void * ;如果type-id是类指针类型,那么expression也必须是一个指针,如果type-id是一个引用,那么expression也必须是一个引用。

void test03() {
	//2.dynamic_cast
	/************dynamic_cast*********************/
	//基础数据类型(char->int 不行)
	//不具有继承关系的指针也不行
	//具有继承关系的指针(引用)
	//A *ca1 = NULL;
	//B *cb1 = dynamic_cast<B*>(ca1);//父转子不行 因为会进行内存检查

	B *cb1 = NULL;
	A *ca1 = dynamic_cast<B*>(cb1);//子转父可以
}

3 const_cast
用法: const_cast <type_id> (expression)
说明:1该运算符用来修改类型的const或volatile属性。除了const 或volatile修饰之外, type_id和expression的类型是一样的。
2 type_id 必须是指针、引用或者指向对象类型成员的指针

void test04() {

	//3.const_cast //必须是指针、引用或者指向对象类型成员的指针
	/************const_cast*********************/
	int a = 10;
	const int &b = a;
	int &c = const_cast<int&>(b);
	c = 11;
	cout << a << " " << c << endl;  //去除const特性

	const int* d = nullptr;
	int *e = const_cast<int*>(d); //增加const特性
}

4 reinpreter_cast
用法: reinpreter_cast (expression)
说明:type-id必须是一个指针、引用、算术类型、函数指针或者成员指针。它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,在把该整数转换成原类型的指针,还可以得到原先的指针值)。

void test05() {

	//4.reinterpret_cast //必须是指针、引用或者指向对象类型成员的指针
	/************reinterpret_cast*********************/
	//仅仅限定2个无继承关系的类的指针或者引用转换
	A *a = nullptr;
	C *c = reinterpret_cast<C*>(a);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值