内置类型的转换:
内置类型之间的转换之前提过。相同类型的赋值直接进行,但不同类型之间的赋值系统会将将其转换成临时变量,这个临时变量具有常性,然后再将这个临时变量进行赋值,这里就不做代码演示了。自定义类型转换为内置类型暂时先不做考虑,后面深入文章会进行深入讲解。
这里要说明的是这里也不是什么内置类型都可以进行转换,当两个不同类型之间相似度较小时可以发生,当相差较大时就可能会报错。如:double与int之间相似度较大,可以发生;int与int*相似度就较小,可能会报错。如下:
int* ptr = nullptr; int a = ptr;//出错 double d = 1.2; int x = d;//转换成功
自定义类型的转换:
自定义类型的隐式转换其实发生在构造函数中,构造函数不仅可以构造与初始化对象,对于单个参数或者除第一个参数无默认值其余均有默认值的构造函数,还具有类型转换的作用。
自定义类型与自定义类型之间相当于直接赋值或拷贝构造,内置类型直接赋值自定义类型之间会发生隐式转换,即内置类型对象隐式转换成自定义类型对象。其中能支持这个转换,是因为有自定义类型的int单参数构造函数(支持传一个参数多参数带缺省也可以)支持。如下图:
当发生一个参数多参数带缺省的情况时,隐式转换默认自定义类型成员的第一个参数进行转换。我们也可多个内置类型赋值转换。这些转换其实跟调用构造函数的效果相同。
当内置类型向自定义类型中的内置类型发生转换时,会根据内置类型转内置类型的原则进行,即系统内部会做两次转换。如下图:
class A { A(int a) { } } int main() { //这种转换正常进行,系统内部做了两次转换。第一步内置类型转内置类型,即先将浮点型3.3转换成int型,然后再用int型传入构造函数进行定义类型转换。而指针型就不可以。 A x = 3.3; return 0; }
代码演练一:(单参构造函数)
#include <iostream> using namespace std; class A { public: A(int a) :_a(a) { } void Print() { cout << _a << endl; } private: int _a; }; int main() { A x1 = 5;//隐式类型转换为自定义类型对象 x1.Print();//输出5 }
代码演练二:(多参数带缺省)
#include <iostream> using namespace std; class Date { public: Date(int year = 2023, int month = 10, int day = 16) : _year(year) , _month(month) , _day(day) { } void Print() { cout << _year << "/" << _month << "/" << _day << endl; } private: int _year; int _month; int _day; }; int main() { //单个隐式转换 Date d1 = 5;//Date d1(5)的效果与之一样 //多个隐式转换 Date d2 = { 1,2,3 };//Date d2(1,2,3)的效果与之一样 //括号表达式的运用 Date d3 = (1, 2, 3);//等价于 Date d2 = 3; d1.Print();//输出5/10/16,属于单个隐式转换 d2.Print();//输出1/2/3,属于多个隐式转换 d3.Print(); return 0; }
C++不同类型转换--2 https://developer.aliyun.com/article/1424637?spm=a2c6h.13148508.setting.22.214f4f0eqBSn46