C++primer练习14.44-53

练习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);

 

posted @ 2022-08-18 10:46  yddl  阅读(24)  评论(0编辑  收藏  举报