皮德常面向对象的程序设计课程ppt
合集下载
2024年度-c面向对象程序设计(完整课件)pptx

16
04 继承与派生
17
继承概念及语法规则
继承的概念
继承是面向对象程序设计中的一个重要特征,它允许在已有的类的基础上创建 新类,新类继承了现有类的属性和方法,同时还可以添加新的属性和方法或者 覆盖现有方法。
继承的语法规则
在C中,继承通过使用冒号(:)和访问控制符(public、protected、private)来实 现。子类可以继承父类的公有成员、保护成员,但是不能继承私有成员。
介绍C中的基本数据类型,如整型、浮点型 、字符型等。
变量和常量
运算符和表达式
阐述变量和常量的概念,以及它们在程序 中的作用和使用方法。
列举C中的各种运算符,如算术运算符、关 系运算符、逻辑运算符等,并解释表达式 的概念和计算方法。
9
C语言数据类型
基本数据类型
详细介绍C中的基本数据类型, 如int、char、float、double 等。
20
纯虚函数和抽象类
纯虚函数的概念
纯虚函数是一种特殊的虚函数,它在基类中声明但没有定义,要求任何派生类都必须提供该函数的实 现。纯虚函数通过在函数声明后添加 "= 0" 来标识。
抽象类的概念
包含纯虚函数的类被称为抽象类。抽象类不能被实例化,只能作为其他类的基类使用。抽象类提供了 一种定义接口的方式,使得开发者可以定义一组相关类应该实现的方法,而不必关心具体实现细节。
析构函数
用于清理对象使用的资源,在对象 销毁时自动调用。
构造函数的重载
可以定义多个构造函数,以适应不 同的初始化需求。
14
对象数组和指针
对象数组
存储多个对象的数组,每个数组 元素都是一个对象。
对象指针
指向对象的指针,通过指针可以 访问和操作对象。
04 继承与派生
17
继承概念及语法规则
继承的概念
继承是面向对象程序设计中的一个重要特征,它允许在已有的类的基础上创建 新类,新类继承了现有类的属性和方法,同时还可以添加新的属性和方法或者 覆盖现有方法。
继承的语法规则
在C中,继承通过使用冒号(:)和访问控制符(public、protected、private)来实 现。子类可以继承父类的公有成员、保护成员,但是不能继承私有成员。
介绍C中的基本数据类型,如整型、浮点型 、字符型等。
变量和常量
运算符和表达式
阐述变量和常量的概念,以及它们在程序 中的作用和使用方法。
列举C中的各种运算符,如算术运算符、关 系运算符、逻辑运算符等,并解释表达式 的概念和计算方法。
9
C语言数据类型
基本数据类型
详细介绍C中的基本数据类型, 如int、char、float、double 等。
20
纯虚函数和抽象类
纯虚函数的概念
纯虚函数是一种特殊的虚函数,它在基类中声明但没有定义,要求任何派生类都必须提供该函数的实 现。纯虚函数通过在函数声明后添加 "= 0" 来标识。
抽象类的概念
包含纯虚函数的类被称为抽象类。抽象类不能被实例化,只能作为其他类的基类使用。抽象类提供了 一种定义接口的方式,使得开发者可以定义一组相关类应该实现的方法,而不必关心具体实现细节。
析构函数
用于清理对象使用的资源,在对象 销毁时自动调用。
构造函数的重载
可以定义多个构造函数,以适应不 同的初始化需求。
14
对象数组和指针
对象数组
存储多个对象的数组,每个数组 元素都是一个对象。
对象指针
指向对象的指针,通过指针可以 访问和操作对象。
面向对象程序设计Java课程介绍PPT课件

面向对象编程
深入探讨类、对象、封装、继承和多 态等面向对象的核心概念,以及如何 使用Java进行面向对象编程。
异常处理与调试
掌握Java中的异常处理机制,学习如 何进行程序调试和错误处理。
Java语言的发展趋势与未来展望
云计算与微服务
随着云计算技术的不断发展,Java在 构建微服务架构方面将发挥越来越重
随着软件工程领域的发展,面向对象程序设计思想逐渐 成为主流,掌握面向对象编程技术对于提高软件质量和 开发效率具有重要意义。
课程目标
掌握Java语言基础语 法和面向对象编程思 想,包括类、对象、 封装、继承、多态等
核心概念。
熟悉常用Java类库和 API,了解Java集合框 架、输入输出流、多
线程等技术。
Java提供了wait()和notify()方法来实 现线程间通信,其中wait()方法使当 前线程等待某个条件成立,notify()方 法则通知等待的线程继续执行。
05
Java应用实例
图形用户界面设计
总结词
通过使用Java的图形用户界面(GUI)工具包,如Swing和JavaFX,学生将学习如何创建具有 吸引力和功能丰富的用户界面。
自定义异常
Java允许自定义异常类,通过继承Exception或RuntimeException类来实现。自定义异常可以在程序中 根据需要创建和抛出。
文件I/O操作
文件读取
使用Java的FileInputStream 和BufferedReader类可以读
取文本文件的内容,其中 FileInputStream用于打开文 件,BufferedReader用于逐
循环语句
循环语句用于重复执行一段代码。Java中的循环 语句包括for循环、while循环和do-while循环等。
第一讲面向对象程序设计(共39张PPT)

本文档详细阐述了面向对象程序设计的基础知识。首先,解释了面向过程与面向对象的区别,强调了面向对象编程的特点和优势。接着,引入了对象的概念,对象是数据和操作的独立整体,类则是对象的模板,定义Байду номын сангаас一组有相同数据和操作的对象的共同属性和行为。文档还深入探讨了面向对象的主要特征,包括封装性、继承性和多态性。此外,通过Java语言的实例,展示了如何定义类、创建方法和变量,以及如何通过对象来访问这些方法和变量。其中,方法的创建包括四种常用形式,可以根据是否需要返回值和参数进行划分。最后,通过创建一个Student类的例子,具体演示了如何在类中定义属性(如sid、name、age)和方法,并通过对象来访问这些属性和方法。这份文档为学习和理解面向对象程序设计提供了全面的基础知识和实践指导。
【精品课件】面向对象程序设计

在替代之后,派生类对象就可以作为 基类的对象使用,但只能访问从基类 继承的成员。
【例5-3】示例类型兼容规则的应用。 教材P261,该程序的运行结果为:
Base class Base class Base class Derivel class Derive2 class
根据类型兼容规则,基类指针p可以指 向派生类对象obj2、obj3(即派生类 对象可以代替基类对象,给基类指针 赋值),但编译时,编译器根据p的类 型是基类型,自动调用基类的who(), 所以结果如上所示。
【思考题5-3】如果基类指针要访问派 生类的who(),怎么办?
C++提供了多态机制来解决这个问题。 类型兼容规则是C++多态的重要基础。
多态
多态(Polymorphism)是指具有相似 功能的不同函数使用同一个名称来实 现,从而可以使用相同的调用方式来 调用这些具有不同功能的同名函数的 特性。
可见,同一个指针,在不同阶段被绑 定的类对象将是不同的,进而被关联 的类成员函数也是不同的。
如何来确定是用静态联编还是用动态 联编呢?
C++规定,动态联编通过继承和虚函数 来实现。
虚函数是动态联编的基础。下面介绍 虚函数。
5.6 虚函数
虚函数就是在基类中被关键字virtual 说明、并在一个或多个派生类中被重 新定义的成员函数。
在程序运行时,不同类的对象调用各 自的虚函数,这就是运行时多态。
【例5-5】将例5-4基类的成员函数 print()设为虚函数,采用对象指针调 用虚函数,进而实现动态联编。
该程序的运行结果为:
A student A graduate student A student A student A graduate student
【例5-3】示例类型兼容规则的应用。 教材P261,该程序的运行结果为:
Base class Base class Base class Derivel class Derive2 class
根据类型兼容规则,基类指针p可以指 向派生类对象obj2、obj3(即派生类 对象可以代替基类对象,给基类指针 赋值),但编译时,编译器根据p的类 型是基类型,自动调用基类的who(), 所以结果如上所示。
【思考题5-3】如果基类指针要访问派 生类的who(),怎么办?
C++提供了多态机制来解决这个问题。 类型兼容规则是C++多态的重要基础。
多态
多态(Polymorphism)是指具有相似 功能的不同函数使用同一个名称来实 现,从而可以使用相同的调用方式来 调用这些具有不同功能的同名函数的 特性。
可见,同一个指针,在不同阶段被绑 定的类对象将是不同的,进而被关联 的类成员函数也是不同的。
如何来确定是用静态联编还是用动态 联编呢?
C++规定,动态联编通过继承和虚函数 来实现。
虚函数是动态联编的基础。下面介绍 虚函数。
5.6 虚函数
虚函数就是在基类中被关键字virtual 说明、并在一个或多个派生类中被重 新定义的成员函数。
在程序运行时,不同类的对象调用各 自的虚函数,这就是运行时多态。
【例5-5】将例5-4基类的成员函数 print()设为虚函数,采用对象指针调 用虚函数,进而实现动态联编。
该程序的运行结果为:
A student A graduate student A student A student A graduate student
00面向对象的程序设计27页PPT文档

举例: public class Student{
private int age; public String name = “Alex Wen”;
}
面向对象程序设计初步
10
Softeem Consultancy Service
方法的声明
语法格式:
< modifiers> <return_type> <name>([< argu_list>]) { [< statements>]
• private int age ;
• public void setAge(int _age) {
•
age象程序设计初步
9
Softeem Consultancy Service
属性的声明
语法格式: [<modifiers>] type <attr_name> [=defaultValue] ;
•
private int weight;
•
public Dog(int w) {
•
weight = w;
•
}
•}
面向对象程序设计初步
12
Softeem Consultancy Service
对象的创建和使用
• 在Java中,使用new 关键字来创建一个对象(实例化一个 类),new后面跟上一个构造器 – 每个类都至少有一个构造器,如果没有定义构造器, 则系统将自动提供一个默认的不带任何参数的构造器, 如果类没有定义构造器,可以用这个默认的构造起来 生成一个对象
• 面向对象的编程(OOP)思想力图使对计算机语言中对事物的 的描述与现实世界中该事物的本来面目尽可能的一致。
private int age; public String name = “Alex Wen”;
}
面向对象程序设计初步
10
Softeem Consultancy Service
方法的声明
语法格式:
< modifiers> <return_type> <name>([< argu_list>]) { [< statements>]
• private int age ;
• public void setAge(int _age) {
•
age象程序设计初步
9
Softeem Consultancy Service
属性的声明
语法格式: [<modifiers>] type <attr_name> [=defaultValue] ;
•
private int weight;
•
public Dog(int w) {
•
weight = w;
•
}
•}
面向对象程序设计初步
12
Softeem Consultancy Service
对象的创建和使用
• 在Java中,使用new 关键字来创建一个对象(实例化一个 类),new后面跟上一个构造器 – 每个类都至少有一个构造器,如果没有定义构造器, 则系统将自动提供一个默认的不带任何参数的构造器, 如果类没有定义构造器,可以用这个默认的构造起来 生成一个对象
• 面向对象的编程(OOP)思想力图使对计算机语言中对事物的 的描述与现实世界中该事物的本来面目尽可能的一致。
面向对象程序设计方法PPT课件

1
面向对象程序设计
前言 第1章 C++语言概述 第2章 数据类型和表达式 第3章 预处理和语句 第4章 函数和作用域 第5章 类和对象(一) 第6章 类和对象(二) 第7章 继承性和派生类 第8章 多态性和虚函数 第9章 C++的I/O流库
2
地位与作用
是计算机科学与技术专业本科生的一门必 修课程
C++程序设计教程.钱能编著.清华大学出版 社.1999
12
第1章 C++语言概述
基本要求 了解:面向对象程序设计的基本思想及 基本概念;面向对象语言的分类和c++中 支持面向对象的特点;面向对象的软件 开发环境;visual c++开发工作台的主要 功能。
13
第1章 C++语言概述
1.1 C++的起源及特点 1.2 面向对象的方法 1.3 面向对象的程序设计语言C++ 1.4 C++程序的编辑、编译和运行 1.5 C++的词法及词法规则 1.6 C++程序的结构
5
面向过程的程序设计(以C语言为例)
1、自上而下(top-down)的设计方式:是一个 自顶向下,逐步求精的过程; 2、以main函数概括出整个应用程序需要做的 事情,而main函数由对一系列的子函数的调 用组成;
main中的每一个子函数都可以被精炼成更 小的函数。重复这个过程,即可完成一个过 程式的设计; 3、特征是以函数为中心,以函数作为划分程 序的基本单位,数据往往处于从属地位。
15
1.1.1 面向对象的由来和发展(续)
20世纪60年代中期,Simula 67语言 面向对象语言的鼻祖,提出了对象、类的概
面向对象程序设计
前言 第1章 C++语言概述 第2章 数据类型和表达式 第3章 预处理和语句 第4章 函数和作用域 第5章 类和对象(一) 第6章 类和对象(二) 第7章 继承性和派生类 第8章 多态性和虚函数 第9章 C++的I/O流库
2
地位与作用
是计算机科学与技术专业本科生的一门必 修课程
C++程序设计教程.钱能编著.清华大学出版 社.1999
12
第1章 C++语言概述
基本要求 了解:面向对象程序设计的基本思想及 基本概念;面向对象语言的分类和c++中 支持面向对象的特点;面向对象的软件 开发环境;visual c++开发工作台的主要 功能。
13
第1章 C++语言概述
1.1 C++的起源及特点 1.2 面向对象的方法 1.3 面向对象的程序设计语言C++ 1.4 C++程序的编辑、编译和运行 1.5 C++的词法及词法规则 1.6 C++程序的结构
5
面向过程的程序设计(以C语言为例)
1、自上而下(top-down)的设计方式:是一个 自顶向下,逐步求精的过程; 2、以main函数概括出整个应用程序需要做的 事情,而main函数由对一系列的子函数的调 用组成;
main中的每一个子函数都可以被精炼成更 小的函数。重复这个过程,即可完成一个过 程式的设计; 3、特征是以函数为中心,以函数作为划分程 序的基本单位,数据往往处于从属地位。
15
1.1.1 面向对象的由来和发展(续)
20世纪60年代中期,Simula 67语言 面向对象语言的鼻祖,提出了对象、类的概
面向对象程序设计教学课件:类和对象

例:定义一个Person人员类。
class Person:
num=1
#成员变量
def SayHello(self): #成员函数
print(" Hello!") ;
类的定义和使用
2. 对象定义
对象是类的实例。 如果人类是一个类的话, 那么某个具体的人就是一个
对象。 只有定义了具体的对象, 并通过“对象名.成员” 的方式来访问
运行结果如下:
析构函数
Python中类的析构函数是 __del__,用来释放对象占用的资源,在Python收回 对象空间之前自动执行。如果用户未涉及析构函数,Python将提供一个默认的 析构函数进行必要的清理工作。
运行结果如下:
3、实例属性和类属性
实例属性和类属性
实例属性属于实例(对象),只能通 过对象名访问;类属性属于类可 通过类名访问,也可以通过对象 名访问,为类的所有实例共享。
对象名._类名+私有成员
私有成员和公有成员
例如:访问Car类私有成员__weight 例:为Car类定义私有成员。 car1._Car__weight
注意:私有属性是为了数据封装和保密 而设的属性,一般只能在类的成员方法 ( 类的内部) 中使用访问, 虽然 Python支持一种特殊的方式来从外部 直接访问类的私有成员, 但是并不推 荐这种做法。 公有属性是可以公开使 用的, 既可以在类的内部进行访问, 也可以在外部程序中使用。
例:定义含有实例属性(姓名 name,年龄age)和类属性 (人数num)的Person人员类。
运行结果如下:
实例属性和类属性
例:为Car类动态增加属性 name和成员方法setSpeed().
面向对象程序设计(共13张PPT)

9.2.2 对象的使用
对象的使用主要体现在对其成员的引用上,对 象只能访问公有成员,一般格式为:
<对象名> . <公有成员数据名>
<对象名> . <公有成员函数名>(<参数表>)
prev
next
back
第5页,共13页。
9.2 类的使用
9.2.2 对象的使用
成员选择运算符 这里的符号“.”称为 对象数组的元素通过缺省构造函数而得到初始化。
4. 一个类的对象可作为另一个类的成员,
prev
称为对象成员。
next
back
第7页,共13页。
9.2 类的使用
9.2.3 对象数组和对象指针
定义一维对象数组的一般格式为:
《存储类型》<类名> <对象数组名>[<常量表达式
>];
对象数组中的每个元素可以象一般的对 象使用。
注意,在说明对象数组时,不能对它进 行初始化。对象数组的元素通过缺省构
第12页,共13页。
9.2 类的使用
9.2.5 类实现数据的封装
对象的封装性是指将对象的属性(成员数据)和 作用于这些属性上的操作(成员函数)封装在一 起,对象的使用者只能通过提供给它的接口
(公有成员函数)使用这个对象。
类通过对其成员设计不同的访问权限实现数据的
封装。公有成员是类的外部表现(在类外可以对 其进行访问和修改),而私有和保护成员则被 隐藏了。
prev
在定义类时,通常将该类的所有属性(成员数
据)和只供内部调用的操作(成员函数)定义为私
next
有成员或保护成员。
例9.5
back
对象的使用主要体现在对其成员的引用上,对 象只能访问公有成员,一般格式为:
<对象名> . <公有成员数据名>
<对象名> . <公有成员函数名>(<参数表>)
prev
next
back
第5页,共13页。
9.2 类的使用
9.2.2 对象的使用
成员选择运算符 这里的符号“.”称为 对象数组的元素通过缺省构造函数而得到初始化。
4. 一个类的对象可作为另一个类的成员,
prev
称为对象成员。
next
back
第7页,共13页。
9.2 类的使用
9.2.3 对象数组和对象指针
定义一维对象数组的一般格式为:
《存储类型》<类名> <对象数组名>[<常量表达式
>];
对象数组中的每个元素可以象一般的对 象使用。
注意,在说明对象数组时,不能对它进 行初始化。对象数组的元素通过缺省构
第12页,共13页。
9.2 类的使用
9.2.5 类实现数据的封装
对象的封装性是指将对象的属性(成员数据)和 作用于这些属性上的操作(成员函数)封装在一 起,对象的使用者只能通过提供给它的接口
(公有成员函数)使用这个对象。
类通过对其成员设计不同的访问权限实现数据的
封装。公有成员是类的外部表现(在类外可以对 其进行访问和修改),而私有和保护成员则被 隐藏了。
prev
在定义类时,通常将该类的所有属性(成员数
据)和只供内部调用的操作(成员函数)定义为私
next
有成员或保护成员。
例9.5
back
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
corpBudget += moffice; }
// Contents of auxi1.cpp #include "auxi1.h" #include "budget3.h"
// Definition of member function mainOffice.
void Aux::addBudget(float b, Budget &div)
不采用友元 如何解决?
cout<< Distance(p1, p2) <<endl; }
9-3.cpp
9.2.2 类的成员函数作为另外一个类的友元
其他类的成员函数声明为一个类的友元函数,这 个成员函数也称为友元成员。
友元成员不仅可以访问自己所在类对象中的私有 成员和公有成员,还可以访问friend声明语句所在类对 象中的私有成员和公有成员,这样能使两个类相互合 作完成某一任务。 例:将Aux类的函数addBudget声明为Budget类的友元 函数。
cout << "Here are the division budget requests:\n"; for (i = 0; i < 4; i++) {
cout << "\tDivision " << (i + 1) << "\t\t\t "; cout << setw(7); cout << divisions[i].getDivBudget( ) << endl; cout << "\tAuxilary Office of Division " <<(i+1); cout << "\t"; cout << auxOffices[i].getDivBudget( ) << endl;
corpBudget += divBudget;
}
static void mainOffice( float );
float getDivBudget( ) { return divBudget; }
float getCorpBudget( ){ return corpBudget;}
};
// Contents of budget2.cpp #include "budget2.h"
5
// budget2.h文件的内容 。
class Budget
{ static float corpBudget;
float divBudget;
public:
Budget( ) { divBudget = 0; }
void addBudget( float b)
{
divBudget += b;
cout << "\t Total Requests: "; cout << divisions[0].getCorpBudget( ) << endl; }
budget2.h budget2.cpp 9-2.cpp
1. 对于静态的函数成员,是通过类名和作用域分辨符 调用的。
2. 也可以采用对象点的方式调用
3
class StaticDemo
{ static int x ;
int y ;
public: void putx( int a){ x=a ; }
理解它!
void puty( int b ){ y=b ; }
int getx( ) { return x ; }
int gety( ) { return y ; }
14
class Budget ; // 对Budget类超前使用说明
class Aux // Aux类的定义 { private:
float auxBudget ; public:
Aux( ) { auxBudget = 0 ; } void addBudget( float , Budget & ) ; float getDivBudget( ) { return auxBudget ; } };
{
auxBudget += b;
div.corpBudget += auxBudget;
}
Attention
Plz
// Contents of main program #include "budget3.h“
void main( ) { float amount;
int i; float bud;
};
int StaticDemo::x ; // 静态变量x将被StaticDemo类的所有对象共享,例如:
StaticDemo obj1, obj2 ;
obj1.putx(5) ;
obj1.puty( l0 ) ;
obj2.puty(20 ) ;
cout << "x: "<< obj1.getx( ) << " " << obj2.getx( ) << endl ;
public:
void Set(int i) { a.x = i; }
void Display( ) { a.Display( ); }
float Budget::corpBudget = 0 ;
// Definition of static member function. void Budget::mainOffice(float moffice) {
corpBudget += moffice; }
//主程序pr9-2.cpp的内容 #include " budget2.h“ void main( ) { float amount;
9.2.3 一个类作为另外一个类的友元
• 若一个类为另一个类的友元,则此类的所有成员 都能访问对方类的私有成员。
class A
{ int x;
friend class B; 不好 public:
的方
void Display( ){ cout<<x<<endl;}
法, } ;
勿模 class B
仿
{ A a;
cout << (i + 1) << " " ; cin >> bud; divisions[i].addBudget(bud); }
cout << "\n Here are the division budget :\n"; for ( i = 0; i < 4; i++) {
cout << "\t Division" << (i + 1) << "\t $ "; cout << divisions[i].getDivBudget( ) << endl; }
2
9.1.1 静态数据成员
1. 用关键字static声明; 2. 同一个类中的所有对象都共享该变量; 3. 必须在类外定义和初始化,用(::)来指明所属的类。 4. 静态变量不依赖于对象而存在,无论是否定义该类的
对象,这种类型的变量都存在。静态数据成员实际 上是在类外定义的一个变量,它的生存期和整个程 序的生存期一样,在定义对象之前,静态数据成员 就已经存在。
// Contents of budget3.cpp #include "budget3.h"
// Definition of static member of Budget class float Budget::corpBudget = 0;
// Definition of static member function mainOffice. void Budget::mainOffice(float moffice ) {
} cout << "\tTotal Requests (including main office):"; cout << divisions[0].getCorpBudget( ) << endl; }
auxi1.h budget3.h auxi1.cpp budget3.cpp 9-3.cpp
class Point
{
int xPos, yPos ;
public:
Point(int xx=0, int yy=0 )
{ xPos=xx; yPos=yy; }
int GetXPos( ) { return xPos; }
int GetYPos( ) { return yPos; }
friend double Distance(Point &a, Point &b);
cout << "y: "<< obj1.gety( ) <<" "<< obj2.gety( ) << endl ;
9.1.2 静态函数成员
– 静态函数成员是类中的一个函数,有static修饰。 – 静态函数成员和静态数据成员类似,在对象生成
之前也已经存在。这就是说在对象产生之前,静 态的函数成员就能访问其它静态成员。 – 类外代码可以使用类名和作用域操作符来调用静 态成员函数。 – 静态成员函数只能引用属于该类的静态数据成员 或静态成员函数。见例【例9-2】。
// Contents of auxi1.cpp #include "auxi1.h" #include "budget3.h"
// Definition of member function mainOffice.
void Aux::addBudget(float b, Budget &div)
不采用友元 如何解决?
cout<< Distance(p1, p2) <<endl; }
9-3.cpp
9.2.2 类的成员函数作为另外一个类的友元
其他类的成员函数声明为一个类的友元函数,这 个成员函数也称为友元成员。
友元成员不仅可以访问自己所在类对象中的私有 成员和公有成员,还可以访问friend声明语句所在类对 象中的私有成员和公有成员,这样能使两个类相互合 作完成某一任务。 例:将Aux类的函数addBudget声明为Budget类的友元 函数。
cout << "Here are the division budget requests:\n"; for (i = 0; i < 4; i++) {
cout << "\tDivision " << (i + 1) << "\t\t\t "; cout << setw(7); cout << divisions[i].getDivBudget( ) << endl; cout << "\tAuxilary Office of Division " <<(i+1); cout << "\t"; cout << auxOffices[i].getDivBudget( ) << endl;
corpBudget += divBudget;
}
static void mainOffice( float );
float getDivBudget( ) { return divBudget; }
float getCorpBudget( ){ return corpBudget;}
};
// Contents of budget2.cpp #include "budget2.h"
5
// budget2.h文件的内容 。
class Budget
{ static float corpBudget;
float divBudget;
public:
Budget( ) { divBudget = 0; }
void addBudget( float b)
{
divBudget += b;
cout << "\t Total Requests: "; cout << divisions[0].getCorpBudget( ) << endl; }
budget2.h budget2.cpp 9-2.cpp
1. 对于静态的函数成员,是通过类名和作用域分辨符 调用的。
2. 也可以采用对象点的方式调用
3
class StaticDemo
{ static int x ;
int y ;
public: void putx( int a){ x=a ; }
理解它!
void puty( int b ){ y=b ; }
int getx( ) { return x ; }
int gety( ) { return y ; }
14
class Budget ; // 对Budget类超前使用说明
class Aux // Aux类的定义 { private:
float auxBudget ; public:
Aux( ) { auxBudget = 0 ; } void addBudget( float , Budget & ) ; float getDivBudget( ) { return auxBudget ; } };
{
auxBudget += b;
div.corpBudget += auxBudget;
}
Attention
Plz
// Contents of main program #include "budget3.h“
void main( ) { float amount;
int i; float bud;
};
int StaticDemo::x ; // 静态变量x将被StaticDemo类的所有对象共享,例如:
StaticDemo obj1, obj2 ;
obj1.putx(5) ;
obj1.puty( l0 ) ;
obj2.puty(20 ) ;
cout << "x: "<< obj1.getx( ) << " " << obj2.getx( ) << endl ;
public:
void Set(int i) { a.x = i; }
void Display( ) { a.Display( ); }
float Budget::corpBudget = 0 ;
// Definition of static member function. void Budget::mainOffice(float moffice) {
corpBudget += moffice; }
//主程序pr9-2.cpp的内容 #include " budget2.h“ void main( ) { float amount;
9.2.3 一个类作为另外一个类的友元
• 若一个类为另一个类的友元,则此类的所有成员 都能访问对方类的私有成员。
class A
{ int x;
friend class B; 不好 public:
的方
void Display( ){ cout<<x<<endl;}
法, } ;
勿模 class B
仿
{ A a;
cout << (i + 1) << " " ; cin >> bud; divisions[i].addBudget(bud); }
cout << "\n Here are the division budget :\n"; for ( i = 0; i < 4; i++) {
cout << "\t Division" << (i + 1) << "\t $ "; cout << divisions[i].getDivBudget( ) << endl; }
2
9.1.1 静态数据成员
1. 用关键字static声明; 2. 同一个类中的所有对象都共享该变量; 3. 必须在类外定义和初始化,用(::)来指明所属的类。 4. 静态变量不依赖于对象而存在,无论是否定义该类的
对象,这种类型的变量都存在。静态数据成员实际 上是在类外定义的一个变量,它的生存期和整个程 序的生存期一样,在定义对象之前,静态数据成员 就已经存在。
// Contents of budget3.cpp #include "budget3.h"
// Definition of static member of Budget class float Budget::corpBudget = 0;
// Definition of static member function mainOffice. void Budget::mainOffice(float moffice ) {
} cout << "\tTotal Requests (including main office):"; cout << divisions[0].getCorpBudget( ) << endl; }
auxi1.h budget3.h auxi1.cpp budget3.cpp 9-3.cpp
class Point
{
int xPos, yPos ;
public:
Point(int xx=0, int yy=0 )
{ xPos=xx; yPos=yy; }
int GetXPos( ) { return xPos; }
int GetYPos( ) { return yPos; }
friend double Distance(Point &a, Point &b);
cout << "y: "<< obj1.gety( ) <<" "<< obj2.gety( ) << endl ;
9.1.2 静态函数成员
– 静态函数成员是类中的一个函数,有static修饰。 – 静态函数成员和静态数据成员类似,在对象生成
之前也已经存在。这就是说在对象产生之前,静 态的函数成员就能访问其它静态成员。 – 类外代码可以使用类名和作用域操作符来调用静 态成员函数。 – 静态成员函数只能引用属于该类的静态数据成员 或静态成员函数。见例【例9-2】。