一、系统预定义类型间的转换
对于系统预定义的标准类型(int、float、double、char等),C++提供两种类型转换方式:隐式类型转换 和 显式类型转换。
1、隐式类型转换
C++语言不会直接将两个不同类型的值相加,而是先根据类型转换规则设法将运算对象的类型统一后再求值,隐式转换(implicit conversion) 的类型转换是自动执行的,无需程序员的介入。
在赋值表达式A=B的情况下,赋值运算符右端B的值需转换为A类型后进行赋值。
例如:
int x=5,y;
y=3.5+x;
在进行“3.5+x”时,先将x的值5转换成double类型,然后与3.5相加,得到的和为8.5,在向整形变量y赋值时,将8.5转换成整数8,然后赋给y。这种转换是由C++编译系统自动完成的。
(1)算数转换
大量的例子:
bool flag;
short sval;
int ival;
long lval;
float fval;
char cval;
unsignedshort usval;
unsigned int uival;
unsigned long ulval;
double dval;
3.14159L + 'a'; //'a'提升成 int,然后该int 值转换成long double
dval + ival; //ival转换成 double
dval + fval; //fval转换成 double
ival = dval; //dval转换成(切除小数部分后)int
flag = dval; //如果dval是0,则flag 是flase,否则flag 是 true
cval + fval; //cval 提升成 int ,然后该 int 值转换为 float
sval + cval; //sval 和 cval 都提升成 int
cval + lval; //cval 转换成 long
ival + ulval; //ival 转换成 unsigned long
usval + ival; //根据unsigned short 和 int 所占空间的大小进行提升
uival + lval; //根据unsigned int 和 long 所占空间的大小进行转换
(1)数组转换成指针
在大多数用到数组的表达式中,数组自动转换成指向数组首元素的指针。
int ia[10]; //含有10个整数的数组
int* ip = ia; //ia转换成指向数组首元素的指针
(2)指针的转换
C++规定了几种指针转换方式:
- 常量整数值 0 或字面值 nullptr 能转换成任意指针类型;
- 指向任意非常量的指针能转换成 void* ;
- 指向任意对象的指针能转换成 const void*;
- 在有继承关系的类型间还有另外一种指针转换的方式。
(3)转换成布尔类型
存在一种从算数类型或指针类型向布尔类型自动转换的机制,如果指针或算数类型的值为0,转换结果是false;否则转换结果是 true。
char *cp = get_string();
if(cp) //如果指针cp不是0,条件为真
while(*cp) //如果*cp不是空字符,条件为真
(4)转换成常量
允许将 指向非常量类型的指针 转换成 指向相应的常量类型的指针 。对于引用也是这样。即,如果T是一种类型,我们就能将指向 T 的指针或引用分别转换成指向 const T 的指针或引用。
int i;
const int &j = i; //非常量转换成 const int 的引用
const int *p = &i; //非常量的地址转换成const的地址
int &r = j,*q = p; //错误,不允许const转换成非常量
(5)类类型定义的转换
类类型能定义由编译器自动执行的转换,不过编译器每次只能执行一种类类型的转换。
class Test1
{
public:
Test1(int n) {
num = n; } //普通构造函数
private:
int num;
};
class Test2
{
public:
explicit Test2(int n) {