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类型,因此有时如果没有高精度要求的话,可以不需要定义太多的类型转换(转换时容易造成二义性,或者函数匹配出现二义性),一般建议只在类内定义一个转换即可
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)