C++虽然是强类型语言,但是却还不如Java、C#那么足够的强类型,原因是允许的隐式转换太多
从C语言继承下来的基本类型之间的隐式转换
T*指针到void*的隐式转换
non-explicit constructor 接受一个参数的隐式转换
从子类到基类的隐式转换(安全)
从const到non-const的同类型的隐式转换(安全)
除开上面的五种隐式转换外,C++的编译器还非常聪明,当没法直接隐式转换的时候,它会尝试间接的方式隐式转换,这使得有时候的隐式转换非常的微妙,一个误用会被编译器接受而会出现意想不到的结果。例如假设类A有一个non-explicit constructor,唯一的参数是类B,而类B也有一个non-explicit constructor接受类型C,那么当试图用类型C的实例初始化类A的时候,编译器发现没有直接从类型C构造的过程,但是呢,由于类B可以被接受,而类型C又可以向类型B隐式转换,因此从C->B->A的路就通畅了。这样的隐式转换多数时候没什么大碍,但是不是我们想要的,因为它可能造成一些微妙的bug而难以捕捉。
阅读全文>
发表于 @ 2007年05月07日 11:11:00|评论(loading...)|收藏