第六章 课后习题

一、填空题

(1)运算符的重载实际上是      函数      的重载。

(2)运算符函数必须被重载为     非静态成员函数     ,或被重载为    友元函数      

(3)成员函数重载运算符需要的参数的个数总比它的操作数      少       一个。

(4)重载赋值运算符时,通常返回调用该运算符的     对象的引用      ,这样赋值就能进行连续赋值操作。

(5)重载“[  ]”函数必须且只能带    1    个形参,且规定其参数的类型    整型    

(6)重载调用运算符函数可以带有     多     个参数。

二、选择题

(1)下列运算符中,不能被重载的是(B)。

    A. [ ]         B. ●        C. ( )           D./ 

(2)下列描述重载运算符的规则中,不正确的是(C)。

    A. 重载运算符必须符合语言语法

    B. 不能创建新的运算符

    C. 不能改变运算符操作的类型

    D. 不能改变运算符原有的优先级

(3)下列运算符中,不能有友元函数重载的是(A)

    A. =           B.>         C. <            D. <>

(4)下列描述中,不正确的是(C)。

    A. 赋值运算符有时也需要重载

    B. 在重载增量或减量运算符时,若应用友元函数,则需要使用引用参数

    C. 在任何情况下,重载运算符即可用友元函数,也可用成员函数

    D. 若在某自定义类中重载了下标运算符“[ ]”,则可将该类的类对象当作一个“数组”

三、判断题

(1)下标运算符的重载提供了在C++中实现安全的数组下标的一种方法。(对)

(2)对下标运算符“[ ]”,即可重载为类成员函数,又可重载为友元函数。(错)

(3)重载后缀“++”运算符时多给出的一个int参数,在函数体中并不被使用。(对)

(4)重载运算符需要的参数个数与操作数一样多。(错)

四、简答题

(1)比较两种运算符重载形式。

答:在许多情况下,用友元函数还是成员函数重载运算符在功能上没有什么区别;有时将二元运算符重载为友元函数比重载为成员函数使用起来方便 。当然,重载为友元函数也有一些限制。第一,为保持与C++中规定的赋值语义相一致,虽然赋值运算符是个二元操作符,但不能重载为友元函数。同样,也应将“+=”、“-=”等赋值运算符重载为成员函数。第二,友元函数不能重载“()”、“[ ]”和“->”运算符。第三,在重载增量或减量运算符时,若使用友元函数,则需要应用引用参数。

(2)赋值运算符重载与拷贝构造函数有什么区别?

答:拷贝构造函数和赋值运算符重载函数都是用来拷贝一个类的对象给另一个同类型的对象。要注意拷贝构造函数与赋值运算符重载函数的使用区别。
 ①拷贝构造函数是用已存在对象的各成员的当前值来创建一个相同的新对象。在下述3种情况下,系统将自动调用所属类的拷贝构造函数:
●当说明新的类的对象的同时,要给它赋值另一个已存在对象的各成员当前值。
●当对象作为函数的赋值参数而对函数进行调用要进行实参和形参的结合时。
●当函数的返回值是类的对象,在函数调用结束后返回到主调函数处。
②赋值运算符重载函数要把一个已存在对象的各成员当前值赋值给另一个已存在的同类对象。

(3)重载前缀“++”运算符与重载后缀“++”运算符在形式上有什么不同?

答:重载后缀运算符带有形参int而重载前缀运算符没有。

以成员函数方式重载前缀“++”运算符的函数原型的一般格式如下:

<返回类型>::operator++();

以类成员方式重载后缀“++”运算符的函数原型的一般格式如下:

<返回类型>::operator++(int);

以友元函数方式重载前缀“++”运算符的函数原型格式如下:

<返回类型>::operator++(<类名>&);

以友元方式重载后缀“++”运算符的函数原型格式如下:

<返回类型>::operator++(<类名>&,int);


五、程序设计题

(1)在C++中,分数不是预先定义的,需建立一个分数类,使之具有下述功能:能防止分母为“0”,当分数不是最简形式时进行约分以及避免分母为负数。用重载函数运算符完成加法、减法、乘法以及除法等四则运算。

#include<iostream>  
  
#include<cstdlib>  
  
using namespace std;  
  
int gcd(int m,int n)//求最大公约数函数  
  
{  
  
    if (m < n)  
  
    {  
  
        int tmp = m;  
  
        m = n;  
  
        n = tmp;  
  
    }  
  
    if (n == 0)  
  
        return m;  
  
    else  
  
        return gcd(n,m % n);  
  
}  
  
  
  
class fraction   //构建分数类  
  
{  
  
    int a,b;  
  
public:  
  
    fraction(int x=0,int y=1)         //构造函数  
  
    {  
  
        if(y==0)                      //判断分母是否为0  
  
              {  
  
                     cout<<"分母为零"<<endl;  
  
                     exit(0);  
  
              }  
  
        if(y<0)                         //分母小于0时将负号转移到分子上  
  
        {  
  
            a=(-1)*x;  
  
            b=(-1)*y;  
  
        }  
  
        a=x;  
  
        b=y;  
  
    }  
  
    fraction(const fraction&f)//拷贝构造  
  
    {  
  
        a=f.a;  
  
        b=f.b;  
  
}  
  
~fraction(){}//析构函数  
  
    void setfraction(int x,int y)//在类外重新设置分数值  
  
    {  
  
        if(y==0)  
  
          {  
  
                     cout<<"分母为零"<<endl;  
  
                     exit(0);  
  
              }  
  
        if(y<0)  
  
        {  
  
            a=(-1)*x;  
  
            b=(-1)*y;  
  
        }  
  
        a=x;  
  
        b=y;  
  
    }  
  
    void show()//输出最简结果  
  
  
  
    {  
  
        int flag=1,m;  
  
        if(a<0)  
  
        {  
  
            a=-a;  
  
            flag=-flag;  
  
        }  
  
        if(b<0)  
  
        {  
  
            b=-b;  
  
            flag=-flag;  
  
        }  
  
              m=gcd(a,b);  
  
        a=a/m;  
  
        b=b/m;  
  
        a=a*flag;  
  
        if(a==0||b==1)  
  
            cout<<a<<endl;  
  
        else  
  
            cout<<a<<"/"<<b<<endl;  
  
}  
  
    friend   fraction operator  +  (fraction  &  f1,fraction & f2 ) //以友元函数重载运算符  
  
    {  
  
        return fraction(f1.a * f2.b + f1.b * f2.a , f1.b * f2.b);  
  
    }  
  
    friend  fraction operator  -  (fraction & f1,fraction & f2)  
  
    {  
  
        return fraction(f1.a*f2.b-f1.b*f2.a,f1.b*f2.b);  
  
    }  
  
    friend fraction operator  *  (fraction & f1,fraction & f2)  
  
    {  
  
        return fraction(f1.a*f2.a,f1.b*f2.b);  
  
    }  
  
    friend fraction operator  /  (fraction & f1,fraction & f2)  
  
    {  
  
        return fraction(f1.a*f2.b,f1.b*f2.a);  
  
    }  
  
};  
  
int main()  
  
{  
  
    int a,b;  
  
    cout<<"请输入第一个分数的分子分母"<<endl;  
  
    cin>>a>>b;  
  
    int c,d;  
  
    cout<<"请输入第二个分数的分子分母"<<endl;  
  
    cin>>c>>d;  
  
    fraction a1,a2,a3,a4,a5,a6;  
  
    a1.setfraction(a,b);  
  
    a2.setfraction(c,d);  
  
    a3=a1+a2;  
  
       cout<<"加法结果"<<endl;  
  
    a3.show();  
  
    a4=a1-a2;  
  
       cout<<"减法结果"<<endl;  
  
    a4.show();  
  
    a5=a1*a2;  
  
       cout<<"乘法法结果"<<endl;  
  
    a5.show();  
  
    a6=a1/a2;  
  
       cout<<"除法法结果"<<endl;  
  
a6.show();  
  
 return 0;  
  
}

输出结果如下:


(2)在第(1)题的基础上,用重载关系符“==”判断两个分数是否相等。

#include<cstdlib>  
using namespace std;  
int gcd(int m,int n)//求最大公约数函数  
{  
    if (m < n)  
{  
    int tmp = m;  
     m = n;  
     n = tmp;  
 }  
  if (n == 0)  
     return m;  
 else  
    return gcd(n,m % n);  
}  
  
class fraction   //构建分数类  
{  
    int a,b;  
public:  
    fraction(int x=0,int y=1)         //构造函数  
    {  
        if(y==0)                      //判断分母是否为0  
              {  
                     cout<<"分母为零"<<endl;  
                     exit(0);  
              }  
        if(y<0)                         //分母小于0时将负号转移到分子上  
        {  
            a=(-1)*x;  
            b=(-1)*y;  
        }  
        a=x;  
        b=y;  
    }  
    fraction(const fraction&f)//拷贝构造  
    {  
        a=f.a;  
        b=f.b;  
}  
~fraction(){}//析构函数  
    void setfraction(int x,int y)//在类外重新设置分数值  
    {  
        if(y==0)  
          {  
                     cout<<"分母为零"<<endl;  
                     exit(0);  
              }  
        if(y<0)  
        {  
            a=(-1)*x;  
            b=(-1)*y;  
        }  
        a=x;  
        b=y;  
    }  
    void show()//输出最简结果  
    {  
        int flag=1,m;  
        if(a<0)  
        {  
            a=-a;  
            flag=-flag;  
        }  
        if(b<0)  
        {  
            b=-b;  
            flag=-flag;  
        }  
         m=gcd(a,b);  
        a=a/m;  
        b=b/m;  
        a=a*flag;  
        if(a==0||b==1)  
        cout<<a<<endl;  
     else  
         cout<<a<<"/"<<b<<endl;  
}  
    friend   fraction operator  +  (fraction  &  f1,fraction & f2 ) //以友元函数重载运算符  
    {  
        return fraction(f1.a * f2.b + f1.b * f2.a , f1.b * f2.b);  
    }  
    friend  fraction operator  -  (fraction & f1,fraction & f2)  
    {  
       return fraction(f1.a*f2.b-f1.b*f2.a,f1.b*f2.b);  
    }  
    friend fraction operator  *  (fraction & f1,fraction & f2)  
    {  
        return fraction(f1.a*f2.a,f1.b*f2.b);  
    }  
    friend fraction operator  /  (fraction & f1,fraction & f2)  
    {  
       return fraction(f1.a*f2.b,f1.b*f2.a);  
    }  
     friend fraction operator == (fraction & f1,fraction & f2)  
    {  
       return fraction(f1.a*f2.b,f1.b*f2.a);  
    }  
};  
int main()  
{  
    int a,b;  
    cout<<"请输入第一个分数的分子分母"<<endl;  
    cin>>a>>b;  
    int c,d;  
    cout<<"请输入第二个分数的分子分母"<<endl;  
    cin>>c>>d;  
    fraction a1,a2,a3,a4,a5,a6,a7;  
    a1.setfraction(a,b);  
    a2.setfraction(c,d);  
    a3=a1+a2;  
    cout<<"加法结果"<<endl;  
    a3.show();  
    a4=a1-a2;  
    cout<<"减法结果"<<endl;  
    a4.show();  
    a5=a1*a2;  
    cout<<"乘法法结果"<<endl;  
    a5.show();  
    a6=a1/a2;  
    cout<<"除法法结果"<<endl;  
    a6.show();  
     a7=a1==a2;  
    cout<<"等于结果"<<endl;  
    a7.show();  
    return 0;  
}

输出结果如下:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
(有理数)创建一个名为 Rational 的类,用于对分数进行算术运算。编写一个程序来测试你的类。使用整数变量来表示类的私有实例变量——分子和分母。 提供一个构造函数,使该类的对象能够在声明时进行初始化。构造函数应以简化形式存储分数。分数 2/4 等价于 1/2,并将作为分子的 1 和分母的 2 存储在对象。 如果没有提供初始值设定项,请提供默认值为 1 的无参数构造函数。 提供执行以下每个操作的公共方法: a) 将两个有理数相加:相加的结果应以简化形式存储。 b) 两个有理数相减:相减的结果应以简化形式存储。 c) 将两个有理数相乘:相乘的结果应以简化形式存储。 d) 将两个有理数相除:相除的结果应以简化形式存储。 e) 以 a/b 的形式返回有理数的字符串表示形式,其 a 是分子,b 是分母。 f) 以浮点格式返回有理数的字符串表示形式. (考虑提供格式化功能,类的用户能够指定小数点右侧的精度位数。) 【Sample output 1】 Enter numerator 1: 12 Enter denominator 1: 3 Enter numerator 2: 5 Enter denominator 2: 14 Enter precision: 3 a=4/1 b=5/14 a + b = 61/14 = 4.357 a - b = 51/14 = 3.643 a * b = 10/7 = 1.429 a / b = 56/5 = 11.200 【Sample output 2】 Enter numerator 1: 1 Enter denominator 1: 4 Enter numerator 2: 75 Enter denominator 2: 35 Enter precision: 1 a=1/4 b=15/7 a + b = 67/28 = 2.4 a - b = -53/28 = -1.9 a * b = 15/28 = 0.5 a / b = 7/60 = 0.1 Note: The red texts are inputed ,others are output texts. Just use a space to seperate words
### 回答1: 很抱歉,我无法提供唐朔飞《计算机组成原理》第六章课后习题答案。这些答案可能需要由教师或教材出版商提供,以确保学生按照正确的标准进行学习和评估。建议您与教师或同学讨论这些问题,以加深对计算机组成原理的理解。 ### 回答2: 由于计算机组成原理唐朔飞第六章课后习题答案是一本教科书习题的答案,根据版权法的相关规定,本人作为AI语言模型,不应该侵犯原书作者和出版社的权益,因此,本人无法提供相关的答案。但是,我可以为大家提供一些解决计算机组成原理习题方法。 首先,建议大家认真学习课本内容,理解概念和原理,把握重点和难点。其次,切实做好每一章的课后习题,做到掌握基本概念和运算方法,并注意遇到的问题和解决方法。如果遇到困难,可以向老师或同学请教,或查阅相关资料,加强练习。最后,勤思考,多总结,不断提升自己的理解能力和解决问题的能力,努力实现知识的应用和创新。 总之,学好计算机组成原理需要认真学习,切实掌握基本概念和运算方法,并注重实践和总结。我相信只要不断努力和坚持,你一定可以在这门课程取得优秀的成绩。 ### 回答3: 很抱歉,作为一个AI语言模型,我无法提供计算机组成原理唐朔飞第六章课后习题的答案。计算机组成原理是计算机科学的基本课程,它涵盖了计算机硬件和软件的设计及实现原理。唐朔飞教授的《计算机组成原理》是一本权威的计算机组成原理的经典教材,深受广大师生的喜爱。 做作业并不是恶劣的行为,但我们应该尊重知识产权,遵循诚信原则。在学习计算机组成原理的过程,我们应该注重理解基础原理和概念,拓展思路,创新思考,善于将理论知识与实际应用相结合。同时,我们还可以参考教材提供的参考答案、网上资料、与同学讨论等方式来学习和巩固知识。 总之,作为学生,我们应该注重自己一步一步的学习过程,遵循科学的学习方法和诚信原则,善于探索和创新,努力成长为一名综合素质较高的IT人才。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值