type
status
date
slug
summary
tags
category
icon
password
隐式转换在C++代码中使用的十分频繁,可以完成变量类型的转换,并且不需要在代码层面指定具体的转换方案,编译器可以根据变量的类型进行直接转换。
隐式转换的几种类型
1.混合函数运算
这种情况下编译器会将a自动转换成float类型后再进行计算
2.不同类型的赋值
这种情况下编译器会将a转成float类型后再进行计算;
3.函数的传参与返回
这种情况下,编译器会将1转换成浮点后再传入到函数中,同样的,最后返回a的结果也会将a转换成浮点类型。
上述的三种情况都是隐式的改变参数的类型,而且都是int→float的转化,总的来说,编译器会在适合的时候做小精度→大精度的转换,这样不会导致精度的缺失。如果想要完成大精度→小精度的转换,一般只能使用显式强制转换,这样会导致精度的流失。
类中的隐式转换
在主函数中采用了三种方法创建了三个类,其中前两种是比较常见的方法。第三种很特别的是直接将1赋值给了一个test类a,这种方法也是可以正常实现的。它将1隐式地转换成了test类,构造出一个test类后将1参数传入到构造函数中。
这种方法使用的条件是类是单参数的构造函数或者是函数的其他参数都是缺省值。
还有一个需要注意的点是,隐式转换只能完成一步转换,上述代码的第4步是无法正常编译的,需要显示地转换成int类型后才可以正常编译。
类型转换函数
在上面的主函数中test的对象a直接和1.5相加,正常来说这样是不能正常编译的。但是编译器遇到这种情况时会在类函数中寻找转换函数,编译器会根据operator double()将a转换成double类型后进行计算。
转换函数的一般形式为:
转换函数必须是类的成员函数;转换函数不声明返回类型;形参列表必须为空;转换函数一般时const的。
explicit关键字
隐式转换的存在能够帮助我们直接完成一些变量的类型转换,但是有时候隐式转换会给我们带来一些出乎意料的问题。比如说我需要传入的的参数是test的实例变量,但是写错传成了一个数字,由于隐式转换的规则,这个代码还是会正常的编译运行。要写避免这样的问题,只需要将构造函数的前面加上explicit关键字即可。一般来说转换函数不需要加explicit关键字,构造函数特别是单值的构造函数需要加上explicit关键字来防止意外的发生。同时当多种情况出现时,选择性的加上explicit关键字可以防止二义性的发生,让代码按照我们预期的运行。
平和而执着,谦虚而无畏
- 作者:枝江嘉然
- 链接:https://tangly1024.com/article/87761125-d647-4526-89c6-179ad9e59132
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。