C++语言程序设计
第 4讲,类与对象 /5
对象的概念
? 对象是现实世界的实体,是由一组状态和行
为组成的集合。
? 面向对象的方法:把问题看作成由许多彼此
互相联系的对象组成。
? 面向对象的程序设计 OOP,Object Oriented
Programming;
? 把数据和函数封装在称为对象的包中,公布对象的
接口,而将实现的细节隐蔽起来。
对象是现实世界的实体,是由一组状
态和行为组成的集合。
?例 1:图书馆
? 状态,共有多少类图书;每类图书有多少册;读者人数;
馆内库存有多少本;正在阅读的有多少本;外借多少
本; ……
? 行为,办图书证;图书检索;阅览室阅读;外借阅
读; ……
?例 2:学校
? 状态,总人数;教师人数;本科生人数;研究生人数;科
研成果; ……
? 行为,招生;毕业;授课;实验;考试;科研; ……
面向对象的方法,把问题看作成由许
多彼此互相联系的对象组成。
?例:学校管理
? 学校管理工作,学籍管理、教务管理、教师管理、住宿管
理、伙食管理、科研管理,……
? 学籍管理:入学、成绩、奖惩、毕业 ……
? 教务管理:课程设置、排课、质量监督 ……
? 住宿管理:宿舍安排、打扫卫生、安全保卫 ……
? 伙食管理:饭卡管理、承包管理、卫生监督 ……
? 科研管理:项目申请、设备采购、项目鉴定 ……
?作为校长不必每件事都去具体管理,他只要设置一个
部门去管理就行了。这些部门就是 对象!!!
大的单位的管理必须划分不同的职能部门( Object)。
?结构的定义
struct Time
{ int hour; int minute; int second; };
? Time就是一个数据类型
Time timeObject,timeArray[10],*timePtr;
?访问结构的成员
cout << timeObject.hour;
cout << timePtr->hour;
?用结构实现用户定义的类型 Time
? 结构建立数据类型的缺陷,
? 无初始化,可读性差,可维护性差。
void ShowTime(int hr,int min,int sec);
main()
{
ShowTime(9,30,0);
return 0;
}
void ShowTime(int hr,int min,int sec)
{
cout << (hr < 10?,0”,,”) << hr <<,:”
<< (min < 10?,0”,,”) << min <<,:”
<< (sec < 10?,0”,,”) << sec;
}
09:30:00
struct Clock
{ int hour; int minute; int second; };
void ShowTime(const Clock&);
main()
{ Clock myClock={9,30,0};
ShowTime(myClock);
return 0;
}
void ShowTime(const Clock& c)
{
cout << (c.hour < 10?,0”,,”) << c.hour <<,:”
<< (c.minute < 10?,0”,,”) << c.minute <<,:”
<< (c.second < 10?,0”,,”) << c.second << endl;
}
09:30:00
? class Clock {
public,
Clock();
void SetTime (int,int,int);
void ShowTime();
private,
int hour; int minute; int second;
};
1) 以关键字,class开始;
2) 构造函数,constructor // 自动执行初始化
3) 公有函数,public // 供外部调用
4) 私有函数,private // 外部不能访问 (有一个例外,以后再介绍)
构造函数
行为:公有函数
状态:私有函数
类和对象
Clock::Clock() // constructor
{ hour = 0; minute = 0; second = 0; }
void Clock::SetTime(int hr,int min,int sec)
{
hour = ( hr >= 0 && hr < 24 )? hr, 0;
minute = ( min >= 0 && min < 60 )? min, 0;
second = ( sec >= 0 && sec < 60 )? sec, 0;
}
void Clock::ShowTime()
{
cout << (hour < 10?,0”,,”) << hour <<,:”
<< (minute < 10?,0”,,”) << minute <<,:”
<< (second < 10?,0”,,”) << second << endl;
}
void main()
{
Clock c;
c.SetTime(8,30,30);
c.ShowTime();
c.hour = 9;
}
?
结构与类的比较
?结构 好比是一个无人管理的开放的阅览室,所
有的报刊杂志都放在那里,读者可自主挑选。
?类 则好比是有管理员的图书馆,看书借书必须
通过管理员许可。
C语言只能建一个阅览室,C++可以建一个图书馆。
?类的作用域和访问类的成员
?关于作用域
?文件作用域,在本工程( project)的所有文件范
围内。
?类的作用域,在类的定义范围内,即所有数据成
员和成员函数内。
?在文件作用域内定义变量或函数,即全局变量或
函数。
?在类的作用域内定义变量或函数,即数据成员和
成员函数。
?
构造函数
class Clock {
public,
Clock();
Clock(int NewH,int NewM,int NewS);
void SetTime (int,int,int);
void ShowTime();
private,
int hour; int minute; int second;
};
Clock::Clock() { hour = minute = second = 0; }
Clock::Clock(int NewH,int NewM,int NewS)
{
hour = NewH; minute = NewM; second = NewS;
}
class Point
{ public,
Point(int xx=0,int yy=0) { X = xx; Y = yy; }
Point(Point &p); // 拷贝构造函数
int GetX() { return X; }
int GetY() { return Y; }
private,
int X,Y;
};
Point::Point(Point &p)
{
X = p.X; Y = p.Y;
cout <<,拷贝构造函数被调用” << endl;
}
int main()
{ Point A(1,2);
Point B(A); // 用对象 A初试化对象 B,拷贝构造函数被调用
cout << B.GetX() << endl;
return 0;
}
当用类的一个对象去初
始化该类的另一个对象
时系统自动调用拷贝构
造函数实现拷贝赋值。
拷贝 构造函数
void f (Point p)
{ cout<<p.GetX()<<endl;
}
int main()
{ Point A(1,2);
f (A); //调用拷贝构造函数
return 0;
}
Point g()
{ Point A(1,2);
return A; //调用拷贝构造函数
}
int main()
{
Point B;
B = g();
return 0;
}
若函数的形参为类对象,
调用函数时,实参赋值
给形参,系统自动调用
拷贝构造函数。
当函数的返回值是类对
象时,系统自动调用拷
贝构造函数。
?访问函数和工具函数
? 将类的函数分为两大类,访问函数和工具函数。
? 访问函数是供客户调用的,一般为 public。
? 工具函数是为实现访问函数的某些功能而需要的函数,一
般为 private。
?初始化类的对象:构造函数
? 构造函数可使每个对象都有正确的初始值。
?在构造函数中使用默认参数
class Time {
public,Time ( int=0,int=0,int=0 );
……
析构函数
class Clock {
public,
Clock();
void SetTime (int,int,int);
void ShowTime();
~Clock(); // 析构函数
private,
int hour; int minute; int second;
char* pbuf;
};
Clock::Clock() { pbuf = new char[128]; }
Clock::~Clock() { delete[] pbuf; }
对象被删除的时刻自动调用
main()
{
Clock c; // 构造
c.SetTime(9,30,30);
} // 析构
?析构函数的使用
?一个类只能有一个析构函数,不允许重载!
?调用析构函数和构造函数的时机
结论,
? 最先析构的是自动变量;
? 静态对象的生命期一直到程序结束;( static)
? 全局对象是最后被析构的。
?数据成员和成员函数的使用
? 数据一般设为私有成员,便于保护;
? 需要用户设置的私有数据成员用 get和 set提供给用户;
? 要保证私有数据成员在任何时候都是有效的。
?接口与实现的分离
?软件工程的一个最基本的原则,接口与实现
分离
?.h文件与,cpp文件分离
?类的定义与类的实现分离
?但是 Java中类的定义与实现是在一起的,Why?
?因为 Java中有一个专门管接口的类叫 Interface。这
个类是公开的,而其他类则被屏蔽起来。
这种方式称为对象的, 包装, 或称, 封
装, 。
?public:,private,( protected,) 都是用来控制
成员函数的作用。
? 类的客户可通过公有成员 (public)知道类提供什么样的服务。
? 类的客户不能直接访问类的私有成员 (private),它们只能
通过成员函数(或友元)来访问。
? C++提倡编写与实现无关的程序。 在类定义中尽量避免写函
数实现的代码。(也不是绝对的,只要觉得可以公开,并以
后不会改动,则可以将实现写到类的定义中)
? [注意 ]在理论上 public:,private,protected,只使用一
次。但现在 C++编译器(如 VC++)可支持多次。而在 Java中每
一个函数前面都要求加上这个说明符。
§ 控制对成员的访问
§ 软件的可重用性
?面向对象的程序设计的一个重要目标就是 软件
的可重用性 。
?可重用性意味着以前的代码可以部分加以利用,
并对其余部分改写,以免整个程序重新编写。
?要实现可重用性,程序必须设计良好、具有较
好的可读性,并预先把需要扩展部分考虑好。
?