企业网站整理优化,校园网站建设与管理,网页界面设计中一般使用的分辨率是多少,集团管理软件Chapter 4 Expressions
4.11 类型转换
4.11.2 其他隐式类型转换
数组转换成指针#xff1a; 在大多数用到数组的表达式中#xff0c;数组自动转换成指向数组首元素的指针#xff1a;
int ia[10];
int* ipa;♜ 当数组被用作decltype关键字的参数#xff0c;或者作为取地…Chapter 4 Expressions
4.11 类型转换
4.11.2 其他隐式类型转换
数组转换成指针 在大多数用到数组的表达式中数组自动转换成指向数组首元素的指针
int ia[10];
int* ipa;♜ 当数组被用作decltype关键字的参数或者作为取地址符、sizeof及typeid等运算符的运算对象时上述转换不会发生。 同样的如果用一个引用来初始化数组上述抓换也不会发生。
指针的转换 C还规定了几种其他的指针转换方式 包括常量数值0或者字面值nullptr能转换成任意指针类型 ♜ 指向任意非常量的指针能转换成void* ♜ 指向任意对象的指针能转换成const void*。
♜ 转换成常量 允许将指向非常量类型的指针转换成指向相应的常量类型的指针对于引用也是这样。 也就是说如果T是一种类型我们就能将指向T的指针或引用分别转换成指向const T的指针或引用
int i;
const int ji; //非常量转换成const int的引用
const int* pi; //非常量的地址转换成const的地址
int rj;*qp; //错误不允许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 i1,j3;
//进行强制类型转换以便执行浮点数除法
double slopestatic_castdouble(j)/i;注解对j使用static_cast强制转换为double后与i进行计算时i会进行隐式转换将类型提升为double。 当需要把一个较大的算数类型赋值给较小的类型时static_cast非常有用。 static_cast对于编译器无法自动执行的类型转换也非常有用。 例如我们可以使用static_cast找回存在于void*指针中的值
void *pd; //正确任何非常量对象的地址都能存入void*
//正确将void*转换回初始的指针类型
double *dpstatic_castdouble*(p);const_cast const_cast只能改变运算对象的底层const
const char* pc;
char *pconst_castchar*(pc);对于将常量对象转换成非常量对象的行为我们一般称其为”去掉const性质cast away the const“。 一旦我们去掉了某个对象的const性质编译器就不再阻止我们对该对象进行写操作了。如果对象本身不是一个常量使用强制类型转换获得写权限是合法的行为。 然而如果对象是一个常量再使用cosnt_cast执行写操作就会产生未定义的后果。 只有const_cast能改变表达式的常量属性使用其他形式的命名强制类型转换改变表达式的常量属性都将引发编译器错误。 同样的也不能用const_cast改变表达式的类型
const char *cp;
//错误static_cast不能转换掉const性质
char *qstatic_castchar*(cp);
static_caststring(cp); //正确字符串字面量转换成string类型
const_caststring(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语言风格的强制类型转换