C++实验21 运算符重载
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
char s1[80],s2[80]:存放两个原始字符串。 char s3[160]:存放结果字符串。 (2)公有成员函数 ComposeStr (char a[ ], char b[ ]):构造函数,用字符串参数 a 和 b 分别初始化数据成员 s1 和 s2。 void compose( ):合并字符串后存入 s3。 void asort( ):对 s3 中的字符升序排序。 void show( ):输出两个原始字符串和结果字符串。 (3)在主程序中定义两个字符数组 char a[80],b[80],任意输入两个字符串,再定义一个 ComposeStr 类的对象 str,用字符串 a 和 b 初始化该对象,然后按上述要求测试该类。
temp.x=m1.x+m2.x;
return temp;
//行 B
}
C &C:: operator+=(C &m )
//利用成员函数重载
{
x+=m.x;
return *this;
//行 C
}
要求:
①三个函数参数均为对象的引用(也可不用引用),请解释这样做的好处?
_____________________________________________________________。
String operator+(const String &s1, const String &s2)
{
String t;
t.str=new char
;
strcpy(t.str,s1.str);
strcat(t,str,s2.str);
return
;
}
String & String∷operator=(String &s)
{
if(str)
;
str=new char[strlen(s.str)+1];
strcpy(str,s.str);
return
;
}
void main(void)
{
String s1(Computer"),s2("tests"),s3;
s1.Show();s2.Show();
s3=s1+s2;
s3.Show();
3.不能重载的 5 个运算符是:______、______、______、______、_________。
4.重载赋值运算符必须通过________函数实现。
5.用成员函数实现前置”--”运算符重载的一般格式为:_______________________________。
6.用友元函数实现后置”--”运算符重载的一般格式为:_______________________________。
四、课后练习题
1.通过重载运算符”=”和”+”,实现字符串类的赋值与拼接。
# include<iostream.h> # include<string.h> class String {
char * str; public:
String (char * s=0) {
if(s) {
str=new char[strlen(s)+1]; strcpy(str,s); } else str=0; } ~ String(){if(str)delete[]str;} friend String operator+(const String&, const String &); String & operator=(String &); void Show(){if(str) cout<<str<<'\n';} };
{5,7,9,11,13,15,17,19,21,23}。类似地,重载运算符”+=”,实现复合赋值运算。
# include<iostream.h>
class Arr
{
int x[10];
public:
Arr(){for(int i=0;i<10;i++) x[i]=0;}
Arr(int * p)
{ for(int i=0;i<10;i++) x[i]=*p++;}
{
if(
)
{
str=new char[
];
strcpy(str,s.str);
}
else str=0;
}
int String∷operator>(String &s)
{ if(strcmp(str,s.str)>0) return 1; else return 0;
} void main(void) {
];
strcpy(str,s);
}
else str=0;
}
String(String &);
~ String(){ if(str) delete [] str;}
int operatwenku.baidu.comr>(String &);
void Show(){ if(str)cout<<str<<'\n';}
}
String∷String(String &s)
课前练习题
1.重载运算”+”,实现 a+b 运算,则
。
A.a 必须为对象,b 可为整数或实数
B.a 和 b 必须为对象
C.b 必须为对象,a 可为整数或实数
D.a 和 b 均可为整数或实数
2.在 C++中,运算符的重载有两种实现方法,一种是通过成员函数来实现,另一种则通过
_________来实现。
分析
1.有以下程序: #include<iostream.h> class C{ private:
double x; public:
C( ) { x=0.0; } C(double a) { x=a; } friend C operator--(C t) {
t.x--; return t; } void show(){cout<<x<<endl;} }; void main() {
1 2 3 2 2 2
3 4 5
阵 A= 4 5 6 和 B= 3 3 3 ,通过运算 C=A+B,得到结果矩阵 C= 7 8 9 。
具体要求如下:
(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 矩阵的值。
(3)在主函数中完成对该类的测试。在程序的开头定义符号常数 M 和 N 的值分别为 3 和 4。
在主函数中定义二维数组 int x[M][N],用以上数据赋初值。定义一个 TDarray 类的对象 arr,
用数组 x 初始化该对象,通过 arr 调用成员函数,首先输出数组的原始值,然后移动并输出 移动后的数组值。
1/6 -5/6
3.设 a 为 M 行 N 列的二维数组,编程将 a 中的每个元素向右移动一列,最右一列换到最左 一列,移动后的数组仍然存放在 a 中,试建立一个类 TDarray,完成以上操作。例如,原始 数组以及移动元素之后的数组如下:
12 3 4
4 12 3
56 7 8
移动后
8 56 7
9 10 11 12
4.建立一个类 ComposeStr,连接两个字符串后,将结果字符串中的字符按升序排列。例如, 字符串 s1 的值为”pear”,字符串 s2 的值为”apple”,将 s1 和 s2 连接后得到字符串”pearapple”, 存入字符数组 s3,排序后得”aaeelpppr”。具体要求如下: (1)私有数据成员
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;
12 9 10 11
具体要求如下:
(1)私有数据成员 int a[M][N]:存入二维数组的值,M、N 为预定义的符号常量。
(2)公有成员函数 TDarray(int x[M][N]):构造函数,用 x 数组初始化数组 a。
void move():将数组 a 的每个元素向右移动一列。
void print():按矩阵方式输出数组 a。
}
2.通过重载运算符”>”实现字符串类的比较运算。重载构造函数实现字符串对象的初始化。
# include<iostream.h>
# include<string.h>
class String
{
char * str;
public:
String(char * s=0)
{
if( )
{
str=new char[
②行 A 和行 B 为何不写成:return *this; ,如行 C?
__________________________________________________________________________。
三、实验内容
1.定义一个类 MatrixAdd,其数据成员为一个 M*N 的矩阵(即二维数组),其中 M 和 N 是 两个预先定义的符号常数。通过重载运算符”+”和”=”,实现矩阵相加和赋值运算。如定义矩
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。正确的运行结果为:
实验 21 运算符重载
一、实验目的和要求
1.理解运算符重载的作用。 2.掌握实现运算符重载的方法及几种特殊运算符的重载格式。 3.进一步锻炼针对类的编程能力。
二、实验准备
知识点
1.运算符重载定义的一般格式、基本概念。 2.运算符函数重载的两种形式。 3.通过成员函数实现运算符重载的一般格式。 4.通过友元函数实现运算符重载的一般格式。 5.”++”运算符的重载。 6.”=”赋值运算符的重载。
//行 A
C c(5.6);
(--c).show();
//行 B
c.show();
//行 C
}
请回答问题:
①从行 A 的形式上看,这是利用________函数实现__________运算符的重载。
②行 B 的输出结果:_________,行 C 的输出结果:_________。
③上机验证输出结果,并且回答行 B 和行 C 的输出结果一样吗?为什么?
String s1("Computer"),s2("tests"),s3(s1); s1.Show();s2.Show();s3.Show(); cout<<(s1>s2)<<'\n';
}
3.通过重载运算符”+”,直接实现两个一维数组对应元素相加的运算。设数组 a、b 分别为
int a[10]={1,2,3,4,5,6,7,8,9,10},int b[10]={4,5,6,7,8,9,10,11,12,13},则两数组相加后,结果为
temp.x=m1.x+m2.x;
return temp;
//行 B
}
C &C:: operator+=(C &m )
//利用成员函数重载
{
x+=m.x;
return *this;
//行 C
}
要求:
①三个函数参数均为对象的引用(也可不用引用),请解释这样做的好处?
_____________________________________________________________。
String operator+(const String &s1, const String &s2)
{
String t;
t.str=new char
;
strcpy(t.str,s1.str);
strcat(t,str,s2.str);
return
;
}
String & String∷operator=(String &s)
{
if(str)
;
str=new char[strlen(s.str)+1];
strcpy(str,s.str);
return
;
}
void main(void)
{
String s1(Computer"),s2("tests"),s3;
s1.Show();s2.Show();
s3=s1+s2;
s3.Show();
3.不能重载的 5 个运算符是:______、______、______、______、_________。
4.重载赋值运算符必须通过________函数实现。
5.用成员函数实现前置”--”运算符重载的一般格式为:_______________________________。
6.用友元函数实现后置”--”运算符重载的一般格式为:_______________________________。
四、课后练习题
1.通过重载运算符”=”和”+”,实现字符串类的赋值与拼接。
# include<iostream.h> # include<string.h> class String {
char * str; public:
String (char * s=0) {
if(s) {
str=new char[strlen(s)+1]; strcpy(str,s); } else str=0; } ~ String(){if(str)delete[]str;} friend String operator+(const String&, const String &); String & operator=(String &); void Show(){if(str) cout<<str<<'\n';} };
{5,7,9,11,13,15,17,19,21,23}。类似地,重载运算符”+=”,实现复合赋值运算。
# include<iostream.h>
class Arr
{
int x[10];
public:
Arr(){for(int i=0;i<10;i++) x[i]=0;}
Arr(int * p)
{ for(int i=0;i<10;i++) x[i]=*p++;}
{
if(
)
{
str=new char[
];
strcpy(str,s.str);
}
else str=0;
}
int String∷operator>(String &s)
{ if(strcmp(str,s.str)>0) return 1; else return 0;
} void main(void) {
];
strcpy(str,s);
}
else str=0;
}
String(String &);
~ String(){ if(str) delete [] str;}
int operatwenku.baidu.comr>(String &);
void Show(){ if(str)cout<<str<<'\n';}
}
String∷String(String &s)
课前练习题
1.重载运算”+”,实现 a+b 运算,则
。
A.a 必须为对象,b 可为整数或实数
B.a 和 b 必须为对象
C.b 必须为对象,a 可为整数或实数
D.a 和 b 均可为整数或实数
2.在 C++中,运算符的重载有两种实现方法,一种是通过成员函数来实现,另一种则通过
_________来实现。
分析
1.有以下程序: #include<iostream.h> class C{ private:
double x; public:
C( ) { x=0.0; } C(double a) { x=a; } friend C operator--(C t) {
t.x--; return t; } void show(){cout<<x<<endl;} }; void main() {
1 2 3 2 2 2
3 4 5
阵 A= 4 5 6 和 B= 3 3 3 ,通过运算 C=A+B,得到结果矩阵 C= 7 8 9 。
具体要求如下:
(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 矩阵的值。
(3)在主函数中完成对该类的测试。在程序的开头定义符号常数 M 和 N 的值分别为 3 和 4。
在主函数中定义二维数组 int x[M][N],用以上数据赋初值。定义一个 TDarray 类的对象 arr,
用数组 x 初始化该对象,通过 arr 调用成员函数,首先输出数组的原始值,然后移动并输出 移动后的数组值。
1/6 -5/6
3.设 a 为 M 行 N 列的二维数组,编程将 a 中的每个元素向右移动一列,最右一列换到最左 一列,移动后的数组仍然存放在 a 中,试建立一个类 TDarray,完成以上操作。例如,原始 数组以及移动元素之后的数组如下:
12 3 4
4 12 3
56 7 8
移动后
8 56 7
9 10 11 12
4.建立一个类 ComposeStr,连接两个字符串后,将结果字符串中的字符按升序排列。例如, 字符串 s1 的值为”pear”,字符串 s2 的值为”apple”,将 s1 和 s2 连接后得到字符串”pearapple”, 存入字符数组 s3,排序后得”aaeelpppr”。具体要求如下: (1)私有数据成员
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;
12 9 10 11
具体要求如下:
(1)私有数据成员 int a[M][N]:存入二维数组的值,M、N 为预定义的符号常量。
(2)公有成员函数 TDarray(int x[M][N]):构造函数,用 x 数组初始化数组 a。
void move():将数组 a 的每个元素向右移动一列。
void print():按矩阵方式输出数组 a。
}
2.通过重载运算符”>”实现字符串类的比较运算。重载构造函数实现字符串对象的初始化。
# include<iostream.h>
# include<string.h>
class String
{
char * str;
public:
String(char * s=0)
{
if( )
{
str=new char[
②行 A 和行 B 为何不写成:return *this; ,如行 C?
__________________________________________________________________________。
三、实验内容
1.定义一个类 MatrixAdd,其数据成员为一个 M*N 的矩阵(即二维数组),其中 M 和 N 是 两个预先定义的符号常数。通过重载运算符”+”和”=”,实现矩阵相加和赋值运算。如定义矩
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。正确的运行结果为:
实验 21 运算符重载
一、实验目的和要求
1.理解运算符重载的作用。 2.掌握实现运算符重载的方法及几种特殊运算符的重载格式。 3.进一步锻炼针对类的编程能力。
二、实验准备
知识点
1.运算符重载定义的一般格式、基本概念。 2.运算符函数重载的两种形式。 3.通过成员函数实现运算符重载的一般格式。 4.通过友元函数实现运算符重载的一般格式。 5.”++”运算符的重载。 6.”=”赋值运算符的重载。
//行 A
C c(5.6);
(--c).show();
//行 B
c.show();
//行 C
}
请回答问题:
①从行 A 的形式上看,这是利用________函数实现__________运算符的重载。
②行 B 的输出结果:_________,行 C 的输出结果:_________。
③上机验证输出结果,并且回答行 B 和行 C 的输出结果一样吗?为什么?
String s1("Computer"),s2("tests"),s3(s1); s1.Show();s2.Show();s3.Show(); cout<<(s1>s2)<<'\n';
}
3.通过重载运算符”+”,直接实现两个一维数组对应元素相加的运算。设数组 a、b 分别为
int a[10]={1,2,3,4,5,6,7,8,9,10},int b[10]={4,5,6,7,8,9,10,11,12,13},则两数组相加后,结果为