《C 面向对象程序设计项目教程》教学课件 项目五

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

任务一 学习编译时多态性的实现
任务说明
在本任务中,我们就来学习编译时多态性的实现。
预备知识 一、函数重载 二、运算符重载
一、函数重载
所谓函数重载是指同一个函数名可以对应着多个不同的函数实现。 每一类实现对应着一个函数体,这些函数的名字相同,功能相同, 只是参数的类型或参数的个数不同。例如:
int sum(int x,int y) { return x+y; } float sum(float x,float y) { return x+y; } int sum(int x,int y,int z) { return x+y+z; }
2.单目运算符重载作为类的成员函数
单目运算符重载作为类的成员函数时,操作数为访问该重载运 算符的对象本身的数据,也由this指针指出,因此,单目运算符重 载函数没有参数。例如:
int operator++(); //对单目运算符++的重载
与双目运算符的重载类似,单目运算符重载作为类的成员 函数后,也有显式和隐式两种调用方法。例如:
void main()
{ int i;
double d;
i=max(3,7);
d=max(3.4,4.4,1.2);
cout<<"max(3,7)="<<i<<endl; //求两个整数中的最大值
cout<<"max(3.4,4.4,1.2)="<<d<<endl; //求三个浮点数中的最大值
}
int max(int x,int y)
项目五项目五任务一学习编译时多态性的实现任务二学习运行时多态性的实现多态性提高开发效率的妙招之二多态性提高开发效率的妙招之二任务说明任务说明预备知识预备知识任务一学习编译时多态性的实现在本任务中我们就来学习编译时多态性的实现工程五ຫໍສະໝຸດ 多态性 提高开发效率的妙招之二
任务一 学习编译时多态性的实现 任务二 学习运行时多态性的实现
//定义求两个整数中最大值的函数
{ return x>y?x:y; }
double max(double x,double y,double z) //定义求三个浮点数中最大值的函数
{ double d;
d=x>y?x:y;
return d>z?d:z;}
程序运行结果如下图。
二、运算符重载
运算符重载就是对已有的运算符赋予新的含义,使同一个运算符作 用于不同类型的数据时实现不同的操作。
//定义构造函数
x=xx; y=yy;}
int getx() {
return x;}
int gety() {
return y;}
friend Point operator++(Point &q); //声明运算符"++"重载为友元函数
};
Point operator++(Point &q) { //定义"++"运算符重载函数
#include <iostream.h> class Complex { private: double real; double imag; public: Complex(double x=0.0,double y=0.0) { //构造函数 real=x; imag=y;} Complex operator+(Complex &c); //声明“+〞运算符重载函数为成员函数 void print();};
② 重载不能改变运算符运算对象〔即操作数〕的个数,即单目运 算符只能重载为单目运算符,多目运算符只能重载为多目运算符。
③ 重载不能改变运算符的优先级和结合性。 ④ 重载运算符的功能应与该运算符作用于标准类型数据时所实现 的功能类似,否那么会影响程序的可读性。
【例5-3】 运算符重载应用例如。对运算符“+〞进行重载,使得 “+〞运算符可以对两个复数相加。
程序运行结果如下图。
〔二〕运算符重载的形式
运算符重载的形式有两种:一种是重载函数作为类的成员函数, 一种是重载函数作为类的友元函数。根据运算符操作数的不同,每种 重载形式又可以分为双目运算符的重载和单目运算符的重载。
1.双目运算符重载作为类的成员函数 双目运算符重载为成员函数后,就可以在主函数或其他类中进行 调用了,通常有显式和隐式两种调用方法。如【例5-3】中的a+b为隐 式调用,它等价于显式调用a.operator+(b),即通过对象a调用运算符重 载函数,并将表达式中的第二个参数作为函数实参。
p.operator++();
//显式调用
cout<<"p.x="<<p.getx()<<",p.y="<<p.gety()<<endl;}
程序运行结 果如下图。
3.双目运算符重载作为类的友元函数
如果类外函数需要访问某个类的私有成员时,必须将该函数声明 为该类的友元函数。由于友元函数不是类的成员函数,不属于任何一 个类对象,因此没有this指针。
int f(int x,int y) {…} float f(int x,inty) {…} double f(int x,int y) {…}
以上3个同名函数f()不是重载函数,在调用函数时,如f(3,4), 系统无法判断应该调用哪一个函数。
【例5-1】 参数类型不同的重载函数应用例如。分别求两个整数和 两个双精度浮点数中的最大数。
Complex Complex::operator+(Complex &c) { //定义“+〞运算符重载函数 Complex t; t.real=real+c.real; /*成员函数中包含隐含的this指针,该语句等价于 或t.real=(*this).real+c.real*/ t.imag=imag+c.imag; return t; } void Complex::print() { cout<<'('<<real<<','<<imag<<')'<<endl;} void main() { Complex a(3.0,4.0),b(10.5,20.5),c; c=a+b; c.print();}
#include <iostream.h>
int max(int,int);
//函数原型的声明
double max(double,double); //函数原型的声明
void main()
{ int i;
double d;
i=max(3,4);
//求两个整数中的最大值
d=max(14.5865,12.8741);
int operator+ (int a,int b){ … } //对运算符+重载,operator+是函数名
C++中绝大局部的运算符都允许重载,如表所示。
不允许重载的运算符如表所示。
在对运算符进行重载过程中应遵循如下规那么:
① 用户不可以自己定义新的运算符,只能对已有的C++运算符进 行重载。
双目运算符重载为友元函数时,由于没有this指针,所以操作数 要通过友元函数的参数指出。与运算符重载为类的成员函数类似,双 目运算符重载为友元函数后,其调用方法有显式和隐式两种,例如, 对运算符“+〞进行重载:
operator+(a,b); //显式调用 a+b; //隐式调用
【例5-5】 双目运算符“+〞重载作为友元函数的应用例如。
{ //定义构造函数 //声明前置运算符"++"重载函数
Point Point::operator++() {
//定义"++"运算符重载函数
++x; ++y;
return *this; }
//返回对象值
void main() {
Point p(1,2);
++p;
//隐式调用
cout<<"p.x="<<p.getx()<<",p.y="<<p.gety()<<endl;
以上3个同名函数sum()为重载函数,这3个函数具有相同的功能, 即求和,只是每个函数的参数类型或参数个数不同。在调用重载函 数时,系统会根据参数的类型或个数找到与之匹配的函数并调用该 函数。
重载函数的类型可以相同,也可以不同。但是,假设多个同名 函数只是函数类型不同时,那么它们不是重载函数,例如:
{ return x>y?x:y; }
程序运行结果如下图。
【例5-2】 参数类型和个数都不同的重载函数应用例如。分别求两个 整数和三个浮点数中的最大数。
#include <iostream.h>
int max(int,int);
//函数原型的声明
double max(double,double,double); //函数原型的声明
//求两个双精度浮点数中的最大值
cout<<"max(3,4)="<<i<<endl;
cout<<"max(14.5865,12.8741)="<<d<<endl;
}
int max(int x,int y)
//定义求两个整数中最大值的函数
{ return x>y?x:y; }
double max(double x,double y) //定义求两个双精度浮点数中最大值的函数
#include <iostream.h> class Complex { private: double real; double imag; public: Complex(double x=0.0,double y=0.0) { real=x; imag=y;} //声明“+〞运算符重载友元函数 friend Complex operator+(Complex &x,Complex &y); void print();};
operator++(a); //显式调用 ++a; //隐式调用
【例5-6】 单目运算符“++〞重载作为友元函数的应用例如。
#include <iostream.h>
class Point {
private:
int x; int y;
public:
Point(int xx=0,int yy=0) {
Complex operator+(Complex &x,Complex &y) {
//定义"+"运算符重载函数
Complex t;
t.real=x.real+y.real;
t.imag=x.imag+y.imag;
return t;}
void Complex::print() {
cout<<'('<<real<<','<<imag<<')'<<endl;}
void main() {
Complex a(3.0,4.0),b(10.5,20.5),c,d;
c=a+b;
//隐式调用
c.print();
d=operator+(a,b); //显式调用
d.print();}
程序运行结果如下图。
4.单目运算符重载作为类的友元函数
与双目运算符重载作为友元函数类似,单目运算符重载作为友元函 数时,操作数要通过友元函数的参数指出,并且调用友元函数时也有显 式和隐式两种调用方法,例如,对运算符“++〞进行重载:
}
程序运行结果如下图。
〔三〕常用运算符的重载
1.自增自减运算符的重载
单目运算符“++〞和“--〞有前置和后置两种形式,C++中约定 使用operator++()和operator--()来重载前置运算符,使用 operator++(int)和operator--(int)来重载后置运算符,在调用时一般为 形参int指定实参0。
例如,可以通过重载加法运算符使之能用于两个复数的相加操作。
运算符重载要用运算符重载函数operator来定义,其一般格式为:
函数类型 operator运算符〔参数列表〕 { 函数体 }
其中,函数类型是函数返回值的类型,operator为标识和定义运算 符重载函数的关键字,operator与其后的运算符一起构成函数名。例如:
a.operator++(); //单目运算符的显式调用 ++a; //单目运算符的隐式调用
【例5-4】 单目运算符“++〞重载应用例如。
#include <iostream.h> class Point { private: int x; int y; public: Point(int xx=0,int yy=0) x=xx; y=yy;} int getx() { return x;} int gety() { return y;} Point operator++(); };
++q.x;
++q.y;
return q;
//返回对象类型
}
void main() {
Point p(1,2);
++p;
//隐式调用
cout<<"p.x="<<p.getx()<<",p.y="<<p.gety()<<endl;
operator++(p);
//显式调用
cout<<"p.x="<<p.getx()<<",p.y="<<p.gety()<<endl;
相关文档
最新文档