C++primer练习14.1-9

练习14.1

在什么时候情况下重载的运算符与内置运算符有所区别?在什么时候重载的运算符又与内置运算符一样

::为类设计的运算符,尽量重载的运算符含义不要改变,如+还是加法

练习14.2

为Sales_data编写重载的输入,输出,加法和复合赋值运算符

    std::istream& operator>>(std::istream& in,Sales_data&a)
        {
            double p;
            in>>a.isbn>>a.units_sold>>p;
            a.revenue=(a.units_sold*p);
            return in;
        }
        std::ostream& operator<<(std::ostream& ot,Sales_data&a)
        {
            ot<<a.isbn<<a.units_sold<<a.revenue<<std::endl;
            return ot;
        }
Sales_data operator+(Sales_data&a,Sales_data&b)
{
    Sales_data c;
    if(a.isbn==b.isbn){
    c.units_sold=(a.units_sold+b.units_sold)/2;
    c.revenue=a.revenue+b.revenue;}
    return c;
}
Sales_data& operator+=(Sales_data&a)
        {
            if(isbn==a.isbn)
            {
                units_sold=(units_sold+a.units_sold)/2;
                revenue=revenue+a.revenue;
            }
            return *this;
        }

练习14.3

string和vector都定义了重载的==以比较各自的对象,假设svec1和sevc2是存放string的vector,确定下面的表达式分别使用了哪个版本的==?

(a)"cobble" == "stone"内置的

(b)svec1[0]==svec2[0] string的

(c)svec1==svec2 vector的

(d) "svec1[0] =="stone" string的

练习14.4

如何确定下列运算符是否是类的成员?

(a)%非成员

(b)%=成员

(c)++成员

(d)->成员

(e)<<成员

(f)&&非成员且不该重载

(g)==非成员

(h)()不该重载

当运算符是二元且位置可以对称进行调换就设非成员

练习14.5

在之前编写了下列类的某一个框架,请问在这个类应该定义重载运算符吗?如果是,请写出

(a) Book::输出,输入

(b)Date::输出,输入,赋值

(c)Employee::输出,输入

其它不建议

练习14.6

为Sales_data添加输出运算符

看14.2

练习14.7

为String类定义输出运算符

ostream& operator<<(ostream& ot,String&a)
{
    for(auto d=a.elements;d!=a.first_free;++d)
    ot<<*d;
return ot; }

练习14.8

为你曾经选择的类,定义输出运算符

如(14.7)

练习14.9

 

为你的Sales_data定义输入运算符

 std::istream& operator>>(std::istream& in,Sales_data&a)
        {
            double p;
     
      in>>a.isbn>>a.units_sold>>p;
         if(in)
            {
            a.revenue=(a.units_sold*p);
            return in;}
      else
        {a=Sale_data();
        return in;}
}
posted @ 2022-08-17 10:48  yddl  阅读(24)  评论(0编辑  收藏  举报