——C++不自动转换不兼容的类型,容许用户自定义类类型的自动和强制转换程序员
只接受一个参数的构造函数可做为转换函数(若其它参数都有默认值,则也符合状况)数组
class Stonewt { private: ... public: Stonewt (double lbs); {...} // template ofr double_-to-Stonewt conversion ... } ------------------------------------------------------------------>main() Stonewt myCat; // create a Stonewt object myCat = 19.6; // 隐式自动转换 use Stonewt(double) to convert 19.6 to Stonewt myCat = Stonewt (19.6); // 显示强制转换 myCat = (Stonewt) 19.6; // 显示强制转换
——特殊的C++运算符函数,是用户定义的强制类型转换,能够像使用强制类型转换那样使用它们。函数
operator typeName ();
例如,转换为double类型的函数的原型以下spa
operator double ();
cout<<"Poppins: "<<int (poppins)<<" pounds.\n"; // popins is object
cout语句使用显示强制类型转换code
cout<<"Poppins: "<<poppins<<" pounds.\n";
这里的cout应用自动类型转换对象
原则上说,最好使用显示转换,而避免隐式转换(发生意想不到的错误:1.如将对象错当数组下标并不会报错 2.友元函数的参数是两个类引用,传入值中一个是标准类型,一个是类对象,则会发生是将标准类型转换为类【前一种构造转换函数】仍是将类转换为标准类型【后一种转换函数】)。在C++98中,关键字explicit不能用于转换函数,但C++11消除了这种限制,使得只能显示转换,这样就规避了第二种错误,以及提醒程序员不要犯第一种错误。blog
class Stonewt { ... // conversion functions explicit operator int() const; explicit operator double() const; };
有了这些声明后,须要强制转换时将调用这些运算符ci
将类对象赋给typeName变量或将其强制转换为typeName类型时,该转换函数将自动被调用原型