当前位置: 首页 > news >正文

C++ Primer Chapter 4 Expressions

Chapter 4 Expressions

4.11 类型转换

4.11.2 其他隐式类型转换

数组转换成指针:
在大多数用到数组的表达式中,数组自动转换成指向数组首元素的指针:

int ia[10];
int* ip=a;

♜ 当数组被用作decltype关键字的参数,或者作为取地址符(&)、sizeof及typeid等运算符的运算对象时,上述转换不会发生。
同样的,如果用一个引用来初始化数组,上述抓换也不会发生。

指针的转换:
C++还规定了几种其他的指针转换方式,
包括常量数值0或者字面值nullptr能转换成任意指针类型;
♜ 指向任意非常量的指针能转换成void*;
♜ 指向任意对象的指针能转换成const void*。

转换成常量:
允许将指向非常量类型的指针转换成指向相应的常量类型的指针,对于引用也是这样。
也就是说,如果T是一种类型,我们就能将指向T的指针或引用分别转换成指向const T的指针或引用:

int i;
const int &j=i;			//非常量转换成const int的引用
const int* p=&i;		//非常量的地址转换成const的地址
int &r=j;*q=p;			//错误:不允许const转换成非常量

相反的转换并不存在,因为它试图删除底层的const。
类类型定义的转换:
类类型能定义由编译器自动执行的转换,不过编译器每次只能执行一种类类型的转换。
如果同时提出多个转换请求,这些请求将被拒绝。

4.11.3 显示转换
强制类型转换(cast)
WARNING 虽然有时不得不使用强制类型转换,但这张方法本质上是非常危险的。
命名的强制类型转换
一个命名的强制类型转换具有如下形式:
cast-name(expression);
其中,type是转换的目标类型而expression是要转换的值。如果type是引用类型吗,则结果是左值。cast-name是static_cast、dynamic_cast、const_cast和reinterpret_cast中的一种。
cast-name指定了执行的是那种转换。
static_cast
任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast。

int i=1,j=3;
//进行强制类型转换以便执行浮点数除法
double slope=static_cast<double>(j)/i;

注解:对j使用static_cast强制转换为double后,与i进行计算时,i会进行隐式转换将类型提升为double。
当需要把一个较大的算数类型赋值给较小的类型时,static_cast非常有用。
static_cast对于编译器无法自动执行的类型转换也非常有用。
例如,我们可以使用static_cast找回存在于void*指针中的值:

void *p=&d;		//正确:任何非常量对象的地址都能存入void*
//正确:将void*转换回初始的指针类型
double *dp=static_cast<double>*(p);

const_cast
const_cast只能改变运算对象的底层const:

const char* pc;
char *p=const_cast<char*>(pc);

对于将常量对象转换成非常量对象的行为,我们一般称其为”去掉const性质(cast away the const)“。
一旦我们去掉了某个对象的const性质,编译器就不再阻止我们对该对象进行写操作了。如果对象本身不是一个常量,使用强制类型转换获得写权限是合法的行为。
然而如果对象是一个常量,再使用cosnt_cast执行写操作就会产生未定义的后果。
只有const_cast能改变表达式的常量属性,使用其他形式的命名强制类型转换改变表达式的常量属性都将引发编译器错误。
同样的,也不能用const_cast改变表达式的类型:

const char *cp;
//错误:static_cast不能转换掉const性质
char *q=static_cast<char*>(cp);
static_cast<string>(cp);		//正确:字符串字面量转换成string类型
const_cast<string>(cp);			//错误:const_cast只能改变常量属性

const_cast常常用于有函数重载的上下文中。
reinterpret_cast

WARNING reinterpret_cast本质上依赖于机器,要想安全地使用reintepret_cast必须对涉及的类型和编译器实现转换的过程都非常了解。

建议:避免强制类型转换
强制类型转换干扰了正常的类型检查,因此我们强烈建议程序员避免使用强制类型转换。这个建议对于reinterpret尤其适用,因为此类类型转换总是充满了风险,在有重载函数的上下文中使用const_cast无可厚非;但是在其他情况下使用const_cast也就意味着程序存在某种设计缺陷。其他强制类型转换,比如static_cast和dynamic_cast,都不应该频繁使用。每次书写了一条强制类型转换语句,都应该反复斟酌能否以其他方式实现相同的目标。就算实在无法避免,也应该尽量限制类型转换值的作用域,并且记录相关类型的所有假定,这样可以减少错误发生的机会。

旧式的强制类型转换
在早期版本的C++语言中,显式地进行强制类型转换包含两张形式:

type (expr);		//函数形式的强制类型转换
(type) expr;		//C语言风格的强制类型转换
http://www.lryc.cn/news/364640.html

相关文章:

  • [leetcode hot 150]第一百三十七题,只出现一次的数字Ⅱ
  • wpf工程中加入Hardcodet.NotifyIcon.Wpf生成托盘
  • keil下载及安装(社区版本)
  • python书上的动物是啥
  • 数据库管理-第198期 升级Oracle ACE Pro,新赛季继续努力(20240605)
  • 华为坤灵交换机S300, S500, S210,S220, S200, S310 如何WEB抓包
  • 【亚马逊云科技 CSDN 联合巨献】 「对话AI 构建者:从基础到应用的 LLM 全景培训」 限时免费!
  • 【AI大模型】Function Calling
  • 零钱兑换 - LeetCode 热题 85
  • 基于web的垃圾分类回收系统的设计
  • 优化你的WordPress网站:内链建设与Link Whisper Pro插件的利用
  • spring中那些地方使用了反射
  • 1 机器人软件开发学习所需通用技术栈(一)
  • Java(十二)——Comparable接口与Comparator接口
  • Nvidia Jetson/Orin +FPGA+AI大算力边缘计算盒子:轨道交通监控系统
  • 笔记 | 软件工程01:从程序到软件
  • 废品回收小程序开发,助力商家拓展回收市场
  • JVM类加载机制和双亲委派
  • 【PyCharm】无法创建虚拟环境,提示:has no attribute CPython3macOsBrew
  • 华为OD刷题C卷 - 每日刷题 12(数组连续和,求最多可以派出多少支团队)
  • 2.1 初识Windows程序
  • EDI系统的使用场景
  • 韩国Neowine推出第三代强加密芯片ALPU-CV
  • golang结构与接口方法实现与交互使用示例
  • C# 判断字符串不等于空的示例
  • 直方图中最大的矩形
  • 分布式锁redisson
  • 将小爱音箱接入 ChatGPT 和豆包ai改造成专属语音助手
  • 短网址生成原理及使用
  • C#调用word组件转pdf,遇到视图保护解决方法