C++类型转换

C++类型转换

隐式类型转换

隐式类型转换发生在以下情况:

  • 在混合类型的算术表达式中,为了防止精度丢失,这种情况最宽的数据类型称为目标转换类型,这也被称为算术转换,例如int+double被转换成double
    在进行整值提升时char , signed char , unsigned char , 和short int 都被提升为int ,,枚举类型被提升为能够表示其底层类型所有值的最小整数类型

  • 用一种类型的表达式赋值给另一种类型的对象,例如double a = 1.1,int b = a,a被截取为int

  • 把一个表达式传递给一个函数,调用表达式的类型和形参的类型不同 例如 funtest(double n),调用函数:funtest(10)这里10被提升为double 类型10.0

  • 从一个函数返回一个表达式的类型与返回值类型不同,这时候返回的类型自动转换成函数声明返回值的类型,例如:double funtest(){return 2;}这里2被提升为double类型2.0

强制类型转换

C风格的:(T)expression//将expression转型为T
函数风格的:T(expression)//将expression转型为T
C++新式转换:

  • const_cast( expression )//用来移除对象的常量性,唯一有此能力的C++style转型操作符
  • dynamic_cast( expression )//执行安全性下转型,用来决定某对象是否归属继承体系中的某个类型,唯一无法由旧式语法执行的动作,只能用于含有虚函数的类,成功则转换,不成功返回0
  • reinterpret_cast( expression )//执行低级转型,不可移植,例如建一个int*转化成一个int
  • static_cast( expression )//强迫隐式转型,例如将non-const对象转化成const 对象,int转化为double等,将void*转化为typed指针,将基类指针转化为派生类指针等

尽量使用新式转换:首先它很容易在代码中被辨识出来(不论人工还是grep工具),其次各转型动作的目标愈窄化,编译器愈可能诊断出错误的运用,比如打算将常量性去掉,除非使用const_cast否则无法通过编译

C++中的explicit关键字

C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的
例如不使用explicit的类

class A
{
public:
    A(int n){};
};
A a = 10;//允许,隐式转换,相当于 A  tmp(10), A a = tmp
A a(1.1);//允许
/****/
void DoSoming(A a)
{}
DoSoming(a);//允许
DoSoming(10);//允许

使用explicit

class A
{
public:
    A(int n){};
};
A a = 10;//不允许
A a(1.1);//允许
/****/
void DoSoming(A a)
{}
DoSoming(a);//允许
DoSoming(10);//不允许

当类的声明和定义分别在两个文件中时,explicit只能写在在声明中,不能写在定义中。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值