c++类型转换

//类型转换

 

隐式转换:类型自动转换,无须操作

 

隐式转换发生的一些情况

1.比int类型小的整型值首先提升为较大的整数类型

2.在条件中,非布尔值转换成布尔值

3.初始化时,赋值时

4.运算对象有多种类型时

5.函数调用或返回时

 

算术转换:运算符的运算对象将转换成最宽的类型

整型提升:转换后的类型要能容纳原类型所有可能的值。

无符号类型转换:先整型提升,如果结果类型匹配,无须再进行下一步转换;

如果类型不匹配,则小类型转换成大类型

 

bool flag; char cval;

short sval; unsigned short usval;

int ival; unsigned int uival;

long lval; unsigned long ulval;

float fval; double dval;

 

auto da = 3.1415L + 'a';//'a'提升成int,然后该int转换成long double;

cout << typeid(da).name() << endl;//为long double

 

dval + ival;//ival转换成double

dval + fval;//fval转换成double;

ival = dval;//dval转换成(切除小数部分)int

flag = dval;//如果dval非0则flag为true,否则为false

cval + fval;//cvar提升成int,然后转换成float

sval + cval;//都提升成int

ival + ulval;//ival转换成 unsigned long

usval + ival;//根据unsigned short和int所占空间大小提升

uival + lval;//根据unsigned int和long所占空间大小提升

 

 

unsigned short us = 1234;

int iv = 25;

auto num = us + iv;

cout << typeid(num).name() << endl;//int

 

unsigned int ui = 12345;

long lv = 123;

 

auto num1 = ui + lv;

cout << typeid(num1).name() << endl;//unsigned long

*/

 

数组转换成指针:数组自动转换成指向首元素的指针,decltype、&、sizeof、typeid不会转换。

int ar[10];

int *p = ar;

int *ap = &ar;//错误

int a = 10;

decltype(ar) b;//b为int[10],没有转换成指针

cout << typeid(ar).name() << endl;//int[10], 没有转换成指针

cout << sizeof(ar) << endl;//计算出所占内存大小

 

//指针的转换

0或nullprt能转换成任意指针类型

int *p(0);

float *f(nullptr);

cout << typeid(p).name()<<"   " << typeid(f).name() << endl;

指向任意非常量的指针能转换成void*;指向任意对象的指针能转换成const void*

int a = 12;

int *ap = &a;

cout << typeid((void*)ap).name() << endl;

const float b = 12;

const float * bp = &b;

cout << typeid((const void *)bp).name() << endl;

 

转换成布尔类型:如果指针或算术类型的值为0,转换为false,否则为true

 

//转换成常量:非常量可转常量,常量不能转非常量

int i(10);

const int &j = i;//非常量转换成常量引用

const int *p = &i;//非常量的地址转换成常量地址

int &r = j, *q = p;//错误不允许const转换成非常量

 

类类型定义的转换

string str = "asdwrwra";//字符串字面值转换成string类型

 

//显示转换:强制转换

static_cast:任何具有明确定义的类型转换,只要不包含底层const都可以使用

int d = 10;

void *p = &d;

double *dp = static_cast<double*>(p);

const char *pc;

char *sp = static_cast<char*>(pc);//错误static_cast不能转换掉const属性

 

const_cast:只能改变运算对象的底层const

const char *pc;

char *p = const_cast<char*>(pc);*/

int ipc = const_cast<int*>(pc);//错误const_cast只能改变常量属性

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值