第11章 多态性-C++语言程序设计-宁涛-清华大学出版社
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
运算符的重载规则: (1) 重载后运算符的优先级与结合性不会改变。 (2) 不能改变原运算符操作数的个数。 (3) 不能重载C++中没有的运算符。 (4) 不能改变运算符的原有语义。
11.2.2 重载为成员函数
将运算符函数重载为类的成员函数, 这样运算函数可以自由地访问本类的数据成 员。重载运算符函数为类的成员函数语法形式为:
} Complex Complex::operator -()
//重载运算符-(取负)的函数实现
{
return Complex(-real,-image);
} Complex Complex::operator ++()
//重载运算符前置++的函数实现
{
return Complex(++real,image);
Complex operator - ();
//运算符-(取负)重载成员函数
Complex operator ++ ();
//前置+#43; (int);
//后置++重载成员函数
};
Complex Complex::operator +(Complex B //重载运算符+的函数实现
}
Complex Complex::operator ++(int)
//重载运算符后置++的函数实现
{
return Complex(real++,image);
}
void main()
{
Complex A(100.0,200.0),B(-10.0,20.0),C;
cout<<"A=", A.display();
cout<<"B=", B.display();
C=A+B;
//使用重载运算符完成复数加法
cout<<"C=A+B=", C.display();
C=A-B;
//使用重载运算符完成复数减法
cout<<"C=A-B=", C.display();
C=-A+B;
cout<<"C=-A+B=", C.display();
{
return Complex(real+B.real, image+B.image); //创建一个临时对象作为返回值
}
Complex Complex::operator -(Complex B //重载运算符-的函数实现
{
return Complex(real-B.real, image-B.image);
11.2 运算符重载
使同一个运算符作用与不同类型的数据时导致不同的行为的这种机制称为运 算符重载。
11.2.1运算符重载的实现
C++中的运算符除以下五个运算符之外,其余全部可以被重载。
•
. 成员选择运算符
•
.* 成员指针运算符
•
:: 作用域分辨符
•
? : 三目选择运算符
•
sizeof 计算数据大小运算符
11.1 多态性概述
多态性(polymorphism)是面向对象程序设计的重要特性之一。 多态是指同样的消息被不同类型的对象接收时导致完全不同的行为。 所谓消息是指对类的成员函数的调用,不同的行为是指不同的实现, 也就是调用了不同的函数。运算符的使用,就是多态的一种体现。 从实现的角度来看,多态可以划分为两类:编译时的多态和运行时的多 态。前者是在编译的过程中确定了同名操作的具体操作对象,而后者则是 在程序运行过程中才动态地确定操作所针对的具体对象。这种确定操作的 具体对象的过程就是联编(binding),也称为绑定。 联编可以在编译和连接时进行,称为静态联编。在编译、连接过程中 ,系统就可以根据类型匹配等特征确定程序中操作调用与执行该操作的代 码的关系,即确定了某一个同名标识到底是要调用哪一段程序代码,函数 的重载、函数模板的实例化均属于静态联编。 联编也可以在运行时进行,称为动态联编。在编译、连接过程中无法 解决的联编问题,要等到程序开始运行之后再来确定。
{
this->real=real,this->image=image;
}
void display()
{
cout<<"("<<real<<","<<image<<")"<<endl;
}
Complex operator + (Complex B); //运算符+重载成员函数
Complex operator - (Complex B); //运算符-重载成员函数
① 双目运算符重载为类的成员函数时,函数只显式说明一个参数,该形参是 运算符的右操作数。
② 前置单目运算符重载为类的成员函数时,不需要显式说明参数,即函数没 有形参。
③ 后置单目运算符重载为类的成员函数时,为了与前置单目运算符区别,函 数要带有一个整型形参。
【例11-1】重载运算符进行复数类数据运算
返回类型 类名::operator 运算符(形参表) {
函数体; }
➢ 类名是要重载该运算符的类,如果在类中定义运算符函数,类名与作用域分辨符 可以省略;。 ➢ operator与运算符构成运算符函数名;
➢ 当运算符重载为类的成员函数时,函数的参数个数将比原来的操作数个数要少 一个;原因是通过对象调用该运算符函数时,对象本身充当了运算符函数最左边 的操作数,少了的操作数就是该对象本身。因此:
//重载+、-、++为类的成员函数,进行复数运算
#include<iostream>
using namespace std;
class Complex
//复数类定义
{
private:
double real; double image;
//复数实部 //复数虚部
public:
Complex(double real=0.0,double image=0.0) //构造函数
第11章 多态性
作者:宁涛
学习目标
• 深入理解多态性的概念 • 理解静态联编和动态联编的区别和实现机制 • 掌握运算符重载的实质和规则,并能灵活对不
同类型的运算符进行重载 • 掌握虚函数实现动态联编的方法,并能设计类
的虚函数 • 掌握并能使用基类的指针和引用调用派生类中
的虚函数 • 掌握纯虚函数和抽象类的概念并理解其作用。
C=A++;
cout<<"C=A++, C=", C.display();
C=++A;
cout<<"C=++A, C=", C.display();
C=A+5;