在C++语言中,某些类型之间有关联,即可以相互转换。这些类型转换有时是自动执行的,无须程序员的介入,有时甚至不需要程序要了解。被称为“隐式转换”。
在下面这些情况下,编译器会自动地转换运算对象的类型:
1.在大多数表达式中,比int类型小的整型值首先提升为较大的整数类型。
2.在条件中,非布尔值转换成布尔值。
3.初始化过程中,初始值转换成变量的类型;在赋值语句中,右侧运算对象转换成左侧运算对象的类型。
4.如果算术运算或关系运算的运算对象有多种类型,需要转换成同一种类型。
5.函数调用。
6.数组转化成指针。
7.指针的转换:常量整数值0或者字面值nullptr能转换成任意指针类型。指向任意非常量的指针能转换成void*;指向任意对象的指针能转换成const void*。
8.转换成布尔类型:存在一种从算术类型或指针类型向布尔类型自动转换的机制。值为0转换成FALSE;否则转换成ture。
9.转换成常量:允许将指向非常量类型的指针转换成指向相应的常量类型的指针,对于引用也是这样。
10.类类型定义的转换:如果构造函数只接受一个实参,则它实际上定义了转换为此类型的隐式转换机制,有时我们把这种构造函数称作转换构造函数。在要求隐式转换的程序上下文中,我们可以通过将构造函数声明为explicit加以阻止。被声明为explicit的构造函数通常比其non-explicit兄弟更受欢迎,因为它们禁止编译器执行非预期的类型转换。除非我有一个好理由允许构造函数被用于隐式类型转换,否则应该把它声明为explicit。