C++的数据类型转换:显式转换(static_cast、dynamic_cast、const_cast、reinterpret_cast)、隐式转换和算术转换(整型提升等)

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


  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值