资源描述
实验7 运算符重载(1)
实验目的:
1、理解什么是运算符重载;
2、熟悉运算符函数的声明、定义、调用;
3、掌握使用类的成员函数重载运算符方法;
4、掌握使用友元函数重载运算符方法;
5、熟悉算术运算符、关系运算符的重载方法;
6、了解CTime等MFC类中的运算符重载情况。
实验内容
1、复数是大家中学时期就学过的知识,设 a+bi 和 c+di 是两个复数,则它们的四则运规则如下:
请按下列步骤操作,体会什么是运算符重载,理解实现运算符使用的两种基本方法:
(1) 复制下列代码到开发工具并加以运行,观察整数的+、-运算是否成功?
#include <iostream>
using namespace std;
class Complex
{
private:
double real,image; //分别为实部、虚部
public:
Complex(double rel=0, double img=0)
{
real=rel;
image=img;
}
void display() //输出(a+b*i) 、(a-b*i) 、(a)等形式
{
cout<<" ("<<real;
if (image>0)
cout<<"+"<<image<<"*i) "; //虚部为正
else if (image<0)
cout<<image<<"*i) "; //虚部为负
else
cout<<") "; //虚部为,即为实数
}
//位置1
};
//位置2
void main()
{
int i1=100, i2=10, i3, i4;
i3=i1+i2;
i4=i1-i2;
cout<<"i1+i2="<<i3<<endl;
cout<<"i1-i2="<<i4<<endl;
//位置3
}
(2) 复制下列代码到 位置3 处,再次编译、运行程序,观察复数的+、-运算是否可行?从中得出什么结论?试说明其中的原因。
Complex c1(1,2), c2(3,-4),c3,c4;
c3=c1+c2;
c4=c1-c2;
//输出加的结果
c1.display();
cout<<"+";
c2.display();
cout<<"=";
c3.display();
cout<<endl;
//输出减的结果
c1.display();
cout<<"-";
c2.display();
cout<<"=";
c4.display ();
cout<<endl;
(3) 分别复制下列两段代码到 位置1和 位置2 处,再次编译、运行程序,观察这次的复数+、-运算能否成功?再次得出什么结论?
代码段1
Complex operator +(Complex & c); //用成员函数重载
friend Complex operator -(Complex & c1,Complex & c2);//用友元函数重载
代码段2
//成员函数的类外定义
Complex Complex::operator +(Complex & c)
{
Complex temp;
temp.real=real+c.real;
temp.image=image+c.image;
return temp;
}
//友元函数的定义
Complex operator -(Complex & c1,Complex & c2)
{
Complex temp;
temp.real=c1.real-c2.real;
temp.image=c1.image-c2.image;
return temp;
}
(4)分析上述代码,结合小课ppt理解运算符函数的声明、定义、调用,熟悉运算符重载的两种基本方法:使用类成员函数和友元函数,注意它们之间参数的差异。
2、参照上一题的程序,掌握用类成员函数重载运算符的方法
要求:在程序的适当位置填写程序代码,使用成员函数方法实现下列运算符重载:
(1) 复数 + 实数(double) 运算;
(2) 复数 * 复数 运算。
程序代码:
#include <iostream>
using namespace std;
class Complex
{
private:
double real,image; //分别为实部、虚部
public:
Complex(double rel=0, double img=0)
{
real=rel;
image=img;
}
void display() //输出(a+b*i) 、(a-b*i) 、(a)等形式
{
cout<<" ("<<real;
if (image>0)
cout<<"+"<<image<<"*i) "; //虚部为正
else if (image<0)
cout<<image<<"*i) "; //虚部为负
else
cout<<") "; //虚部为,即为实数
}
Complex operator +(Complex & c); //用成员函数重载
};
//成员函数的类外定义
Complex Complex::operator +(Complex & c)
{
Complex temp;
temp.real=real+c.real;
temp.image=image+c.image;
return temp;
}
void main()
{
Complex c1(1,2), c2(3,-4),c3,c4;
c3=c1+123.456;
c4=c1*c2;
//输出加的结果
c1.display();
cout<<"+";
cout<<123.456;
cout<<"=";
c3.display();
cout<<endl;
//输出*的结果
c1.display();
cout<<"*";
c2.display();
cout<<"=";
c4.display ();
cout<<endl;
}
3、参照上两题的程序,掌握用友元函数重载运算符的方法
要求:在程序的适当位置填写程序代码,使用友元函数方法实现下列运算符重载:
(1) 复数 / 实数(double) 运算;
(2) 复数 == 复数 运算; (结果:int型,1表示“true”,0表示“false”)
(3) 复数 != 复数 运算。(结果:int型,1表示“true”,0表示“false”)
程序代码:
#include <iostream>
using namespace std;
class Complex
{
private:
double real,image; //分别为实部、虚部
public:
Complex(double rel=0, double img=0)
{
real=rel;
image=img;
}
void display() //输出(a+b*i) 、(a-b*i) 、(a)等形式
{
cout<<" ("<<real;
if (image>0)
cout<<"+"<<image<<"*i) "; //虚部为正
else if (image<0)
cout<<image<<"*i) "; //虚部为负
else
cout<<") "; //虚部为0,即为实数
}
friend Complex operator -(Complex & c1,Complex & c2);//用友元函数重载
};
//友元函数的定义
Complex operator -(Complex & c1,Complex & c2)
{
Complex temp;
temp.real=c1.real-c2.real;
temp.image=c1.image-c2.image;
return temp;
}
void main()
{
Complex c1(10,9), c2(3,-4),c3;
c3=c1/5;
//输出除的结果
c1.display();
cout<<"/";
cout<<5;
cout<<"=";
c3.display();
cout<<endl;
//输出比较的结果
cout<<"c1==c2 ? 结果:";
cout<<(c1==c2)<<endl;
cout<<"c1!=c2 ? 结果:";
cout<<(c1!=c2)<<endl;
}
问题:能否不调用display()成员函数,而是采用cout<<…<<…<<…方式连续输出Complex呢?
4、书上P256:10.4.2的第(1)题。
5、在大名鼎鼎的MFC类中,除了包含数据成员、成员函数外,还有一项重要内容就是运算符重载,熟知这些内容对于完整理解MFC类的强大功能是很必要的,下图所示的就是CTime类的运算符重载情况:
在vs2005\VC\atlmfc\include 目录中包含有atltime.h和atltime.inl两个文件,其中就有运算符重载的声明、代码(lab_7目录中给出它们的简化版本)。请阅读这些文件内容,了解MFC类中的运算符重载是怎样实现的。
展开阅读全文