C++实验21 运算符重载

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档