C课件C3_9
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2) 如果函数的形参是类的对象,调用函数时,进 行形参和实参结合时
3) 如果函数的返回值是类的对象,函数执行完成 返回调用时。
前一页 休息
40
拷贝构造函数举例
若函数的形参为类对象,调用函数时,
实参赋值给形参,系统自动调用拷贝 构造函数。例如:
void fun1(Point p) { cout<<p.GetX()<<endl; } void main() { Point A(1,2);
前一页 休息
27
实例及程序调试(testClock)
请设计一个可显示北京时间、第比利斯时间和首尔 时间的时钟类,并使用时钟类显示某一时刻的北京时间、 第比利斯时间和首尔时间。
前一页 休息
28
C++面向对象编程约定之一
一般将类的定义放在头文件(.h)中,类 的实现放在源文件(.cpp)中,而main主函数 可以放在另一个源文件中。在源文件中用 #include编译预处理指令包含头文件。
例如,公有成员函数调用: t1.setTime(); start.showTime(); pt1->setTime();
而任何形如t1.hour、t1.minute、start.second等私 有成员变量的直接访问都是非法的。
前一页 休息
26
例: 类Clock的使用
main() {
Clock EndTime; // 声明对象EndTime EndTime.setTime(12, 23, 36);// 设置对象EndTime cout<<"The time is:"; EndTime.showTime(); // 显示对象EndTime的时间 }
– 目的是增强安全性和简化编程,使用者 不必了解具体的实现细节,而只需要通 过外部接口,以特定的访问权限,来使 用类的成员。
– 实现封装:类声明中的{ }
前一页 休息
10
封装
实例:
class Clock
{
外部接口
public: void SetTime(int NewH,int NewM,
int NewS); void ShowTime( );
前一页 休息
6
抽象实例——钟表
钟表
int Hour int Minute int Second
数据抽象:描述某类对象的属性
前一页 休息
7
抽象实例——钟表
钟表
int Hour int Minute int SSeetcToinmde( ) ShowTim e( )
代码抽象:描述某类对象的 共有行为
抽象是对具体对象(问题)进行概括, 抽出这一类对象的公共性质并加以描述 的过程。
– 先注意问题的本质及描述,其次是实现过 程或细节。
– 数据抽象:描述某类对象的属性。 – 代码抽象:描述某类对象的共有的行为。 – 抽象的实现:通过类的声明。
前一页 休息
5
抽象实例——钟表
Clock
先注意问题的本质及描述
前一页 休息
19
类的成员
class Clock {
成员函数
public: void SetTime(int NewH, int NewM, int NewS); void ShowTime( );
private:
int Hour, Minute, Second;
};
数据成员
前一页 休息
20
例: 定义类Clock(表示时间)。
class Point {
public: void Init(int initX,int initY); int GetX( ); int GetY( );
private: int X,Y;
};
前一页 休息
32
inline void Point:: Init(int initX,int initY)
前一页 休息
29
9.3 内联成员函数
为了提高运行时的效率,对于较简单 的函数可以声明为内联形式。
内联函数体中不要有复杂结构(如循 环语句和switch语句)。
在类中声明内联成员函数有二种方式:
(1)将函数体放在类的声明中。 (2)使用inline关键字。
前一页 休息
30
内联成员函数举例(方式一)
void setTime(int, int, int); // 成员函数,设置时间
void showTime();
// 成员函数,输出时间
};
前一页 休息
公有成员函数setTime、showTime 可在外部被调用,但必须通过一个 对象作为对象的成员使用。
21
类的实现
利用C++类进行面向对象编程,定义类的成员只 是完成了工作的第一步,最重要的工作是实现 定义的类。
fun1(A); //调用拷贝构造函数 }
前一页 休息
41
拷贝构造函数举例
当函数的返回值是类对象时,系统自动调用拷贝构 造函数。例如: Point fun2( )
{
Point A(1,2); return A; //调用拷贝构造函数
} void main( )
{
Point B; B = fun2( );
前一页 休息
8
抽象实例——钟表类
class Clock { public:
void SetTime(int NewH, int NewM,int NewS); void ShowTime( ); private: int Hour,Minute,Second; };
前一页 休息
9
封装
将抽象出的数据成员、代码成员相结 合,将它们视为一个整体。
前一页 休息
17
私有类型成员(private)
在关键字private后面声明,只允许 本类中的成员函数访问,而类外部的任 何函数都不能访问。
如果紧跟在类名称的后面声明私有成员, 则关键字private可以省略。
前一页 休息
18
保护类型(protected)
表示数据成员和成员函数是类的保 护成员,它们允许被本类的成员函数和 派生类的成员函数访问或调用。
}
前一页 休息
23
ຫໍສະໝຸດ Baidu
类与对象
模具
前一页 休息
产品
24
用类创建对象
对象是类的一个实例,定义并实现了类, 就可以利用定义好的类来声明对象,即创建对 象。声明对象的形式与声明普通变量类似,例 如:
Clock t1, start ; Clock *pt1=&t1 ;
前一页 休息
25
成员的访问
声明对象后,就可以通过成员运算符“ . ”或指向运 算符“->”访问对象的公有成员,但不能访问对象的私有 成员。
private: int Hour,Minute,Second;
};
特定的访问权限
边界
前一页 休息
11
继承与派生(结构优化)
是C++中支持层次分类的一种机制, 允许程序员在保持原有类特性的基础上, 进行更具体的说明。
实现:声明派生类——以后介绍
前一页 休息
12
多态性
多态:是指类中具有相似功能的不同函数使用 同一个名称来实现,并允许不同类的对象对同 一消息作出的响应不相同。
{
hour = (h>=0 && h<24) ? h:0;
// 设置时间
minute = (m>=0 && m<60) ? m:0;
second = (s>=0 && s<60) ? s:0;
}
void Clock::showTime()
{
cout<<hour<<':'<<minute<<':'<<second<<endl;
– 例:testClock_Constructor
在对象创建时由系统自动调用。
如果程序中未声明,则系统自动产生出一个缺省形式 的构造函数
构造函数允许为内联函数。
– 例: testClock_Constructor1
构造函数允许重载。
– 例: testClock_Constructor2
前一页 休息
class Point {
public: void Init(int initX,int initY) { X=initX; Y=initY; } int GetX( ) {return X;} int GetY( ) {return Y;}
private: int X,Y;
};
前一页 休息
31
内联成员函数举例(方式二)
}
前一页 休息
42
拷贝构造函数
如果程序员没有为类声明拷贝构造 函数,则编译器自己生成一个拷贝构造 函数。
这个构造函数的功能:用作为初始 值的对象的每个数据成员的值,初始化 将要建立的对象的对应数据成员。
前一页 休息
43
析构函数
完成对象被删除前的一些清理工作。 在对象的生存期结束的时刻系统自动
class Clock{ private:
私有数据成员hour、minute 和second只能在类的成员 // 最好不函要数省中略被p访ri问va或te赋值;
int hour;
// 数据成员,表示小时
int minute;
// 数据成员,表示分钟
int second;
// 数据成员,表示秒
public:
35
+例: 控制电灯风扇
由多个类组成的应用程序
前一页 休息
36
习题:控制电灯风扇屏幕
前一页 休息
37
拷贝构造函数
当我们使用一个已经存在的对象去初 始化一个新的同类的对象时,需要用到拷 贝构造函数。
前一页 休息
38
拷贝构造函数
拷贝构造函数是一种特殊的构造函数,其形参为本类的对象引用。 class 类名 { public :
目的:达到行为标识统一,减少程序中标识符 的个数。
实现:重载函数和虚函数——以后介绍
前一页 休息
13
9.2 类与对象
前一页 休息
14
c++中的类
类是具有相同属性和行为的一组对象 的集合,它为属于该类的全部对象提 供了统一的抽象描述,其内部包括属 性和行为两个主要部分。
利用类可以实现数据的封装、隐藏、 继承与派生。
类名(形参);//构造函数 类名(类名 &对象名);//拷贝构造函数
... }; 类名:: 类名(类名 &对象名)//拷贝构造函数的实现 { 函数体 }
例:拷贝构造函数
前一页 休息
39
拷贝构造函数
• 普通构造函数是在创建对象时被调用。
• 拷贝构造函数在以下三种情况下都会被调用
1) 当用类的一个对象去初始化该类的另一个对象 时。例:拷贝构造函数
利用类易于编写大型复杂程序,其模 块化程度比C中采用函数更高。
前一页 休息
15
类的声明形式
类是一种用户自定义类型,声明形式:
class 类名称 {
public: 公有成员(外部接口)
private: 私有成员
protected: 保护型成员
}
前一页 休息
16
公有类型成员(public)
在关键字public后面声明,它们是类 与外部的接口,任何外部函数都可以访 问公有类型数据和函数。
第9章 类与对象(3-9)
1
本章主要内容
6.1 面向对象的基本特征 6.2 类与对象 6.3 内联成员函数 6.4 构造函数与析构函数
前一页 休息
2
6.5 类的聚集
6.6 类模板
前一页 休息
3
9.1面向对象程序设计四个基本特征
抽象 封装 继承 多态性
前一页 休息
4
抽象(找对象、抽象类)
调用它,然后再释放此对象所属的空 间。 如果程序中未声明析构函数,编译器 将自动产生一个缺省的析构函数。
前一页 休息
44
构造函数和析构函数举例
#include<iostream.h> class Point {
public: Point(int xx,int yy); ~Point( ); //...其它函数原形
private: int X,int Y;
};
前一页 休息
45
Point::Point(int xx,int yy)
{
X=xx; Y=yy;
}
Point::~Point( )
{
}
//...其它函数的实现略
例:构造函数与析构函数
前一页 休息
47
+例:控制电灯风扇_构造函数
前一页 休息
48
{ X=initX; Y=initY;
}
inline int Point::GetX( ) {
return X; }
inline int Point::GetY( ) {
return Y; }
9.4 构造函数与析构函数
构造函数 拷贝构造函数 析构函数
前一页 休息
34
构造函数
构造函数的作用是在对象被创建时使用特定的值构造 对象,或者说将对象初始化为一个特定的状态。
类的实现实质上是类的成员函数的实现,即定 义类的成员函数。
成员函数的定义形式与一般函数的定义形式基 本相同,但必须在成员函数名前加上类名和作 用域限定符(::)。
成员函数的定义也可放在类体内(该函数声明之
处),这时成员函数将变成内联函数
前一页 休息
22
例: 类Clock的实现
void Clock::setTime(int h, int m, int s)
3) 如果函数的返回值是类的对象,函数执行完成 返回调用时。
前一页 休息
40
拷贝构造函数举例
若函数的形参为类对象,调用函数时,
实参赋值给形参,系统自动调用拷贝 构造函数。例如:
void fun1(Point p) { cout<<p.GetX()<<endl; } void main() { Point A(1,2);
前一页 休息
27
实例及程序调试(testClock)
请设计一个可显示北京时间、第比利斯时间和首尔 时间的时钟类,并使用时钟类显示某一时刻的北京时间、 第比利斯时间和首尔时间。
前一页 休息
28
C++面向对象编程约定之一
一般将类的定义放在头文件(.h)中,类 的实现放在源文件(.cpp)中,而main主函数 可以放在另一个源文件中。在源文件中用 #include编译预处理指令包含头文件。
例如,公有成员函数调用: t1.setTime(); start.showTime(); pt1->setTime();
而任何形如t1.hour、t1.minute、start.second等私 有成员变量的直接访问都是非法的。
前一页 休息
26
例: 类Clock的使用
main() {
Clock EndTime; // 声明对象EndTime EndTime.setTime(12, 23, 36);// 设置对象EndTime cout<<"The time is:"; EndTime.showTime(); // 显示对象EndTime的时间 }
– 目的是增强安全性和简化编程,使用者 不必了解具体的实现细节,而只需要通 过外部接口,以特定的访问权限,来使 用类的成员。
– 实现封装:类声明中的{ }
前一页 休息
10
封装
实例:
class Clock
{
外部接口
public: void SetTime(int NewH,int NewM,
int NewS); void ShowTime( );
前一页 休息
6
抽象实例——钟表
钟表
int Hour int Minute int Second
数据抽象:描述某类对象的属性
前一页 休息
7
抽象实例——钟表
钟表
int Hour int Minute int SSeetcToinmde( ) ShowTim e( )
代码抽象:描述某类对象的 共有行为
抽象是对具体对象(问题)进行概括, 抽出这一类对象的公共性质并加以描述 的过程。
– 先注意问题的本质及描述,其次是实现过 程或细节。
– 数据抽象:描述某类对象的属性。 – 代码抽象:描述某类对象的共有的行为。 – 抽象的实现:通过类的声明。
前一页 休息
5
抽象实例——钟表
Clock
先注意问题的本质及描述
前一页 休息
19
类的成员
class Clock {
成员函数
public: void SetTime(int NewH, int NewM, int NewS); void ShowTime( );
private:
int Hour, Minute, Second;
};
数据成员
前一页 休息
20
例: 定义类Clock(表示时间)。
class Point {
public: void Init(int initX,int initY); int GetX( ); int GetY( );
private: int X,Y;
};
前一页 休息
32
inline void Point:: Init(int initX,int initY)
前一页 休息
29
9.3 内联成员函数
为了提高运行时的效率,对于较简单 的函数可以声明为内联形式。
内联函数体中不要有复杂结构(如循 环语句和switch语句)。
在类中声明内联成员函数有二种方式:
(1)将函数体放在类的声明中。 (2)使用inline关键字。
前一页 休息
30
内联成员函数举例(方式一)
void setTime(int, int, int); // 成员函数,设置时间
void showTime();
// 成员函数,输出时间
};
前一页 休息
公有成员函数setTime、showTime 可在外部被调用,但必须通过一个 对象作为对象的成员使用。
21
类的实现
利用C++类进行面向对象编程,定义类的成员只 是完成了工作的第一步,最重要的工作是实现 定义的类。
fun1(A); //调用拷贝构造函数 }
前一页 休息
41
拷贝构造函数举例
当函数的返回值是类对象时,系统自动调用拷贝构 造函数。例如: Point fun2( )
{
Point A(1,2); return A; //调用拷贝构造函数
} void main( )
{
Point B; B = fun2( );
前一页 休息
8
抽象实例——钟表类
class Clock { public:
void SetTime(int NewH, int NewM,int NewS); void ShowTime( ); private: int Hour,Minute,Second; };
前一页 休息
9
封装
将抽象出的数据成员、代码成员相结 合,将它们视为一个整体。
前一页 休息
17
私有类型成员(private)
在关键字private后面声明,只允许 本类中的成员函数访问,而类外部的任 何函数都不能访问。
如果紧跟在类名称的后面声明私有成员, 则关键字private可以省略。
前一页 休息
18
保护类型(protected)
表示数据成员和成员函数是类的保 护成员,它们允许被本类的成员函数和 派生类的成员函数访问或调用。
}
前一页 休息
23
ຫໍສະໝຸດ Baidu
类与对象
模具
前一页 休息
产品
24
用类创建对象
对象是类的一个实例,定义并实现了类, 就可以利用定义好的类来声明对象,即创建对 象。声明对象的形式与声明普通变量类似,例 如:
Clock t1, start ; Clock *pt1=&t1 ;
前一页 休息
25
成员的访问
声明对象后,就可以通过成员运算符“ . ”或指向运 算符“->”访问对象的公有成员,但不能访问对象的私有 成员。
private: int Hour,Minute,Second;
};
特定的访问权限
边界
前一页 休息
11
继承与派生(结构优化)
是C++中支持层次分类的一种机制, 允许程序员在保持原有类特性的基础上, 进行更具体的说明。
实现:声明派生类——以后介绍
前一页 休息
12
多态性
多态:是指类中具有相似功能的不同函数使用 同一个名称来实现,并允许不同类的对象对同 一消息作出的响应不相同。
{
hour = (h>=0 && h<24) ? h:0;
// 设置时间
minute = (m>=0 && m<60) ? m:0;
second = (s>=0 && s<60) ? s:0;
}
void Clock::showTime()
{
cout<<hour<<':'<<minute<<':'<<second<<endl;
– 例:testClock_Constructor
在对象创建时由系统自动调用。
如果程序中未声明,则系统自动产生出一个缺省形式 的构造函数
构造函数允许为内联函数。
– 例: testClock_Constructor1
构造函数允许重载。
– 例: testClock_Constructor2
前一页 休息
class Point {
public: void Init(int initX,int initY) { X=initX; Y=initY; } int GetX( ) {return X;} int GetY( ) {return Y;}
private: int X,Y;
};
前一页 休息
31
内联成员函数举例(方式二)
}
前一页 休息
42
拷贝构造函数
如果程序员没有为类声明拷贝构造 函数,则编译器自己生成一个拷贝构造 函数。
这个构造函数的功能:用作为初始 值的对象的每个数据成员的值,初始化 将要建立的对象的对应数据成员。
前一页 休息
43
析构函数
完成对象被删除前的一些清理工作。 在对象的生存期结束的时刻系统自动
class Clock{ private:
私有数据成员hour、minute 和second只能在类的成员 // 最好不函要数省中略被p访ri问va或te赋值;
int hour;
// 数据成员,表示小时
int minute;
// 数据成员,表示分钟
int second;
// 数据成员,表示秒
public:
35
+例: 控制电灯风扇
由多个类组成的应用程序
前一页 休息
36
习题:控制电灯风扇屏幕
前一页 休息
37
拷贝构造函数
当我们使用一个已经存在的对象去初 始化一个新的同类的对象时,需要用到拷 贝构造函数。
前一页 休息
38
拷贝构造函数
拷贝构造函数是一种特殊的构造函数,其形参为本类的对象引用。 class 类名 { public :
目的:达到行为标识统一,减少程序中标识符 的个数。
实现:重载函数和虚函数——以后介绍
前一页 休息
13
9.2 类与对象
前一页 休息
14
c++中的类
类是具有相同属性和行为的一组对象 的集合,它为属于该类的全部对象提 供了统一的抽象描述,其内部包括属 性和行为两个主要部分。
利用类可以实现数据的封装、隐藏、 继承与派生。
类名(形参);//构造函数 类名(类名 &对象名);//拷贝构造函数
... }; 类名:: 类名(类名 &对象名)//拷贝构造函数的实现 { 函数体 }
例:拷贝构造函数
前一页 休息
39
拷贝构造函数
• 普通构造函数是在创建对象时被调用。
• 拷贝构造函数在以下三种情况下都会被调用
1) 当用类的一个对象去初始化该类的另一个对象 时。例:拷贝构造函数
利用类易于编写大型复杂程序,其模 块化程度比C中采用函数更高。
前一页 休息
15
类的声明形式
类是一种用户自定义类型,声明形式:
class 类名称 {
public: 公有成员(外部接口)
private: 私有成员
protected: 保护型成员
}
前一页 休息
16
公有类型成员(public)
在关键字public后面声明,它们是类 与外部的接口,任何外部函数都可以访 问公有类型数据和函数。
第9章 类与对象(3-9)
1
本章主要内容
6.1 面向对象的基本特征 6.2 类与对象 6.3 内联成员函数 6.4 构造函数与析构函数
前一页 休息
2
6.5 类的聚集
6.6 类模板
前一页 休息
3
9.1面向对象程序设计四个基本特征
抽象 封装 继承 多态性
前一页 休息
4
抽象(找对象、抽象类)
调用它,然后再释放此对象所属的空 间。 如果程序中未声明析构函数,编译器 将自动产生一个缺省的析构函数。
前一页 休息
44
构造函数和析构函数举例
#include<iostream.h> class Point {
public: Point(int xx,int yy); ~Point( ); //...其它函数原形
private: int X,int Y;
};
前一页 休息
45
Point::Point(int xx,int yy)
{
X=xx; Y=yy;
}
Point::~Point( )
{
}
//...其它函数的实现略
例:构造函数与析构函数
前一页 休息
47
+例:控制电灯风扇_构造函数
前一页 休息
48
{ X=initX; Y=initY;
}
inline int Point::GetX( ) {
return X; }
inline int Point::GetY( ) {
return Y; }
9.4 构造函数与析构函数
构造函数 拷贝构造函数 析构函数
前一页 休息
34
构造函数
构造函数的作用是在对象被创建时使用特定的值构造 对象,或者说将对象初始化为一个特定的状态。
类的实现实质上是类的成员函数的实现,即定 义类的成员函数。
成员函数的定义形式与一般函数的定义形式基 本相同,但必须在成员函数名前加上类名和作 用域限定符(::)。
成员函数的定义也可放在类体内(该函数声明之
处),这时成员函数将变成内联函数
前一页 休息
22
例: 类Clock的实现
void Clock::setTime(int h, int m, int s)