隐式的类类型转换和类型转换运算符在一定程度上可以看做互为逆运算。
(1)隐式的类类型转换:
如果构造函数只接受一个实参,则实际上定义了转换为此类型的隐式转换机制,有时我们也称这样的构造函数为转换构造函数。这句话的意思也就是,在需要使用此类类型的地方,我们可以使用实参类型代替,但是有约束条件:只有实参类型经过一步类型转就能转换为类类型才可以替代。
不过有时着并不是我们所需的,下面是抑制隐式类类型转换的措施:
在类构造函数声明时,在函数的前面加上关键字explicit(此关键字只允许出现在类内,同virtual)。
explicit构造函数只能抑制拷贝初始化而不能抑制直接初始化。
(2)类类转化运算符型:
类型转换运算符是类的一种特殊成员函数,它负责将一个类类型的值转换为其他类型,格式如下:operator type()const{.......},例 operator int() const {return val};
类型转换运算符没有显式的返回类型,也没有形参。类型转换运算符可以面向任何类型(除了void),只要此类型能作为函数的返回类型。因此,我们不允许转换为数组或者函数类型,但可以转换为指针(包括数组指针及函数指针)或引用类型。
由于类型转换运算符可能产生意想不到的错误,为了防止异常情况发生,C++11新标准引进了显示的类型转换运算符,也是加关键字explicit。和显示的构造函数一样,编译器(通常)也不会将一个显示类型转换运算符用于隐式类型转换。
当类型转换运算符是显示时,我们也执类型转换,不过必须通过显示的强制类型转换才可以。
不过该规定也存在例外,即如果表达式被用作条件,则编译器将会将显示的类型转换自动应用于它。换句话说,当表达式出现在下列位置时,显示的类型转换将发生隐式的执行:
A.if,while,do的条件部分
B.for语句头的条件表达式
C. (!)(||)(&&)逻辑运算符的运算对象
D.条件语句(? :)的条件表达式。