一、类型转换函数(上)1.再论类型转换标准数据类型之间会进行隐式的类型安全转换转换规则如下下面来看一个有趣的隐式类型转换1234567891011121314151617181920212223#include iostream#include stringusingnamespacestd;intmain(){shorts a;unsignedintui 1000;inti -2000;doubled i;cout d d endl;cout ui ui endl;cout ui i ui i endl;if( (ui i) 0 ){cout Positive endl;}else{cout Negative endl;}cout sizeof(s b) sizeof(s b) endl;return0;}输出结果如下ui 为 unsigned int 类型i 为 int 类型将两者进行相加编译器会进行隐式的类型转换全部变成unsigned int 类型所以最后的运行结果是正数。s 和 b 编译器都被编译器转换成 int 类型因为 int 类型的运算是最高效的。2.问题普通类型与类类型之间能否进行类型转换类类型之间能否进行类型转换3.再论构造函数构造函数可以定义不同类型的参数参数满足下列条件时称为转换构造函数有且仅有一个参数参数是基本类型参数是其它类类型4.另一个视角旧式的 C 方式强制类型转换5.编译器的行为编译器会尽力尝试让源码通过编译编译器尽力尝试的结果是隐式类型转换隐式类型转换会让程序以意想不到的方式进行工作是工程中 bug 的重要来源工程中通过 explicit 关键字杜绝编译器的转换尝试转换构造函数被 explicit 修饰时只能进行显示转换转换方式下面来看一个普通类型向类类型的转换12345678910111213141516171819202122232425262728293031323334#include iostream#include stringusingnamespacestd;classTest{intmValue;public:Test(){mValue 0;}explicitTest(inti){mValue i;}Test operator (constTest p){Test ret(mValue p.mValue);returnret;}intvalue(){returnmValue;}};intmain(){Test t;t static_castTest(5);// t Test(5);Test r;r t static_castTest(10);// r t Test(10);cout r.value() endl;return0;}输出结果如下6.小结(上)转换构造函数只有一个参数转换构造函数的参数类型是其它类型转换构造函数在类型转换时被调用隐式类型转换是工程中 bug 的重要来源explicit关键字用于杜绝隐式类型转换二、类型转换函数(下)1.类型转换类类型是否能够类型转换到普通类型C 类中可以定义类型转换函数类型转换函数用于将类对象转换为其它类型语法规则下面来看一个类型转换函数12345678910111213141516171819202122232425262728#include iostream#include stringusingnamespacestd;classTest{intmValue;public:Test(inti 0){mValue i;}intvalue(){returnmValue;}operatorint(){returnmValue;}};intmain(){Test t(100);inti t;cout t.value() t.value() endl;cout i i endl;return0;}int i t; 等价于int i t.operator int ();类型转换函数与转换构造函数具有同等的地位使得编译器有能力将对象转化为其它类型编译器能够隐式的使用类型转换函数2.编译器的行为编译器会尽力尝试让源码通过编译3.注意事项无法抑制隐式的类型转换函数调用类型转换函数可能与转换构造函数冲突工程中以 Type toType() 的公有成员代替类型转换函数下面看类类型之间的转换123456789101112131415161718192021222324252627282930313233343536373839#include iostream#include stringusingnamespacestd;classTest;classValue{public:Value(){}explicitValue(Test t){}};classTest{intmValue;public:Test(inti 0){mValue i;}intvalue(){returnmValue;}Value toValue(){Value ret;cout operator Value() endl;returnret;}};intmain(){Test t(100);Value v t.toValue();return0;}输出结果如下注意类型转换函数可能与转换构造函数冲突所以 explicit Value(Test t) { } 加了一个 explicit如果不加编译器可能会报错。4.小结(下)C 类中可以定义类型转换函数类型转换函数用于将类对象转换为其它类型类型转换函数与转换构造函数具有同等的地位工程中以 Type toType() 的公有成员代替类型转换函数