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