C++类型转换

来源:互联网 发布:淘宝引流软件有用吗 编辑:程序博客网 时间:2024/05/21 17:53

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 = tmpA 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只能写在在声明中,不能写在定义中。