第8章 多态性与运算符重载-C++程序设计基础案例教程-吴艳-清华大学出版社

合集下载

c++0

c++0

休息 30
前一页
例8-3
运 算 符 重 载

将+、-(双目)重载为复数类的友元 函数。

两个操作数都是复数类的对象。
前一页
休息
31
#include<iostream.h> class complex //复数类声明 { public: //外部接口 complex(double r=0.0,double i=0.0) { real=r; imag=i; } //构造函数 friend complex operator + (complex c1,complex c2); //运算符+重载为友元函数 friend complex operator - (complex c1,complex c2); //运算符-重载为友元函数 void display(); //显示复数的值 private: //私有数据成员 double real; double imag; };
程序运行结果为:
First time output:23:59:59 Clock++: 0:0:0 ++Clock: 0:0:1
运算符友元函数的设计
运 算 符 重 载
如果需要重载一个运算符,使之能够 用于操作某类对象的私有成员,可以 此将运算符重载为该类的友元函数。 函数的形参代表依自左至右次序排列 的各操作数。 后臵单目运算符 ++和--的重载函数, 形参列表中要增加一个int,但不必 写形参名。
//其它成员函数的实现略 void main() { Clock myClock(23,59,59); cout<<"First time output:"; myClock.ShowTime(); myClock++; myClock.ShowTime(); ++myClock; myClock.ShowTime(); }

c++程序设计PPT第8章 多态性

c++程序设计PPT第8章 多态性

程序代码:#include<iostream>
#include<string>
using namespace std;
class Base {
public:
Base() {
cout << "Base()..." << endl;
}
virtual ~Base() {
//定义虚析构函数
cout << "~Base()..." << endl;
virtual void gun(char) override final;
//正确,gun(char) 加了final
void hun();
// ②
};
class Third final: public Derived {
// Third类被修饰为final
public:
第8章 多态性
8.2.3 动态绑定的实现方法 在VC++中,多态是通过3个层次的指针(即“三层间接访问”)实现的。
问)。有人形象地称抽象基类中的纯虚函数为“软插槽”,而派生类中定义的函数体则是插在其上的
“软模块”。
第8章 多态性
8.3 纯虚函数与抽象类
【例8-4】纯虚函数与抽象类用法示例。以几何形类为抽象基类,派生圆、矩形、圆柱等类,计算各种几何形 的面积和体积。
程序代码:
//文件名: shape.h
#ifndef SHAPE_H
用的仍然是基类的虚函数。
通过类的对象调用虚函数仅属于正常的成员函数调用,调用关系是在编译时确定的,属于静态绑定。
动态绑定(动态多态性)仅发生在使用基类指针或基类引用调用虚函数的过程中。

C运算符重载PPT课件

C运算符重载PPT课件

//如果参数
index超出规定的范围,则输出越界信息
{ cout<<"\nError:下标"<<index<<"出界!"<<'\n';
exit(2);
//stdlib.h
}
return arp[index]; //如果不越界,则返回 相应的数据
}
第28页/共35页
void main(void)
{
CArray m1(10),m2(3);
int len;
int *arp;
public:
CArray(int n=0);
~CArray() {if (arp) delete[]arp;}
int & operator[] (int index);
义重载的下标运算符
};
// 定
第26页/共35页
CArray::CArray(int n)
{
if(n>0){
第14页/共35页
3. 复合运算符+= (利用成员函数重载) C C:: operator+=(C m ) { x+=m.x; return *this; }
C a,b; a+=b;
a.operator+=(b)
第15页/共35页
3. 复合运算符+= (利用友元函数重载) 先在类中声明: friend C operator+=(C & ,C); 再在类外定义: C operator+=(C &m1, C m2 ) { m1.x+=m2.x; return m1; }

Unit08 类和对象-C#程序设计案例教程-向燕飞-清华大学出版社

Unit08 类和对象-C#程序设计案例教程-向燕飞-清华大学出版社

8.2.4 类的构造函数和析构函数
构造函数是一种特殊的方法成员,构造函数的主要作用是 在创建对象(声明对象)时初始化对象。一个类定义必 须有至少一个构造函数,如果定义类时,没有声明构造 函数,系统会提供一个默认的构造函数,如果声明了构 造函数,系统将不再提供构默认造函数。
例8-2 默认构造函数的意义。 namespace demo08_01构造函数 {
C#程序设计案例教程
08 类和对象
学习目标
理解面向对象的基本思想 掌握类和对象的关系 掌握类的定义以及对象的创建
8.1案例描述
小程是软件研发组成员,所在的小组接到一个员工管理系统 的开发任务。其中一个模块要求:创建一名员工,输入其工号、 姓名、入职时间、部门等信息,并输出各项信息。
8.2 知识链接 8.2.1 面向对象的基本思想
在面向对象的程序里,万物皆对象,它将对象作 为程序的基本单元,将程序和数据封装其中, 以提高软件的重用性、灵活性和扩展性。面向 对象的封装特性具有以下优点:
良好的封装能够减少耦合; 类内部的实现可以自由地修改; 类具有清晰的对外接口
例如一个学生类图如图所示: public class Student //一个学生类 {
一旦实例化Customer对象,就可以使用语法 Object.FieldName来访问这些字段,例如:
Customer Customer1 = new Customer(); Customer1.CustomerID=8866; Customer1.FirstName = "Simon"; Customer1. LastName = "Green";
namespace demo08_01static

C++语言程序设计 第八章 多态性 PPT课件

C++语言程序设计 第八章  多态性 PPT课件
complex(double r=0.0,double i=0.0) { real=r; imag=i; } //构造函数
friend complex operator + (complex c1,complex c2); //运算符+重载为友元函数
friend complex operator - (complex c1,complex c2); //运算符-重载为友元函数
{ complex c; c.real=real-c2.real; c.imag=imag-c2.imag; return complex(c.real,c.imag);
}
18
void complex::display()
{ cout<<"("<<real<<","<<imag<<")"<<endl; }
private: //私有数据成员
int Hour,Minute,Second;
};
24
Clock& Clock::operator ++() //前置单目运算符重载函数 { Second++;
if(Second>=60) { Second=Second-60;
Minute++; if(Minute>=60) {
11
C++语言程序设计
两种形式

算 符
重载为类成员函数。
重 重载为友元函数。

12
C++语言程序设计
运算符函数
运 算 符

教学大纲-C++程序设计基础案例教程-吴艳-清华大学出版社

教学大纲-C++程序设计基础案例教程-吴艳-清华大学出版社

程序设计基础课程教学大纲一、课程性质、目的和任务《程序设计基础》课程是计算机科学与技术专业学生必修的专业基础课程之一。

通过本课程学习,使学生能较系统地掌握程序设计的基本语法、程序设计基本思想的基本知识、原理和方法,初步具备分析问题能力、解决问题的能力,为数据结构,Java程序及Java WEB等课程打下基础。

本课程教学要求学生熟练掌握高级程序设计语言程序的构成;基本语法成分;数据定义和相关运算;熟练掌握程序的三种基本控制流程的概念和实现;函数的定义和调用;熟练掌握指针的基本概念,能够应用于数据组织和函数调用;熟练掌握面向对象程序设计的核心概念:类和对象;以及类的特性:封装、继承、多态。

熟练掌握用C++定义类和操作对象的方法;有关派生类的构造机制;多态的实现技术等问题。

要求学生能够使用结构化思想和面向对象的思维方法设计实用性较强的小型应用程序,并能够在集成环境下(例如Visual C++)调试运行通过。

二、教学内容及教学基本要求第1章概述1.概念了解程序设计语言的发展和分类;理解并掌握程序的基本结构和程序设计的基本步骤。

2.基本数据类型与数值表达式了解数据类型的分类;理解关系运算符与逻辑运算符及其组成的具有逻辑值的表达式;理解自动类型转换和强制类型转换、赋值和复合赋值的概念;掌握运算符与表达式的概念;掌握自增和自减操作符的运算规则;掌握常量的表示法;掌握变量的定义及初始化方法;3.数据的输入和输出掌握cin、cout、printf、scanf的使用规则及用法;第2章程序控制语句1.表达式语句和复合语句了解 C++语句的概念及种类;掌握表达式语句的构成及语法形式;掌握复合语句的使用。

2.选择结构掌握二条分支语句的格式及基本应用;熟练掌握if … else 的三种语法;理解 switch 与break 语句的作用及使用方法。

3.循环结构理解程序设计中构成循环的方法;掌握for、while、do-while语句的用法;了解break、 continue 在循环语句中的作用。

《C 程序设计实例与操作》课件第10章 多态性、虚函数与运算符重载

《C  程序设计实例与操作》课件第10章 多态性、虚函数与运算符重载

t.imag=imag+c.imag;
return t;
} 则a+b为隐式调用,它等价于a.operator+(b),这是显式调用。
2.单目运算符重载作为类的成员函数
单目运算符重载作为类的成员函数时,操作数为访问该重 载运算符的对象本身的数据,也由this指针指出,因此,单目 运算符重载函数没有参数。
2.赋值运算符的重载
通常情况下,系统会自动生成一个默认的赋值运算符函数, 提供同类对象之间进行赋值的功能。但在某些特殊情况下,必 须要定义一个赋值运算符重载函数。
10.5 实现类型转换
类型转换函数用来将类类型转换为标准数据类型。
operator 类型名() { 转换语句 } 类型转换函数只能作为成员函数,不能作为友元函数,它又 称为类型转换运算符重载函数。
{}
virtual~ Point()
//定义虚析构函数
{}
virtual double CalArea() const=0;
//定义纯虚函数
};
class Rect:public Point {
//定义派生类Rect
protected:
double xcoord1,ycoord1;
public:
双目运算符重载为友元函数时,由于没有this指针,所以 操作数要通过友元函数的参数指出。
例如:
operator+(a,b); a+b;
//显式调用 //隐式调用
4.单目运算符重载作为类的友元函数
与双目运算符重载作为友元函数类似,单目运算符重载作 为友元函数时,操作数要通过友元函数的参数指出。
例如:
operator++(a); ++a;

C++程序设计教程修订版 第18章 运算符重载

C++程序设计教程修订版 第18章 运算符重载
C++中有两种类型的赋值运 算符:一类是“+=”和“-=” 等先计算后赋值的运算符,也 称之为复合赋值运算符 另一类是“=”即直接赋值的运 算符,也称之为赋值运算符。

当对第一操作数进行运算 并将值赋给第一操作数时, 可以简化赋值运算。比如 “a = a + b”可以简化为 “a += b”。对其他的操作, 比如“-、*和%” 等等,也 可以采用同样的方法进行简 化。
ostream& operator<<(ostream& o, const Point& d){ return o<<”(“<<d.x<<”,“<<d.y<<”)\n”; }
4.运算符作成员函数

成员运算符函数 定义 成员运算符函数定义的形式与类 外的运算符函数定义基本相同, 只是前者定义在类中。如 class X{ //…

class X{ //…;type operator +(X a);};
5.重载增量运算符

如同“++”运算符有前缀、后缀两种使用形 式,“++”和“--”重载运算符也有前缀和 后缀两种运算符重载形式,以“++”重载运 算符为例,其语法格式如下:


<函数类型> operator ++(); //前缀 运算 <函数类型> operator ++(int); //后缀 运算

说明 类型转换函数只能定义为一个类的成员 函数,而不能为友元函数 在类中可以有多个类型转换函数。C++编 译器将根据操作数的类型自动地选择一 个合适的类型转换函数与之匹配。 实际上,类型转换运算符将对象转换成 类型名规定的类型。转换时的形式就像 强制转换一样。如果没有转换运算符定 义,直接用强制转换是不行的,因为强 制转换只能对标准数据类型进行操作, 对类类型的操作是没有定义的。 类类型转换函数没有没有参数,也不显 式给出返回类型 类类型转换函数中必须有“return 目的 类型的数据;”的语句,即必须送回目 的类型数据作为函数的返回值。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
静态联编的缺点是不经过重新编译程序将无 法实现。
2、动态联编 动态联编是在程序运行阶段完成的联编,就
是指同属于某一基类的不同派生类对象,在形式 上调用从基类继承的同一成员函数时,实际调用 了各自派生类的同名函数成员。
运行时的多态就是用动态联编来完成的,当 程序调用到某一函数名时,才去寻找和连接其程 序代码。对面向对象程序而言,就是当对象接收 到某一消息时,才去寻找和连接相应的方法。
void print() { cout<<"This is print C"<<endl; } }; void main() { A a,*p; B b; C c; p=&a; p->print(); p=&b; p->print(); p=&c; p->print(); }
总之,如果在派生类中的函数满足以下三个条件则可以判 断该函数是虚函数: (1)该函数与基类的虚函数有相同的名称。 (2)该函数与基类的虚函数有相同的参数个数及相同对应参数 类型。 (3)该函数与基类的虚函数有相同的返回类型或者满足赋值兼 容规则的指针、引用型。
1、静态联编 静态联编是在编译阶段完成的联编,就是把
一条消息和一个对象的方法相结合的过程。编译 时的多态就是通过静态联编实现的,函数的重载 和运算符的重载都属于这种类型。
静态联编的优点是在访问方法时没有运行时 间的开销,函数的调用与函数定义的绑定在程序 执行前进行。因此,一个成员函数的调用并不比 普通函数的调用更费时。
//调用基类中的公有函数成员display() //调用派生类中的公有函数成display()
【例8-2】虚函数的应用案例2。 题目:针对例题8-1,进一步验证利用虚函数的机制来实现动态 联编。
#include <iostream.h>
class A
{ public:
virtual void print()
{ cout<<"This is print A"<<endl; }
};
class B:public A
{ public: void print()
//关键字virtual可以省略
{ cout<<"This is print B"<<endl; }
};
class C:public B { public:
8.1.2 多态的实现
在C++语言中支持两种多态性:编译时的多态 和运行时的多态。多态的实现和联编这一概念有关 。所谓联编就是把函数名与函数体的程序代码连接 在一起的过程。联编又可分为静态联编和动态联编 。系统用实参与形参进行匹配,对于同名的重载函 数便根据参数上的差异进行区分,然后进行联编, 从而实现多态。
例如,
#include <iostream.h> class Base { public:
void display() { cout<<"Hey!"<<endl; } }; class Derived:public Base { public: void display()
{ cout<<"Every Boy。"<<endl; } }; void main() { Base obj1,*p; Derived obj2;
虚函数的说明: (1)派生类应该从它的基类公有派生。一个虚函数无论被公有 继承多少次,它仍然保持虚函数的特性。 (2)必须首先在基类中定义虚函数。在实际应用中,应该在类 等级内需要具有动态多态性的几个层次中的最高层类内首先声 明虚函数。 (3)在派生类对基类声明的虚函数进行重定义时,关键字 virtual可以写也可以不写。但在容易引起混乱的情况下,最好在 对派生类的虚函数进行重定义时也加上关键字virtual。 (4)使用对象名和点运算符(“.”)的方式也可以调用虚函数 ,但这在编译时进行的是静态联编,它没有充分发挥虚函数的 特性。只有通过基类指针访问虚函数时才能获得运行时的多态 性(动态联编)。
8.1多态性
在C++语言中,多态性就是指不同的对象收到 相同的消息时,会产生不同的动作。例如要计算圆 、长方形或正方形的面积等,若给定一个半径,那 么求的是圆面积,若给定一个长和一个宽求的是矩 形面积,若给定一条边长那求的是正方形面积。
8.1.1 通用多态和专用多态
多态性是面向对象程序设计的重要特征。在 C++语言中,多态性可以细分为四类:参数多态、 包含多态、重载多态和强制多态。前面两种多态统 称为通用多态,而后面两种统称为专用多态。
};
class Derived:public Base
{ public:
void display()
{ cout<<" I'm Leifeng."<<endl; }
};
void main() {
Base obj1,*p; Derived obj2; p=&obj1; p->display(); p=&obj2; p->display(); }
C++程序设计基础案例教程
吴艳
章节知识
综合案例
参考答案
教材知识体系
课程
由浅入深,逐步 递进,案例丰富。
教学 学习
项目是结合
微课堂辅助
第8章 多态性与运算符重载
多态性
通用多态 和专用多

多态的实 现
抽象类
运算符重载
运算符重载 的概念
“++”和 “--”重

重载为类的 成员函数
重载为类的 友元函数
(3)函数体为函数功能实现语句。
【例8-1】虚函数的应用案例1。
题目:虚函数机制在程序中的应用,验证动态联编的效果。
ห้องสมุดไป่ตู้
#include<iostream.h>
class Base
{ public:
virtual void display()
//基类Base中定义了虚函数display()
{ cout<<"Hey!“; }
p=&obj1; p->display(); p=&obj2; }
p->display();
虚函数定义的一般语法格式为: virtual <函数类型> <函数名> (<形参表>) {
//函数体 } 说明: (1)关键词virtual不能省略。 (2)函数类型为函数返回值类型,没有返回值时为“void” ,函数名为合法的用户自定义标识符,形参列表可以是由逗 号(“,”)隔开的多个参数,也可以是空,但是圆括号不 能省。
相关文档
最新文档