练习14.44
编写一个简单的桌面计算器使其处理二元计算
double add(double a,double b) { return a+b; } auto subtra=[](double a,double b){return a-b; }; struct multi{ double operator()(double a,double b) { return a*b; } }; auto divide=[](double a,double b){return a/b; }; //auto mod=[](double a,double b){return a%b; //}; int main() { map<string,function<double(double,double)>> ope; ope["+"]=add;ope["-"]=subtra;ope["*"]=multi();ope["/"]=divide; string chart="-"; double a=9,b=5; cout<<"first number"<<endl; while(cin>>a) { cout<<"operator"<<endl; cin>>chart; cout<<"second number"<<endl; cin>>b; cout<<ope[chart](a,b)<<endl; cout<<"first number"<<endl; } }
练习14.45
编写类型转换运算符将一个Sales_data对象分别转换成string和double,你认为这些运算符的返回值应该是什么
operator double()const{return revenue;} operator std::string()const{return isbn;}
返回值可能是利润和isbn吧
练习14.46
你认为应该为Sales_data类定义上面的类型转换符?应该把它们声明成explicit吗?为什么
::没什么必要,完全可以让成员函数代替,但是如果设置了可能声明成explicit会好点,但是没有益处,还是繁琐
练习14.47
说明下面这两个类型转换运算符的区别
struct Integral {
operator const int();转换成const int
operator int() const;将this设置成const
}
练习14.50
在初始化ex1和ex2的过程中,可能用到哪些类类型的转换序列呢?说明初始化是否正确并解释原因
struct Longdouble
{LongDouble(double=0.0);
operator double();
operator float ();
};
LongDouble ldobj;
int ex1=ldobj;两种类型转换都可能,存在二义性
float ex2=ldobj;第二种类型转换
练习14.51
在调用calc的过程中,可能用到哪些类型转换序列呢?说明最佳可行函数是如何被选出来的
void calc(int){ }; void calc(LongDouble); double dval; int main(){ calc(dval); return 0; }
::优先标准库定义的类型转换
练习14.52
在下面的加法表达式中分别选择了哪个operator+?列出候选函数、可行函数及为每个可行函数的实参执行的类型转换:
struct LongDouble{ LongDouble(double=0.0){std::cout<<"1"<<std::endl;} operator double()const; operator float()const; LongDouble operator+(const SmallInt&); }; LongDouble operator+(LongDouble&,double); int main(){ SmallInt si; LongDouble ld; //ld=si+ld; ld=ld+si; }
第一个表达式存在二义性,SmallInt不可以转换成double,而LongDouble可以转换成float和double,标准库的加运算有二义性(int,double)(int,float)
第二个表达式可以通过成员运算符直接运算
练习14.53
假设我们已经定义了SmallInt,判断下面的加法表达式是否合法。如果合法,使用了哪个加法运算符?
SmallInt sl;
double d=sl+3.14;
既可以转换成成员运算,也可以转换成标准库运算,存在二义性,改成double d=sl+SmallInt(3.14);
标签:类型转换,return,int,double,练习,53,operator,primer,14.44 From: https://www.cnblogs.com/yddl/p/16597910.html