C++面向对象程序设计实验七 多态性

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include "iostream.h" class CComplex { public: CComplex() { real = 0; imag = 0; } CComplex(int x,int y) { real = x; imag = y; } int real; int imag; CComplex operator + (CComplex obj1)//----------------------------------------------① { CComplex obj2(real + obj1.real, imag + obj1.imag); return obj2; }
要想学习好,努力少不了
实验七 多态性—函数与运算符重载
7.1 实验目的
1.理解动态联编和动态联编的概念; 2.理解掌握成员函数方式运算符重载; 3.理解掌握友元函数方式运算符重载; 4.理解掌握++、--、=运算符的重载。
7.2 实验内容 7.2.1 程序阅读
1.理解下面的程序,并在 VC++6.0 下运行查看结果,回答程序后面的问题。
学长只能帮你到这了
学长只能帮你到这了
要想学习好,努力少不了
int real; int imag;
}; CComplex operator + (CComplex obj1,CComplex obj2) { CComplex obj3(obj2.real + obj1.real, obj2.imag + obj1.imag); return obj3; } CComplex operator ++(CComplex &obj3) { obj3.real=++obj3.real;obj3.imag=++obj3.imag;return obj3; } CComplex operator++(CComplex &obj4,int) { obj4.imag=obj4.imag++;obj4.real=obj4.real++;return obj4; } CComplex operator --(CComplex &obj4) { obj4.imag=--obj4.imag;obj4.real=--obj4.real;return obj4; } CComplex operator --(CComplex &obj4,int) { obj4.imag=obj4.imag--;obj4.real=obj4.real--;return obj4; } void main() { CComplex obj1(90310,111); CComplex obj2(799, 10); CComplex obj; cout<<"obj1 原值:"<<obj1.real<<","<<obj1.imag<<endl; obj = obj1+obj2; cout<<"affter obj1+obj2:"; cout <<"real="<< obj.real ; cout <<",imag="<< obj.imag << endl; obj1=++obj1; cout<<"after ++obj1:"; cout <<"real="<< obj1.real ; cout <<",imag="<< obj1.imag << endl; obj1=obj1++; cout<<"after obj1++:"; cout <<"real="<< obj1.real ; cout <<",imag="<< obj1.imag << endl;
问题一:①处的运算符重载,为什么该函数的返回值要设计成 CComplex 类型? 答:因为复数相加后仍然是复数,因此要设计成原来的复数类型。 问题二:②处的运算符重载函数调用就相当于“ obj= obj1.operator+( obj2);” ,但是为什么 CComplex 类中的运算符重载函数只设计了一个参数? 答:因为此处调用的函数是成员运算符重载函数,所以形参表中只有一个参数,它作为运算 符右操作数,另一个操作数是当前对象 obj1. 2.理解下面的程序,并在 VC++6.0 下运行查看结果,回答程序后面的问题。
#include "iostream.h" class CComplex { public: CComplex() { real = 0; imag = 0; } CComplex(int x,int y) { real = x; imag = y; } friend CComplex operator + (CComplex obj1,CComplex obj2); friend CComplex operator++(CComplex &); friend CComplex operator++(CComplex &,int);//后缀方式 friend CComplex operator --(CComplex &obj4); friend CComplex operator --(CComplex &obj4,int);//后缀方式
学长只能帮你到这了
要想学习好,努力少不了
obj1=--obj1; cout<<"after --obj1:"; cout <<"real="<< obj1.real ; cout <<",imag="<< obj1.imag << endl; obj1=obj1--; cout<<"after obj1--:"; cout <<"real="<< obj1.real ; cout <<",imag="<< obj1.imag << endl; }
要想学习好,努力少不了
载函数没有参数,当前对象是运算的操作数,用this指针返回当前值。
7.2.2 程序设计
1.把 7.2.1 中第一道题的程序改造成采取友元函数重载方式来实现“+”运算符,并采取友 元函数重载方式增加前置和后置“++”以及“--”运算符重载,并设计主函数来验证重载运 算符的用法。 参照课本 219 页例 5.9
学长只能帮你到这了
要想学习好,努力少不了
CPoint operator++(CPoint &op,int) { CPoint t(op.xx,op.yy); op.xx++; op.yy++; return t; } CPoint operator--(CPoint &op) { CPoint t(op.xx,op.yy); --op.xx; --op.yy; return t; } CPoint operator--(CPoint &op,int) { CPoint t(op.xx,op.yy); op.xx--; op.yy--; return t; } void main() { CPoint point1(11107,990310); cout<<"O 点的起始坐标为:";point1.disp(); ++point1; cout<<"横纵坐标都自增后 O 点坐标:";point1.disp(); point1++; cout<<"重载自增运算符后 O 点坐标:";point1.disp(); --point1; cout<<"横纵坐标都自减后 O 点坐标:";point1.disp(); point1--; cout<<"重载自减运算符后 O 点坐标:";point1.disp(); }
7.3 思考题
1.定义 CPoint 类,有两个成员变量:横坐标(x)和纵坐标(y) ,对 CPoint 类重载“++” (自增运算符) 、 “--” (自减运算符) ,实现对坐标值的改变。 (每个函数均采用友元禾成员 函数实现) #include <iostream> using namespace std; class CPoint { private: int xx; int yy; public: CPoint(int x,int y) { xx=x; yy=y; } friend CPoint operator ++(CPoint &); friend CPoint operator ++(CPoint &,int); friend CPoint operator --(CPoint &); friend CPoint operator --(CPoint &,int); void disp() { cout<<"("<<xx<<","<<yy<<")"<<endl; } }; CPoint operator++(CPoint &op) { CPoint t(op.xx,op.yy); ++op.xx; ++op.yy; return t; }
学长只能帮你到这了
要想学习好,努力少不了
}; void main() { CComplex obj1(100,30); CComplex obj2(20, 30); CComplex obj; obj = obj1+obj2; //------------------------------------------------------------------② cout << obj.real <<endl; cout << obj.imag << endl; }
学长只能帮你到这了
要想学习好,努力少不了
void print() { cout<<real<<"+"<<imag<<"i"<<endl; } private: float real; float imag; }; CComplex &operator--(CComplex &x) { x.real -= 1; x.imag -= 1; return x; } void main() { CComplex obj1(2.1,3.2); CComplex obj2(3.6,2.5); cout<<"obj1="; obj1.print(); cout<<"obj2="; obj2.print(); CComplex obj3 = obj1 + obj2; cout<<"befor++, obj3="; obj3.print(); ++obj3; cout<<"after++, obj3="; obj3.print(); --obj3; cout<<"after--, obj3="; obj3.print(); CComplex obj4 = ++obj3; cout<<"obj4="; obj4.print(); }
源自文库
#include "iostream.h" class CComplex { public: CComplex() { real = 0.0; imag = 0.0; } CComplex(float x, float y) { real = x; imag = y; } CComplex operator + (CComplex &obj1, CComplex &obj2) { CComplex obj3(obj1.real + obj2.real, obj1.imag + obj2.imag); return obj3; } CComplex &operator++(CComplex &obj) { obj.real += 1; obj.imag +=1; return obj; }
问题一:以上程序中的三个运算符重载都有错误,试改正过来,并分析该程序的输出结果。 答: 1.把函数CComplex &operator--(CComplex &x)在类中定义为友元函数这样就可
学长只能帮你到这了
以调用私有成员。达到‘--’的目的。 2. CComplex operator + (CComplex &obj1, CComplex &obj2)中把其中一个引用去 掉因为这是成员运算符重载函数,只能有一个形参,另一个是当前对象。然后把 下一句中的其中一个 obj 去掉。 3. CComplex &operator++(CComplex &obj),单目运算符重载,其成员运算符重
相关文档
最新文档