目录
C++的数据类型转换
(1)显式转换
A.一般形式的显式转换:
int(dDeficit) 或者 (int)dDeficit;两种形式int()和(int)
double dDeficit = 128.1;
int iDeficit = (int)dDeficit; //或者 int iDeficit = int(dDeficit);
B.static_cast:
static_cast只要不包含const,都可以使用,即不能去掉变量的const常量属性,也不能将为变量添加const属性
double dDeficit = 128.1;
void *p = &dDeficit;
double *pd = static_cast<double*>(p); //将void指针转为double指针
C.dynamic_cast:
当进行向下转型(基类的指针或引用转为派生类的指针或引用)时,如果基类指针或引用指向派生类对象,则转换成功。否则转换失败,返回的是空指针(而不会直接报错,提供了一种保护机制,即安全的向下转型)。
Base *basePtr = new Derived();
Derived *derivePtr = dynamic_cast<Derived*>(basePtr);
if(derivePtr==nullptr) std::cerr<<"转换失败"<<std::endl;
else std::cout<<"转换成功"<<std::endl;
D.const_cast:
改变底层const,将常量对象转换为非常量对象,static_cast无法实现const_cast的功能
- 去掉底层const的const:
const char * pc;
char *p = const_cast<char*>(pc);
- 为常规指针添加const属性:
char *p;
const *pc = const_cast<const char*>(p);
E.reinterpret_cast:
可以在任意指针类型或引用类型之间进行转换,但不具有可移植性(不同平台可能不通用),并且不安全
double* pd = &dDeficit;
int *pi = reinterpret_cast<int*>(pd);
注意:仅适用于指针类型和引用类型
(2)隐式转换
A.一般隐式转换:
double dDeficit = 128.1;
int iDeficit = dDeficit;
B.数组转指针:
int a[10] = {0,1,2,3,4,5,6,7,8,9};
int *pa = a; //指向数组的首元素
(3)算术转换
A.What(什么是算术转换)
一种算术类型转换成另一种算术类型,都将转换成最宽的类型进行运算。如下代码所示,ia和dDuration相加,ia将先转换为double类型,然后和dDuration进行加法运算。
int ia = 1966;
double dDuration = 10.0;
auto dYear = ia + dDuration;
B.整型提升
把小整型提升为较大的整型:
char、signedchar、usignedchar、short、unsignedshort 等会自动提升为 int/unsignedint
char a = 10;
int iYear = 1966;
int iSunLv = a + iYear; //1976
================================================================================
如果读者对C++感兴趣,欢迎阅读笔者关于在学习C++过程中的关于其知识点的总结系列,入口如下:
C++知识点总结全系列文章索引:
【C++知识点总结全系列 (01)】:数据类型、数据类型转换和变量
【C++知识点总结全系列 (02)】:C++中的语句、运算符和表达式详细总结
【C++知识点总结全系列 (03)】:函数(函数参数传递、可变参数、函数返回值等详细介绍)
【C++知识点总结全系列 (04)】:C++类的详细总结与分析
【C++知识点总结全系列 (05)】:IO 类的详细总结和分析
【C++知识点总结全系列 (06)】:STL六大组件总结- 配置器、容器、迭代器、适配器、算法和仿函数
【C++知识点总结全系列 (07)】:模板与泛型编程详细总结与分析
【C++知识点总结全系列 (08)】:面向对象编程OOP