C++实验21 运算符重载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验21 运算符重载
一、实验目的和要求
1.理解运算符重载的作用。
2.掌握实现运算符重载的方法及几种特殊运算符的重载格式。
3.进一步锻炼针对类的编程能力。
二、实验准备
☞知识点
1.运算符重载定义的一般格式、基本概念。
2.运算符函数重载的两种形式。
3.通过成员函数实现运算符重载的一般格式。
4.通过友元函数实现运算符重载的一般格式。
5.”++”运算符的重载。
6.”=”赋值运算符的重载。
☞课前练习题
1.重载运算”+”,实现a+b运算,则。
A.a必须为对象,b可为整数或实数B.a和b必须为对象
C.b必须为对象,a可为整数或实数D.a和b均可为整数或实数
2.在C++中,运算符的重载有两种实现方法,一种是通过成员函数来实现,另一种则通过_________来实现。
3.不能重载的5个运算符是:______、______、______、______、_________。
4.重载赋值运算符必须通过________函数实现。
5.用成员函数实现前置”--”运算符重载的一般格式为:_______________________________。6.用友元函数实现后置”--”运算符重载的一般格式为:_______________________________。
☞分析
1.有以下程序:
#include
class C{
private:
double x;
public:
C( ) { x=0.0; }
C(double a) { x=a; }
friend C operator--(C t) //行A
{
t.x--;
return t;
}
void show(){cout< }; void main() { C c(5.6); (--c).show(); //行B c.show(); //行C } 请回答问题: ①从行A 的形式上看,这是利用________函数实现__________运算符的重载。 ②行B 的输出结果:_________,行C 的输出结果:_________。 ③上机验证输出结果,并且回答行B 和行C 的输出结果一样吗?为什么? 2.已知C 为某类名,以下是”+”和”+=”的运算符重载函数。 C C:: operator+(C &m ) //利用成员函数重载 { C temp; temp.x=x+m.x; return temp; //行A } friend C operator+(C &m1, C &m2 ) //利用友元函数重载 { C temp; temp.x=m1.x+m2.x; return temp; //行B } C &C:: operator+=(C &m ) //利用成员函数重载 { x+=m.x; return *this; //行C } 要求: ①三个函数参数均为对象的引用(也可不用引用),请解释这样做的好处? _____________________________________________________________。 ②行A 和行B 为何不写成:return *this; ,如行C ? __________________________________________________________________________。 三、实验内容 1.定义一个类MatrixAdd ,其数据成员为一个M*N 的矩阵(即二维数组),其中M 和N 是两个预先定义的符号常数。通过重载运算符”+”和”=”,实现矩阵相加和赋值运算。如定义矩阵A=⎥⎦⎤⎢⎣⎡654321和B=⎥⎦⎤⎢⎣⎡333222,通过运算C=A+B ,得到结果矩阵C=⎥⎦⎤⎢⎣⎡987543。 具体要求如下: (1)私有数据成员 int a[M][N]:存放二维数组值。 (2)公有成员函数 ● MatrixAdd ( ):缺省构造函数,空操作。 ● MatrixAdd ( int x[M][N]):构造函数,用x 初始化数据成员a 。 ● MatrixAdd operator+(MatrixAdd &b):重载加法运算符”+”,实现两个矩阵相加。 ● void operator=(MatrixAdd &b):重载赋值运算符”=”,实现两个矩阵赋值。 ● void show( ):按二维方式输出a 数组。 (3)在主函数中完成对该类的测试。注意:在程序的开头,定义符号常数M 和N 的值分别为2和3,表示二维数组的行数和列数。在主函数中定义整型数组a[M][N]和b[M][N],它们的初值取上述示例值。定义三个Matrix 类的对象A 、B 和C ,并用数组a 和b 初始化对象A 和B 。将A 加B 后赋值给C 。然后输出对象C 的数据成员a 矩阵的值。 2.建立分数类Fraction ,用于表示最简分数。最简分数为分子分母没有公约数的分数。该分数类重装运算符+和-,分别实现两个分数的加法和减法。具体要求如下: (1)私有数据成员 ● int m :分子。 ● int n :分母。 (2)公有成员函数 ● Fraction(int _m,int _n):构造函数,用_m 、_n 分别初始化m 、n ,同时对分数进行约简,使其成为最简分数。 ● int gcd(int x,int y):求x 和y 的最大公约数(对分数进行约简时用到),注意结果要为正数。 ● Fraction operator+(Fraction &b):重载双目加法运算。 ● Fraction operator-(Fraction &b):重载双目减法运算。 ● void show():输出分数,格式为m/n 。 (3)在主函数中完成对该类的测试。定义分数a 和b ,其初值分别为-1/3与6/12,求出它们的和与差并分别赋值给分数c 和d ,最后输出c 和d 。正确的运行结果为: 1/6 -5/6 3.设a 为M 行N 列的二维数组,编程将a 中的每个元素向右移动一列,最右一列换到最左一列,移动后的数组仍然存放在a 中,试建立一个类TDarray ,完成以上操作。例如,原始数组以及移动元素之后的数组如下: 具体要求如下: (1)私有数据成员 ● int a[M][N]:存入二维数组的值,M 、N 为预定义的符号常量。 (2)公有成员函数 ● TDarray(int x[M][N]):构造函数,用x 数组初始化数组a 。 ● void move():将数组a 的每个元素向右移动一列。 ● void print():按矩阵方式输出数组a 。 (3)在主函数中完成对该类的测试。在程序的开头定义符号常数M 和N 的值分别为3和4。在主函数中定义二维数组int x[M][N],用以上数据赋初值。定义一个TDarray 类的对象arr , 1 2 3 5 6 7 9 10 11 1 2 3 4 5 6 7 8 9 10 11