一 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++风格的类型转换
- reinterpret_cast<new_type>(expression)
- dynamic_cast<new_type>(expression)
- static_cast<new_type>(expression)
- 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);
}