原则5:谨慎定义类型转换函数

本院主要讨论的内容还是C++语言中的隐式类型转换是自发执行的,而你不想让C++本身擅自采取行动,于是你必须有意地控制这种行为。
C++中有两种隐式类型转换方式,第一是单参数类型转换函数,第二是隐式类型转换运算符。
单参数类型转换函数是类的构造函数,它只有一个参数,或者有n个参数,但是后面n-1个参数都有缺省参数。
隐式类型转换操作符在C++ Primer Plus中是显式调用的,不知道为什么在这里却成了隐式调用,它的作用很简单就是把类对象转换成某种类型,并且是隐式的。
解决由隐式类型转换运算符带来的问题很简单,就是你写一个函数,对象只有通过调用这个函数,才能完成类型转换。这有点类似于string类中的c_str()函数。
比较难解决是隐式类型转换构造函数。解决该问题有两个方法,其一是使用explicit关键字,即必须显式调用类型转换函数才行。



注意此时这个两个>之间必须有空格,不然C++会把它和>>操作符混淆。
其二,就是使用代理类,用这个代理类的对象作为类型转换函数的参数。代理类其实就是一个内嵌类,而且它必须是外套类的public成员,方便任何人都能使用它。
此时,类型转换函数的参数就会转换成代理类的对象,因为代理类里面也有个单参数构造函数,并且代理类里面还包含了一个返回大小的成员函数给外套类。看下图所示的例子:


原则5:谨慎定义类型转换函数_第1张图片

原则5:谨慎定义类型转换函数_第2张图片

现在我想研究一下书中给出的这个例子。从int转换成Array类型,需要的是Array(int)构造函数,但是现在Array没有这样的构造函数,所以这种转换无法进行。但是,我的问题来了,既然一个Array对象可以接受一个int作为初始化参数,并且这个参数可以传给ArraySize用来初始化ArraySize对象,那就是说int可以转换成ArraySize类型,又因为存在Array(ArraySize)构造函数,那么可以说int就可以转换成Array对象,但是为什么书上说转换不能成功呢?
事实如此,那么又该怎么解释呢?我想应该是作用对象的问题吧。当你使用数字初始化Array对象时,使用的是Array(int),而在Array类中却存在Array(ArraySize size)的构造函数,实际上使用int去初始化ArraySize类的对象,即,int转换成ArraySize,而这在ArraySize类中是有类型转换函数支持的。但是当你把一个int放在一个Array对象的位置上时,就是把int类型转换成Array类型,但是Array类中没有合适的类型转换函数支持。所以转换所涉及到的类型一定要搞清楚。类型转换是需要类型转换函数支持的。

多谢捧场

如果您觉得我的文章有价值,那么赏脸打赏一个,鄙人感激不尽。不过,不打赏看看也是好的,如果有不对的地方,还请您多多指正。


你可能感兴趣的:(原则5:谨慎定义类型转换函数)