C++中的类型转换总结

C++中的类型转换总结,第1张

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

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类型,因此有时如果没有高精度要求的话,可以不需要定义太多的类型转换(转换时容易造成二义性,或者函数匹配出现二义性),一般建议只在类内定义一个转换即可

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/562332.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-01
下一篇 2022-04-01

发表评论

登录后才能评论

评论列表(0条)

保存