【C++语言实战进阶 】模板编程

类型转换

隐式类型转换

  1. 负数转化为无符号类型,通常会采用二进制补码表示。(编译器不警告有符号和无符号整数类型之间的隐式转换)
int a= -1 ;
unsigned int b = a;// 6=232 -1=4294967295189
  1. 无论是转换到bool类型或者是有bool类型进行转换: false等价于0(数值类型)或者空指针(指针类型);true则等价于其它任何数值或者由true转化为1
int a = -2:
bool b= a;//则b= true
  1. 浮点数转化为整数会采取截断操作。如果转换时发生了数值溢出,可能出现未定义的行为。
float a = -1.5f;
int b-a;// b= -1
  1. 一个C风格的数组隐式把数组的第一个元素转换为一个指针。
char* s=“Hello World"+ 4;

显式类型转换

我们经常会看到会有如下的常量定义:
const std: : string SLOGAN=“Good good study,day day up. ";
这其中是因为C++编译器帮我们做了隐式转换,将const char*类型转换成std:string类型
const std: :string SLOGAN("Good good study,day day up.”);

explicit关键字

C++提供了关键字explicit,可以阻止构造函数进行隐式转换的发生声明为explicit的构造函数不能在隐式转换‘使用
限定条件
explicit关键字只能用来修饰类的构造函数
explicit关键字作用于单个参数的构造函数explicit关键字不能被继承

显式类型转换,类型转换操作符

XXX_cast <new_type> (expression)

static_cast

  1. static_cast强制转换只会在编译时检查,但没有运行时类型检查来保证转换的安全性
  2. 用于类层次结构中基类和子类之间指针或引用的转换:进行上行转换(子类->父类)是安全的;进行下行转换(父类->子类)时,由于没有动态类型检查,所以是不安全的
  3. 用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证
  4. 把void*指针转换成目标类型的指针,此种转换方式不安全
  5. 把任何类型的表达式转换成void类型
  6. 将enum class值转化为整数或者浮点数
  7. 转换为右值引用

static_cast

  1. static_cast强制转换只会在编译时检查,但没有运行时类型检查来保证转换的安全性
  2. 用于类层次结构中基类和子类之间指针或引用的转换:进行上行转换(子类->父类)是安全的;进行下行转换(父类->子类)时,由于没有动态类型检查,所以是不安全的
  3. 用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证
  4. 把void*指针转换成目标类型的指针,此种转换方式不安全
  5. 把任何类型的表达式转换成void类型
  6. 将enum class值转化为整数或者浮点数
  7. 转换为右值引用

dynamic_cast

new_type 必须是一个指针或引用或“指向void*的指针”
00617899
·如果new_type是指针,则expression 的类型必须是指针,如果new_type是引用,则expression为左。值。如果转型失败会返回nullptr(转型对象为指针时)或抛出异常(转型对象为引用时)。
dynamic_cast使用RTTl来进行类型安全检查,因此dvnamic cast左在二定的领率损生)n617899

const_cast

. new_type必须是一个指针、引用或者指向对象类型成员的指针。
.const cast用于去除除对象的const

reinterpret_cast

. new type必须是一个指针、引用、算术类型、函数指针或者成员指针。
其转换结果与编译平台息息相关,不具有可移植性,因此在一般的代码中不常见到它。
reinterpret _cast 常用的一个用途是转换函数指针类型,即可以将一种类型的函数指针转换为另一种类型的函数指针,但这种转换可能会导致不正确的结果。
reinterpret cast就是对指针类型进行重新解释,非常类似纯C风格的指针类型强转

类型转换运算符

类型转换操作符(type conversion operator)是一种特殊的类成员函数,它定义将类类型值转变为其他类型值的转换。转换操作符在类定义体内声明,在保留字operator 之后跟着转换的目标类型。
函数原型

T1: : operator T2lconst];

·转换函数必须是成员函数,不能指定返回类型,且形参表必须为空;返回值是隐含的,返回值是与转换的类型相同的,即为上面原型中的T2;
T2表示内置类型名(built-in type)、类类型名(class type)或由类型别名(typedef)定义的名字;对任何可作为函数返回类型的类型(除了void 之外)都可以定义转换函数,一般而言,不允许转换为数组或函数类型,转换为指针类型(数据和函数指针)以及引用类型是可以的;
·转换函数一般不应该改变被转换的对象,因此转换操作符通常应定义为const成员;·支持继承,可以为虚函数;
·只要存在转换,编译器将在可以使用内置转换的地方自动调用它;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值