第一章 面向对象程序设计概述本章主要内容
1.C++语言的发展历史
2.C++程序举例 —— 重点
3.面向对象程序设计技术的一些基本特征
(1).数据抽象
(2).封装性和信息隐藏
(3).继承性
(4).多态性
4.熟练掌握 Visual C++上机环境 —— 重点
22:14:22
§ 1 C++语言发展简史
.C++语言由 AT&T公司 Bell实验室的 Bjarne Stroustrup设计
.带类的 C,1979年 10月 Cpre预处理器的开发,C中加入了
Simula67中引入的类,于此后在系统开发中,取得初步成功
.1985年:,C++程序设计语言,出版
.1989年:面向对象程序设计的支持更加完善
.1993年:进一步完善
.1994年:制定了 ANSI C++标准草案
.1998年,ISO C++ 98标准
.继续发展中
22:14:22
§ 2 简单的 C++程序举例例 1.经典的 Hello World程序
#include <iostream>
using namespace std;
void main()
{
cout <<"Hello World!" << endl
<< "This is our first C++ program." << endl;
}
eam.h>
void main()
{
cout <<"Hello World!" << endl
<< "This is our first C++ program." << endl;
}
新的 C++标准推荐使用第一种方法
22:14:22
例 2.读取输入数据,从键盘输入一个整数、一个实数、一个字符,一个字符串,再重新输出到屏幕上
#include <iostream>
using namespace std;
void main(){
int nA;
float fB;
char cC;
char pcD[20];
cout <<,Enter an integer,a float,a char & a
string:";
cin >> nA >> fB >> cC >> pcD;
cout << nA << " " << fB << " " << cC << " " << pcD
<< endl;
}
22:14:22
例 3.输入圆半径,求圆的周长和面积
#include <iostream>
using namespace std;
void main(){
float fR,fGirth,fArea;
const float pi=3.1415926f;
cout << "Enter radius:" << endl;
cin >> fR;
fGirth = 2*pi*fR;
fArea = pi*fR*fR;
cout << "Radius= " << fR << endl;
cout << "Girth= " << fGirth << endl;
cout << "Area= " << fArea << endl;
}
方法一,C语言的方法
22:14:22
方法二,面向对象的方法
#include <iostream>
using namespace std;
const float pi=3.1415926;
void main(){
Circle A,B;
A.Set_Radius(6.23f);
cout << "A.Radius= " << A.Get_Radius() << endl;
cout << "A.Girth= " << A.Girth() << endl;
cout << "A.Area= " << A.Area() << endl;
B.Set_Radius(10.5f);
cout << "B.Radius= " << B.Get_Radius() << endl;
cout << "B.Girth= " << B.Girth() << endl;
cout << "B.Area= " << B.Area() << endl;
}
22:14:22
class Circle{
float radius;
public:
void Set_Radius(float r){radius=r;}
float Get_Radius(){return radius;}
float Girth(){return 2*pi*radius;}
float Area(){return pi*radius*radius;}
};
实际的程序中,类必须在使用之前定义
22:14:22
小结
.C++程序的结构
.C++从 C演化而来,完全兼容 C:
.语法的许多方面都与 C语言的语法一致例如,main()函数的作用与 C中一样
.++ 的含义
.C++的程序基本由函数和类构成
.C++的程序一般由多个文件组成,这些文件由工程文件
(.dsp)进行组织与管理,若有多个工程文件 (.dsw),则由工作区间文件管理
22:14:22
§ 3面向对象程序设计技术的基本特性
抽象性,Abstraction
封装性 (Encapsulation)与信息隐藏 (Information Hiding)
继承性,Inheritance
多态性,Polymorphism
22:14:22
1.抽象性
– 把要解决的问题表示进计算机中的过程称为是抽象的过程
– 抽象是对现实世界的一种简化
– 如何抽象,去掉无关的因素,保留至关重要的因素
– 程序设计语言都提供抽象的能力
– 面向过程的程序设计语言要求程序员按计算机解题的步骤去思考,而不是按问题本身的特征去思考,程序员必须在解空间 (机器模型 )和问题空间 (实际要解决的问题的模型 )之间建立联系并做转换,使得软件难以编写且维护费用昂贵
22:14:22
– 面向对象程序设计方法直接在问题空间中对要解决的问题进行描述,并为程序员提供了在问题空间中表示各种事物元素的工具
– 面向对象技术中,把问题空间的元素和它们在解空间中的表示称为,对象,
– 通过在程序中使用对象,使得编写程序的过程就是在描述问题,而阅读程序代码相当于阅读表达该问题的文字
– 每个对象就象一台小计算机,能够实现自治
– 对象之间互相协作,完成任务,解决问题
22:14:22
2.封装性
– 对象是现实世界中事物,实体的计算机抽象
– 面向过程的程序中,数据 (操作对象 )和操作是分离的
– 现实世界中的事物具有一定的属性并能表现出一些行为
– 对象将表示属性的数据 (成员变量 ) 和表示行为的操作 (成员函数 )集成,封装在一起,并对外隐藏了对象内部的数据和操作的实现细节,仅暴露必须的部分 —对象的接口
– 同一种类的全部对象构成一个 类,在创建对象之前必须先创建该对象所属的类
– 封装可以定义为
一个明确定义的边界,对象的所有属性和行为被限定在这个边界内
一个接口,描述这个对象和其它对象之间的相互作用
受保护的内部实现,给出了对象提供的功能细节,这个实现细节在对象所属的类外不能访问
– 简言之,封装性指把数据和对数据的操作一体化,制成软件部件,从外界看,对象只是一个能接收和发送消息的机制,其内部状态及状态如何变化对外界是不可见的
22:14:22
封装性(续)
– 程序员分为 类创建者 和 客户程序员
– 类创建者的目标是建造类,类内部的一切细节对创建者都是可见的,由创建者负责其实现,并设臵类的接口
– 客户程序员的任务是收集各种类,应用适当的类创建相应的对象,从而构建应用程序
– 客户程序员不关心也不必知道类的内部实现,只关心并只能使用类的接口向对象发出请求 ( 发送消息 )
– 类的创建者可以随时改变类的实现,但只要类的对外接口不变,就不会影响客户程序员使用该类的方法,客户程序员已写好的程序不需做任何修改而只需重新编译链接即可
– 例:灯泡类
Light
on()
off()
brighten()
dim()
类名接口类创建者
Light lt;/*创建灯泡类的对象 */
lt.on(); /*开灯 */
lt.off();/*关灯 */
客户程序员
22:14:22
3.继承性
– 描述程序设计中类与类之间,is a kind of”关系的机制,
也是实现代码重用的有效机制水果苹果 梨国光 秦冠 富士图形
draw()
erase()
move()
getColor()
setColor()
圆形 正方形 三角形
22:14:22
继承性(续)
– 继承的实质是利用已有的类创建新类创建一个与已存在的类功能相似的类时不必从头开始创造一个全新的类,而是先将已存在的类克隆,然后对这个克隆进行扩充或修改,从而得到满足要求的新类父类、基类类 X
子类、派生类、导出类类 Y
已存在的类新类继承部分增加或修改部分
22:14:22
常见的两种继承
1) 在派生类中添加全新的成员,该成员不是基类接口的一部分,即派生类扩展了基类的接口,此时派生类与基类之间是,is-like-a”的关系
2) 修改或重新实现基类函数的行为 (overriding),派生类与基类具有相同的接口,此时派生类与基类之间是
,is a kind of”的关系无论哪种情况,派生类对象都可代替基类对象 ( 能使用基类对象的地方就可使用派生类对象,能发送给基类对象的消息就能发送给派生类对象 ),故可统一认为派生类与基类之间是,is a kind of”的关系
22:14:22
重用
– 类本身实现了代码的重用创建一个类后,可以创建任意多个该类的对象,这些对象之间完全是同构的
– 继承实现了接口的重用
– 例:图形类
void doStuff(Shape & s)
{
s.erase();
//…
s.draw();
}
Circle c;
Triangle t;
doStuff(c);
doStuff(t);
22:14:22
4.多态性
– 面向对象程序设计中的多态分为两个层次,静态多态与动态多态
– 静态多态:函数与运算符的重载
– 动态多态:虚函数与继承机制实现的多态
– 派生类与基类之间是,is a kind of”的关系,故能发送给基类对象的消息就能发送给派生类对象
– 派生类对象不是 100%的基类对象,故它对消息的响应与基类对象对同一消息的响应应该是不一样的
– 虚函数,virtual
– 动态绑定或滞后绑定
22:14:22
§ 4 Visual C++上机环境介绍
VC与 TC调试程序用功能键对照表
TC 含义 VC
CTRL+ F9 Run CTRL+ F5
Debug F5
CTRL+ F2 Reset Program SHIFT+F5
F7 Step Into F11
F8 Step Over F10
F4 Run to Cursor CTRL+F10
22:14:22
1.C++语言的发展历史
2.C++程序举例 —— 重点
3.面向对象程序设计技术的一些基本特征
(1).数据抽象
(2).封装性和信息隐藏
(3).继承性
(4).多态性
4.熟练掌握 Visual C++上机环境 —— 重点
22:14:22
§ 1 C++语言发展简史
.C++语言由 AT&T公司 Bell实验室的 Bjarne Stroustrup设计
.带类的 C,1979年 10月 Cpre预处理器的开发,C中加入了
Simula67中引入的类,于此后在系统开发中,取得初步成功
.1985年:,C++程序设计语言,出版
.1989年:面向对象程序设计的支持更加完善
.1993年:进一步完善
.1994年:制定了 ANSI C++标准草案
.1998年,ISO C++ 98标准
.继续发展中
22:14:22
§ 2 简单的 C++程序举例例 1.经典的 Hello World程序
#include <iostream>
using namespace std;
void main()
{
cout <<"Hello World!" << endl
<< "This is our first C++ program." << endl;
}
eam.h>
void main()
{
cout <<"Hello World!" << endl
<< "This is our first C++ program." << endl;
}
新的 C++标准推荐使用第一种方法
22:14:22
例 2.读取输入数据,从键盘输入一个整数、一个实数、一个字符,一个字符串,再重新输出到屏幕上
#include <iostream>
using namespace std;
void main(){
int nA;
float fB;
char cC;
char pcD[20];
cout <<,Enter an integer,a float,a char & a
string:";
cin >> nA >> fB >> cC >> pcD;
cout << nA << " " << fB << " " << cC << " " << pcD
<< endl;
}
22:14:22
例 3.输入圆半径,求圆的周长和面积
#include <iostream>
using namespace std;
void main(){
float fR,fGirth,fArea;
const float pi=3.1415926f;
cout << "Enter radius:" << endl;
cin >> fR;
fGirth = 2*pi*fR;
fArea = pi*fR*fR;
cout << "Radius= " << fR << endl;
cout << "Girth= " << fGirth << endl;
cout << "Area= " << fArea << endl;
}
方法一,C语言的方法
22:14:22
方法二,面向对象的方法
#include <iostream>
using namespace std;
const float pi=3.1415926;
void main(){
Circle A,B;
A.Set_Radius(6.23f);
cout << "A.Radius= " << A.Get_Radius() << endl;
cout << "A.Girth= " << A.Girth() << endl;
cout << "A.Area= " << A.Area() << endl;
B.Set_Radius(10.5f);
cout << "B.Radius= " << B.Get_Radius() << endl;
cout << "B.Girth= " << B.Girth() << endl;
cout << "B.Area= " << B.Area() << endl;
}
22:14:22
class Circle{
float radius;
public:
void Set_Radius(float r){radius=r;}
float Get_Radius(){return radius;}
float Girth(){return 2*pi*radius;}
float Area(){return pi*radius*radius;}
};
实际的程序中,类必须在使用之前定义
22:14:22
小结
.C++程序的结构
.C++从 C演化而来,完全兼容 C:
.语法的许多方面都与 C语言的语法一致例如,main()函数的作用与 C中一样
.++ 的含义
.C++的程序基本由函数和类构成
.C++的程序一般由多个文件组成,这些文件由工程文件
(.dsp)进行组织与管理,若有多个工程文件 (.dsw),则由工作区间文件管理
22:14:22
§ 3面向对象程序设计技术的基本特性
抽象性,Abstraction
封装性 (Encapsulation)与信息隐藏 (Information Hiding)
继承性,Inheritance
多态性,Polymorphism
22:14:22
1.抽象性
– 把要解决的问题表示进计算机中的过程称为是抽象的过程
– 抽象是对现实世界的一种简化
– 如何抽象,去掉无关的因素,保留至关重要的因素
– 程序设计语言都提供抽象的能力
– 面向过程的程序设计语言要求程序员按计算机解题的步骤去思考,而不是按问题本身的特征去思考,程序员必须在解空间 (机器模型 )和问题空间 (实际要解决的问题的模型 )之间建立联系并做转换,使得软件难以编写且维护费用昂贵
22:14:22
– 面向对象程序设计方法直接在问题空间中对要解决的问题进行描述,并为程序员提供了在问题空间中表示各种事物元素的工具
– 面向对象技术中,把问题空间的元素和它们在解空间中的表示称为,对象,
– 通过在程序中使用对象,使得编写程序的过程就是在描述问题,而阅读程序代码相当于阅读表达该问题的文字
– 每个对象就象一台小计算机,能够实现自治
– 对象之间互相协作,完成任务,解决问题
22:14:22
2.封装性
– 对象是现实世界中事物,实体的计算机抽象
– 面向过程的程序中,数据 (操作对象 )和操作是分离的
– 现实世界中的事物具有一定的属性并能表现出一些行为
– 对象将表示属性的数据 (成员变量 ) 和表示行为的操作 (成员函数 )集成,封装在一起,并对外隐藏了对象内部的数据和操作的实现细节,仅暴露必须的部分 —对象的接口
– 同一种类的全部对象构成一个 类,在创建对象之前必须先创建该对象所属的类
– 封装可以定义为
一个明确定义的边界,对象的所有属性和行为被限定在这个边界内
一个接口,描述这个对象和其它对象之间的相互作用
受保护的内部实现,给出了对象提供的功能细节,这个实现细节在对象所属的类外不能访问
– 简言之,封装性指把数据和对数据的操作一体化,制成软件部件,从外界看,对象只是一个能接收和发送消息的机制,其内部状态及状态如何变化对外界是不可见的
22:14:22
封装性(续)
– 程序员分为 类创建者 和 客户程序员
– 类创建者的目标是建造类,类内部的一切细节对创建者都是可见的,由创建者负责其实现,并设臵类的接口
– 客户程序员的任务是收集各种类,应用适当的类创建相应的对象,从而构建应用程序
– 客户程序员不关心也不必知道类的内部实现,只关心并只能使用类的接口向对象发出请求 ( 发送消息 )
– 类的创建者可以随时改变类的实现,但只要类的对外接口不变,就不会影响客户程序员使用该类的方法,客户程序员已写好的程序不需做任何修改而只需重新编译链接即可
– 例:灯泡类
Light
on()
off()
brighten()
dim()
类名接口类创建者
Light lt;/*创建灯泡类的对象 */
lt.on(); /*开灯 */
lt.off();/*关灯 */
客户程序员
22:14:22
3.继承性
– 描述程序设计中类与类之间,is a kind of”关系的机制,
也是实现代码重用的有效机制水果苹果 梨国光 秦冠 富士图形
draw()
erase()
move()
getColor()
setColor()
圆形 正方形 三角形
22:14:22
继承性(续)
– 继承的实质是利用已有的类创建新类创建一个与已存在的类功能相似的类时不必从头开始创造一个全新的类,而是先将已存在的类克隆,然后对这个克隆进行扩充或修改,从而得到满足要求的新类父类、基类类 X
子类、派生类、导出类类 Y
已存在的类新类继承部分增加或修改部分
22:14:22
常见的两种继承
1) 在派生类中添加全新的成员,该成员不是基类接口的一部分,即派生类扩展了基类的接口,此时派生类与基类之间是,is-like-a”的关系
2) 修改或重新实现基类函数的行为 (overriding),派生类与基类具有相同的接口,此时派生类与基类之间是
,is a kind of”的关系无论哪种情况,派生类对象都可代替基类对象 ( 能使用基类对象的地方就可使用派生类对象,能发送给基类对象的消息就能发送给派生类对象 ),故可统一认为派生类与基类之间是,is a kind of”的关系
22:14:22
重用
– 类本身实现了代码的重用创建一个类后,可以创建任意多个该类的对象,这些对象之间完全是同构的
– 继承实现了接口的重用
– 例:图形类
void doStuff(Shape & s)
{
s.erase();
//…
s.draw();
}
Circle c;
Triangle t;
doStuff(c);
doStuff(t);
22:14:22
4.多态性
– 面向对象程序设计中的多态分为两个层次,静态多态与动态多态
– 静态多态:函数与运算符的重载
– 动态多态:虚函数与继承机制实现的多态
– 派生类与基类之间是,is a kind of”的关系,故能发送给基类对象的消息就能发送给派生类对象
– 派生类对象不是 100%的基类对象,故它对消息的响应与基类对象对同一消息的响应应该是不一样的
– 虚函数,virtual
– 动态绑定或滞后绑定
22:14:22
§ 4 Visual C++上机环境介绍
VC与 TC调试程序用功能键对照表
TC 含义 VC
CTRL+ F9 Run CTRL+ F5
Debug F5
CTRL+ F2 Reset Program SHIFT+F5
F7 Step Into F11
F8 Step Over F10
F4 Run to Cursor CTRL+F10
22:14:22