大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。
<1>转换操作符
operator type();
转换功能必须是一个类的成员函数,你不能指定返回类型。形參列表必须为空,而且通常不应该改变转换对象。所以操作符通常定义为const成员。
#include <iostream> using namespace std; class SmallInt { public: SmallInt(int i=0):val(i) { if(i<0 || i>255) throw std::out_of_range("Bad SmallInt initializer");} ~SmallInt(void){}; operator int()const {std::cout<<"Translate SmallInt to Int"<<endl;return val;} private: size_t val; };
<2>2级转换
我们在SmallInt中指定的转换是int。可是SmallInt能够间接的转换为其它标准类型如double,float等
SmallInt sm; double dv; sm >= dv //sm convet to int and then convert to double if(sm) //sm convet to int and then convert to bool int x = static_cast<int>(si) + 2; // instruct compiler SmallInt to int
<3>禁止转换
如果另一个类Integral,它能够转换为SmallInt。可是它不能发生2级变换从Integral转换成SmallInt然后再转换成int类型。
int cal(int); Integral intVal; cal(intVal); //error,no convertion to int from Integral
总之:
SmallInt ->standard type ->standard type //ok standard type ->standard type->SmallInt //ok Integral->SmallInt->Int //error
在转换中仅仅能用到一个类类型转换(类类型<->标准类型。类类型<->类类型
<4>不要在一个类中指定多个类类型转换
这样可能会引起在一些转换时候的二义性。
class SmallInt { public: SmallInt(int i=0):val(i){ if(i<0 || i>255) throw std::out_of_range("Bad SmallInt initializer");} SmallInt(double db):val(db){} ~SmallInt(void){}; operator int()const{std::cout<<"Translate SmallInt to Int"<<endl;return val;} operator double()const{std::cout<<"Translate SmallInt to double"<<endl;return val;} private: size_t val; }; void fpComputer(float) {} SmallInt sm(100); fpComputer(sm) //error
<5>构造函数转换二义性
void manip(const SmallInt&); double d; int i; float f; mamip(d); //ok,use SmallInt(double) to convert manip(i); //ok,use SmallInt(int) to convert manip(f); //error,ambiguous
<6> 构造函数转换和类类型转换同一时候存在时候的二义性
class Integral; class SmallInt { public: SmallInt(Integral); //... }; class Intergal { public: operator SmallInt()const; //... } void compute(SmallInt); Integral intVal; compute(intVal); //error:ambiguous
这里的Integral类型的变量intVal能够通过构造函数以及类类型转换两种方式转换成SmallInt。所以具有二义性
。详细的解决方法是通过显式方式调用例如以下所看到的:
compute(intVal.operator SmallInt()); compute(SmallInt(intVal));
版权声明:本文博主原创文章,博客,未经同意不得转载。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/116820.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...