C++中的类型转换总结

此为本人学习日记,如有错误,请指出

1、内置类型转换成内置类型

  • 整型之间的类型转换,char , int , long ,long long(包括无符号类型),这些转换从低字节类型转换高字节类型
  • 浮点数之间的类型转换,float,double,这些转换也是从低字节转换成高字节

转换方式:整型提升,直接提升

整型提升:字节数比int小的,在转换成字节数大于等于int类型时,都会进行的一种提升方式
例如char size_one=1;
unsigned int size_four=size_one; 这个转换过程中,char先转换成int,再从int转换成unsigned
直接提升:直接转换,例如int转换成unsigned,int 转换成int->unsigned long long等等
需要注意的是(与候选函数的匹配有关):有些初学者可能会注意到,int转换成unsigned,unsigned转换成long long,int转换成long long,那么int转换成long long是不是需要两步? 实际上只需要一步,并且int转换成long long和unsigned转换成long long都是等效的,并非unsigned转换成long long所转换的与int转换成long long都是一样容易的,对于函数来说他们都是转换一次。

2、内置类型转换到自定义类

  • 这里需要满足两个条件,1、类必须是只含有内置类型的构造函数,或者该构造函数除了该内置类型定义的形参之外,其他的都有默认实参 2、该构造函数不能是关键字explicit定义的
class Student
{
public:
	Student(int n):age(n){}
private:
	int age;
};

class Student
{
public:
	Student(int n, int m = 0) :age(n), id(m)
	{
	}
private:
	int age;
	int id ;
};

上述两种都可以使用下面这个调用

Student student=3;

在效果上看出3变成了一个Student类型的对象student,就是从一个内置类型转换成了一个自定义类型
这里实际上是隐式调用了构造函数

3、自定义类型A转换成自定义类型B

  • 方法1、同上,自定义类型B需要有一个以自定义类型A为形参的构造函数,或只有A类型的形参没有默认实参,其他形参都有默认实参的构造函数,并且该构造函数不能是被关键字explicit所定义的
  • 方法2、同下,可以利用

operator class 自定义类名 (){return 类对象;}
注意,这里的自定义类名,必须是前面已经定义或者声明的自定义类

4、自定义类型转换成内置类型

  • 此方式的条件是,在自定义类型中设置转换,格式为

operator type() {return 变量;}
请注意,该变量必须是type类型的,也就是()前面的类型

定义代码

class Student
{
public:
	Student(int n, int m = 0) :age(n), id(m)
	{
	}
	operator int()
	{
		return age;
	}
private:
	int age;
	int id ;
};

调用代码,这里等号的右边是Student类(自定义类型),左边是内置类型,我通过定义了一个符号,将发生了转换,将Student转换成int类型

Student student(3);
int p=student;

可能有读者会疑惑,如果我需要long long,我还需要再在类内定义long long类型的转换吗?
我的建议是,看需求,如果你没有写long long类型的转换的话,会自动进行转换的
例如

//我并没有在Student类内定义long long类型的转换
long long q=student;

这里Student类帮我把student转换成了int类型,编译器帮我把int类型转换成了long long类型,因此有时如果没有高精度要求的话,可以不需要定义太多的类型转换(转换时容易造成二义性,或者函数匹配出现二义性),一般建议只在类内定义一个转换即可

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值