第六章习题

一、填空题


(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”,当分数不是最简形式时进行约分以及避免分母为负数。用重载函数运算符完成加法、减法、乘法以及除法等四则运算。

  1. #include<iostream>
  2. #include<cstdlib>
  3. using namespace std;
  4. int gcd(int m,int n)//求最大公约数函数
  5. {
  6. if (m < n)
  7. {
  8. int tmp = m;
  9. m = n;
  10. n = tmp;
  11. }
  12. if (n == 0)
  13. return m;
  14. else
  15. return gcd(n,m % n);
  16. }
  17. class fraction //构建分数类
  18. {
  19. int a,b;
  20. public:
  21. fraction( int x= 0, int y= 1) //构造函数
  22. {
  23. if(y== 0) //判断分母是否为0
  24. {
  25. cout<< "分母为零"<< endl;
  26. exit( 0);
  27. }
  28. if(y< 0) //分母小于0时将负号转移到分子上
  29. {
  30. a=( -1)*x;
  31. b=( -1)*y;
  32. }
  33. a=x;
  34. b=y;
  35. }
  36. fraction( const fraction&f) //拷贝构造
  37. {
  38. a=f.a;
  39. b=f.b;
  40. }
  41. ~fraction(){} //析构函数
  42. void setfraction(int x,int y)//在类外重新设置分数值
  43. {
  44. if(y== 0)
  45. {
  46. cout<< "分母为零"<< endl;
  47. exit( 0);
  48. }
  49. if(y< 0)
  50. {
  51. a=( -1)*x;
  52. b=( -1)*y;
  53. }
  54. a=x;
  55. b=y;
  56. }
  57. void show()//输出最简结果
  58. {
  59. int flag= 1,m;
  60. if(a< 0)
  61. {
  62. a=-a;
  63. flag=-flag;
  64. }
  65. if(b< 0)
  66. {
  67. b=-b;
  68. flag=-flag;
  69. }
  70. m=gcd(a,b);
  71. a=a/m;
  72. b=b/m;
  73. a=a*flag;
  74. if(a== 0||b== 1)
  75. cout<<a<< endl;
  76. else
  77. cout<<a<< "/"<<b<< endl;
  78. }
  79. friend fraction operator + (fraction & f1,fraction & f2 ) //以友元函数重载运算符
  80. {
  81. return fraction(f1.a * f2.b + f1.b * f2.a , f1.b * f2.b);
  82. }
  83. friend fraction operator - (fraction & f1,fraction & f2)
  84. {
  85. return fraction(f1.a*f2.b-f1.b*f2.a,f1.b*f2.b);
  86. }
  87. friend fraction operator * (fraction & f1,fraction & f2)
  88. {
  89. return fraction(f1.a*f2.a,f1.b*f2.b);
  90. }
  91. friend fraction operator / (fraction & f1,fraction & f2)
  92. {
  93. return fraction(f1.a*f2.b,f1.b*f2.a);
  94. }
  95. };
  96. int main()
  97. {
  98. int a,b;
  99. cout<< "请输入第一个分数的分子分母"<< endl;
  100. cin>>a>>b;
  101. int c,d;
  102. cout<< "请输入第二个分数的分子分母"<< endl;
  103. cin>>c>>d;
  104. fraction a1,a2,a3,a4,a5,a6;
  105. a1.setfraction(a,b);
  106. a2.setfraction(c,d);
  107. a3=a1+a2;
  108. cout<< "加法结果"<< endl;
  109. a3.show();
  110. a4=a1-a2;
  111. cout<< "减法结果"<< endl;
  112. a4.show();
  113. a5=a1*a2;
  114. cout<< "乘法法结果"<< endl;
  115. a5.show();
  116. a6=a1/a2;
  117. cout<< "除法法结果"<< endl;
  118. a6.show();
  119. return 0;
  120. }

运行结果:


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

(有理数)创建一个名为 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值