C++primer练习14.10-23

练习14.10

对于Sales_data的输入运算符来说给定下面的输入会发生什么?

(a)0-201-99999-9 10 24.95正常输入

(b)10 24.95 0-210-99999-9最后一个输入格式错误,会chongz

练习14.11

下面的Sales_data输入运算符存在错误吗?如果执行上面的输入会发生什么

istream& operator>>(istream& in,Sales_data& s)

{
double price ;

in>>s.bookNo>>s.units_sold>>price;

s.revenue=s.units_sold*price;

return in;}

错误的输入无法处理,且s的数据不匹配

练习14.13

你认为Sales_data类还应该支持哪些其他算术运算符?如果要的话请给出定义

::可以定义利润关系运算符

bool operator<(const Sales_data&a,const Sales_data&b)
{
    return a.revenue<b.revenue;
}

bool operator>(const Sales_data&a,const Sales_data&b)
{
    return a.revenue>b.revenue;
}
bool operator==(const Sales_data&a,const Sales_data&b)
{
    return a.revenue==b.revenue;
}

练习14.14

你觉得为什么调用operator+=来定义operator+比其他方法有效

::不用记那么多名字,运算符都是约定俗成的

练习14.16

为你的String类定义相等运算符和不相等运算符

bool operator==(const String&a,const String&b)
{
    return a.elements==b.elements&&a.first_free==b.first_free&&a.cap==b.cap;
}

bool operator!=(const String&a,const String&b)
{
    return !(a==b);
}

练习14.18

为你的String类定义关系运算符

bool operator<(const String&a,const String&b)
{
    return a.size()<b.size();
}
bool operator>(const String&a,const String&b)
{
    return a.size()>b.size();
}

练习14.20

为你的Sales_data类定义加法和复合赋值运算符

Sales_data& operator+=(Sales_data&a)
        {
            if(isbn==a.isbn)
            {
                units_sold+=a.units_sold;
                revenue+=a.revenue;
            }
            return *this;
        }
        

练习14.21

编写Sales_data类的+和+=运算符,使得执行实际的加法操作而+=调用+。相比于内置的,本题的有何缺点?

::会有多余开销,且没有益处

练习14.22

定义赋值运算符的一个新版本,使得我们能把一个表示ISBN的string赋值给一个Sales_data对象

    Sales_data& operator=(const std::string&a)
        {
            isbn=a;
            return *this;
        }

练习14.23

为你的StrVec类定义一个initializer_list赋值运算符

inline StrVec& StrVec::operator=(std::initializer_list<std::string> il)
{
    auto newdata = alloc_n_copy(il.begin(), il.end());
    free();
    elements = newdata.first;
    first_free = cap = newdata.second;
    return *this;
}

 

posted @ 2022-08-17 14:14  yddl  阅读(21)  评论(0编辑  收藏  举报