第3章 类和对象(一)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
int main() { date d1; d1.year=2009; d1.month=5; d1.day=26; cout<<d1.year<<"."<<d1.month<<"."<<d1.day <<endl; return 0;
/* 03_01.cpp */ #include<iostream> using namespace std; struct date { int year; int month; int day; };
21
3.3.2 对象的定义
当定义一个类时,只是定义了一个数据类型,用这个数据类型定义 变量,这个变量就称为对象。 对象的定义,也称对象的创建,在C++中可以用以下两种方法定义 对象。 1. 在声明类的同时直接定义对象 即在声明类的右花括号“}”后,直接写出属于该类的对象名表。例如: class Point { private: int x,y; public: void SetPoint(int,int); int Getx(); int Gety(); } op1,op2; 这时定义的对象是一个全局对象。
6
类声明的一般格式如下: class 类名 { private: 私有数据成员; 私有成员函数; protected: 保护数据成员; 保护成员函数; public: 公有数据成员; 公有成员函数; };
7
说明: (1)class是类定义的关键字。 (2)类名由用户自定义,但必须是C++的有效标识符,且 一般首字母要大写。 (3)花括号中是类体,最后以分号“;”结束。 (4)private、 public、 protected这3个关键字是访问权限 控制符,限制了类成员的访问权限。 例如,下例中定义了一个描述日期的类。 class Date {private: //private可以默认 int year; //定义数据成员 int month; int day; public: void SetDate(int y,int m,int d); //成员函数声明 void ShowDate(); //成员函数声明 };
类把数据和行为封装在一起。ShowTime函数 用来输出本对象中的时、分、秒。setTime函 数用来设置新的时、分、秒数据成员。
5
3.1.2 类的构成
类主要由3部分组成,分别是:
类名 数据成员 成员函数
按访问权限划分,数据成员和成员函数又可分 为3种,分别是:
公有成员( private ) 保护成员( protected ) 私有成员( public )
10
用private将数据成员声明为私有的,类外的语句不能调 用private成员。如在主函数中用c1.hour=10是错的。但 类中的成员函数可以操作数据成员。如SetTime函数中 的赋值语句。 用public将SetTime函数声明为公有的。现在可以在外界 (类定义以外)程序代码中,调用该函数成员. 例如在主函数中可以执行: c1.SetTime(10,20,30 ); 这就是向对象c1发的一个消息,通知它执行SetTime( ) 方法,给 c1对象的数据成员赋值。 方法:在面向对象的程序设计中,将成员函数称为“方 法”。 “方法”是对数据的操作(由成员函数代码实现 的)。一个方法对应一种操作。
13
3.2
类的成员函数
类中的所有成员都要在类的类体中进行说明, 但成员函数的定义即可以在类体中给出,也可 以在类体外给出。 通常采用以下两种方式。 1.将成员函数的定义直接写在类体中 适合于函数体代码规模较小的情况。
14
例如,定义表示坐标点的类Point。 class Point { private: int x, y; public: void SetPoint(int a,int b) { x=a;y=b; } //函数体 int Getx() //获得x的值 { return x; } //函数体 int Gety() //获得y的值 {Hale Waihona Puke Baidureturn y; } //函数体 };
11
说明:
(1) private部分的成员,在类之外的不能存取,只 有类的成员函数可以存取。 (2) public部分的成员,可被程序中的任何函数或语 句存取。public部分多为成员函数,用来提供与外 界的接口,外界只有通过这个接口才可以操作 private部分的成员。 (3) protected部分的成员,不能在类之外存取,只 有类的成员函数及其子类(派生类)可以存取。 (4)定义类时,若不指明成员访问权限,系统默认 是private的。
17
在C++中,还可以用下面格式将成员函数声明为 类的内联函数。
inline 返回类型 类名::成员函数名(参数表) { //函数体 }
使用 inline 说明内联函数时,必须使函数体和 inline 说明结合在一起,否则编译器将它作为 普通函数处理。
18
例:定义描述图书的类:
数据(属性)有: 书名、编号; 成员函数(方法)有: 能设置书名、编号;能显示书名、编 号。
3.1.1 从结构体到类
结构体: 把各种类型的数据成员组织在一起. 类:把各类数据成员,还有对数据的操作 ——成员函数组织在 一起。 例如下面声明了一个日期结构体(只有数据成员): struct date { int year; int month; int day; };
2
【例3.1】
有关日期结构体的例子。
class Record { private: char bookname[20]; //数据成员,表示书名 int num; //数据成员,表示书的编号 public: //以下声明成员函数原型 void regist(char a[20],int b);//设置数据成员 void show( ); //显示数据成员的值 };
9
类的成员访问权限:
私有的(private): 类外不能调用; 公有的(public): 类外可以调用。 受保护的(protected):外界不能调用,但派生类可以调用。
可以将前面的Clock类定义修改如下:
class Clock { private: int hour; int minute; int second; public: void ShowTime( ) {cout<<hour<<“:”<< minute <<“:”<<second<<endl;} void setTime(int H, int M, int S) { hour=H; minute=M; second=S;} }; Clock c1,c2; //定义了2个Clock类的对象
16
例如,对于前面的表示坐标点的类 Point来说, 给出下面的定义(函数体在类外)。 class Point {private: int x,y; public: void SetPoint (int,int); 在类中只声明函数原型 int Getx(); int Gety(); }; void Point::SetPoint(int a,int b) { x=a; y=b; } int Point::Getx() 在类外定义函数 { return x; } int Point::Gety() { return y; }
8
3.1. 3
类成员的访问属性
类除了具有封装性外,还采用了信息隐蔽原则,使类中 的成员与外界的联系减少到最低限度。 如果前边定义的Clock类中的成员都对外隐蔽,外界就 不能调用它们,只有本类中的成员函数ShowTime()可以 使用类中的数据成员。 这样保证了数据的安全,但是外界不能调用成员函数, ShowTime()无法被执行。因此不能使全部成员都与外界 隔离。 一般把数据成员隐蔽起来,把成员函数公开化作为对外 界的接口。即让外界可以通过调用ShowTime函数,输 出对象的数据成员值; 通过调用SetTime函数,设置对象 的数据成员值
第 3章 本章要点:
类和对象(一)
类的定义与类的成员 对象的定义与使用 类的构造函数 重载构造函数 析构函数 UML及类图
1
3.1. 类的构成
类和对象是面向对象程序设计的两个最基本的概念。 对象:是客观事物在计算机中的抽象描述。 类:对具有相似属性和行为的一组对象的统一描述。 类是在结构体的基础上扩充而来的。
15
2.在类定义中只声明成员函数的原型,而函数体 写在类 的定义之外。 这种成员函数在类外定义的一般形式如下: 函数返回值的类型 类名::成员函数名(形式参数表) { …… //函数体 } “::” 是作用域运算符。表示该成员函数属于哪个类,或某 个数据成员属于哪个类。 使用类中成员的全名:类名::成员名
}
运行结果为:
2009.5.26
3
类的声明方法 声明类的方法与声明结构体类似。下面是熟悉的 结构体类型:
struct Clock //声明结构体类型 { int hour; int minter; int second; }; Clock c1,c2; //定义结构体变量
20
3.3
对象的定义与使用
3.3.1 类与对象的关系 C++把类的变量叫做类的对象,对象也称为类的 实例。 类是抽象的概念,而对象是具体的概念; 类只是一种数据类型,而对象是属于该类(数 据类型)的一个变量,每个对象占用了各自的 存储单元,都各自具有了该类的一套数据成员, 而类的成员函数是所有对象共有的。每个对象 的成员函数都通过指针指向同一个代码空间。
结构体变量的各个成员都是 “敞开”的。造成 程序的不安全性。
如可以直接修改数据成员:c1.hour=10; cout<<c1.minter;
4
定义一个Clock类:
class Clock { int hour; //数据成员 (数据部分) int minute; int second; //成员函数 (操作部分) void ShowTime( ) {cout<<hour<<":"<< minute <<":"<<second <<endl;} void setTime(int H, int M,int S) //成员函数 { hour=H; minute=M; second=S;} }; Clock c1,c2; //定义类对象
22
2. 声明了类之后在使用时再定义对象
定义的格式与一般变量的定义格式相同: 类名 对象名(参数表); 例: Clock c1,c2; 则c1,c2就是Clock类型的对象 说明:
19
inline void Record :: regist(char a[20], int b) { strcpy(bookname, a ); //给书名成员赋值 num=b;} //给编号成员赋值
inline void Record :: show( ) //显示数据成员的 值 {cout<<"书名:"<<bookname<<endl; cout<<"书号:"<<num<<endl;}
12
例:定义描述图书的类:
数据(属性)有: 书名、编号; 成员函数(方法)有: 能设置书名、编号;能显示书名、编号。
class Record { private: char bookname[20]; //数据成员,表示书名 int num; //数据成员,表示书的编号 public: //以下声明成员函数原型 void regist(char a[20],int b) //设置数据成员 { strcpy(bookname, a ); num=b; } void show( ); //显示数据成员的值 {cout<<"书名:"<<bookname<<endl; cout<<"书号:"<<num<<endl;} };
/* 03_01.cpp */ #include<iostream> using namespace std; struct date { int year; int month; int day; };
21
3.3.2 对象的定义
当定义一个类时,只是定义了一个数据类型,用这个数据类型定义 变量,这个变量就称为对象。 对象的定义,也称对象的创建,在C++中可以用以下两种方法定义 对象。 1. 在声明类的同时直接定义对象 即在声明类的右花括号“}”后,直接写出属于该类的对象名表。例如: class Point { private: int x,y; public: void SetPoint(int,int); int Getx(); int Gety(); } op1,op2; 这时定义的对象是一个全局对象。
6
类声明的一般格式如下: class 类名 { private: 私有数据成员; 私有成员函数; protected: 保护数据成员; 保护成员函数; public: 公有数据成员; 公有成员函数; };
7
说明: (1)class是类定义的关键字。 (2)类名由用户自定义,但必须是C++的有效标识符,且 一般首字母要大写。 (3)花括号中是类体,最后以分号“;”结束。 (4)private、 public、 protected这3个关键字是访问权限 控制符,限制了类成员的访问权限。 例如,下例中定义了一个描述日期的类。 class Date {private: //private可以默认 int year; //定义数据成员 int month; int day; public: void SetDate(int y,int m,int d); //成员函数声明 void ShowDate(); //成员函数声明 };
类把数据和行为封装在一起。ShowTime函数 用来输出本对象中的时、分、秒。setTime函 数用来设置新的时、分、秒数据成员。
5
3.1.2 类的构成
类主要由3部分组成,分别是:
类名 数据成员 成员函数
按访问权限划分,数据成员和成员函数又可分 为3种,分别是:
公有成员( private ) 保护成员( protected ) 私有成员( public )
10
用private将数据成员声明为私有的,类外的语句不能调 用private成员。如在主函数中用c1.hour=10是错的。但 类中的成员函数可以操作数据成员。如SetTime函数中 的赋值语句。 用public将SetTime函数声明为公有的。现在可以在外界 (类定义以外)程序代码中,调用该函数成员. 例如在主函数中可以执行: c1.SetTime(10,20,30 ); 这就是向对象c1发的一个消息,通知它执行SetTime( ) 方法,给 c1对象的数据成员赋值。 方法:在面向对象的程序设计中,将成员函数称为“方 法”。 “方法”是对数据的操作(由成员函数代码实现 的)。一个方法对应一种操作。
13
3.2
类的成员函数
类中的所有成员都要在类的类体中进行说明, 但成员函数的定义即可以在类体中给出,也可 以在类体外给出。 通常采用以下两种方式。 1.将成员函数的定义直接写在类体中 适合于函数体代码规模较小的情况。
14
例如,定义表示坐标点的类Point。 class Point { private: int x, y; public: void SetPoint(int a,int b) { x=a;y=b; } //函数体 int Getx() //获得x的值 { return x; } //函数体 int Gety() //获得y的值 {Hale Waihona Puke Baidureturn y; } //函数体 };
11
说明:
(1) private部分的成员,在类之外的不能存取,只 有类的成员函数可以存取。 (2) public部分的成员,可被程序中的任何函数或语 句存取。public部分多为成员函数,用来提供与外 界的接口,外界只有通过这个接口才可以操作 private部分的成员。 (3) protected部分的成员,不能在类之外存取,只 有类的成员函数及其子类(派生类)可以存取。 (4)定义类时,若不指明成员访问权限,系统默认 是private的。
17
在C++中,还可以用下面格式将成员函数声明为 类的内联函数。
inline 返回类型 类名::成员函数名(参数表) { //函数体 }
使用 inline 说明内联函数时,必须使函数体和 inline 说明结合在一起,否则编译器将它作为 普通函数处理。
18
例:定义描述图书的类:
数据(属性)有: 书名、编号; 成员函数(方法)有: 能设置书名、编号;能显示书名、编 号。
3.1.1 从结构体到类
结构体: 把各种类型的数据成员组织在一起. 类:把各类数据成员,还有对数据的操作 ——成员函数组织在 一起。 例如下面声明了一个日期结构体(只有数据成员): struct date { int year; int month; int day; };
2
【例3.1】
有关日期结构体的例子。
class Record { private: char bookname[20]; //数据成员,表示书名 int num; //数据成员,表示书的编号 public: //以下声明成员函数原型 void regist(char a[20],int b);//设置数据成员 void show( ); //显示数据成员的值 };
9
类的成员访问权限:
私有的(private): 类外不能调用; 公有的(public): 类外可以调用。 受保护的(protected):外界不能调用,但派生类可以调用。
可以将前面的Clock类定义修改如下:
class Clock { private: int hour; int minute; int second; public: void ShowTime( ) {cout<<hour<<“:”<< minute <<“:”<<second<<endl;} void setTime(int H, int M, int S) { hour=H; minute=M; second=S;} }; Clock c1,c2; //定义了2个Clock类的对象
16
例如,对于前面的表示坐标点的类 Point来说, 给出下面的定义(函数体在类外)。 class Point {private: int x,y; public: void SetPoint (int,int); 在类中只声明函数原型 int Getx(); int Gety(); }; void Point::SetPoint(int a,int b) { x=a; y=b; } int Point::Getx() 在类外定义函数 { return x; } int Point::Gety() { return y; }
8
3.1. 3
类成员的访问属性
类除了具有封装性外,还采用了信息隐蔽原则,使类中 的成员与外界的联系减少到最低限度。 如果前边定义的Clock类中的成员都对外隐蔽,外界就 不能调用它们,只有本类中的成员函数ShowTime()可以 使用类中的数据成员。 这样保证了数据的安全,但是外界不能调用成员函数, ShowTime()无法被执行。因此不能使全部成员都与外界 隔离。 一般把数据成员隐蔽起来,把成员函数公开化作为对外 界的接口。即让外界可以通过调用ShowTime函数,输 出对象的数据成员值; 通过调用SetTime函数,设置对象 的数据成员值
第 3章 本章要点:
类和对象(一)
类的定义与类的成员 对象的定义与使用 类的构造函数 重载构造函数 析构函数 UML及类图
1
3.1. 类的构成
类和对象是面向对象程序设计的两个最基本的概念。 对象:是客观事物在计算机中的抽象描述。 类:对具有相似属性和行为的一组对象的统一描述。 类是在结构体的基础上扩充而来的。
15
2.在类定义中只声明成员函数的原型,而函数体 写在类 的定义之外。 这种成员函数在类外定义的一般形式如下: 函数返回值的类型 类名::成员函数名(形式参数表) { …… //函数体 } “::” 是作用域运算符。表示该成员函数属于哪个类,或某 个数据成员属于哪个类。 使用类中成员的全名:类名::成员名
}
运行结果为:
2009.5.26
3
类的声明方法 声明类的方法与声明结构体类似。下面是熟悉的 结构体类型:
struct Clock //声明结构体类型 { int hour; int minter; int second; }; Clock c1,c2; //定义结构体变量
20
3.3
对象的定义与使用
3.3.1 类与对象的关系 C++把类的变量叫做类的对象,对象也称为类的 实例。 类是抽象的概念,而对象是具体的概念; 类只是一种数据类型,而对象是属于该类(数 据类型)的一个变量,每个对象占用了各自的 存储单元,都各自具有了该类的一套数据成员, 而类的成员函数是所有对象共有的。每个对象 的成员函数都通过指针指向同一个代码空间。
结构体变量的各个成员都是 “敞开”的。造成 程序的不安全性。
如可以直接修改数据成员:c1.hour=10; cout<<c1.minter;
4
定义一个Clock类:
class Clock { int hour; //数据成员 (数据部分) int minute; int second; //成员函数 (操作部分) void ShowTime( ) {cout<<hour<<":"<< minute <<":"<<second <<endl;} void setTime(int H, int M,int S) //成员函数 { hour=H; minute=M; second=S;} }; Clock c1,c2; //定义类对象
22
2. 声明了类之后在使用时再定义对象
定义的格式与一般变量的定义格式相同: 类名 对象名(参数表); 例: Clock c1,c2; 则c1,c2就是Clock类型的对象 说明:
19
inline void Record :: regist(char a[20], int b) { strcpy(bookname, a ); //给书名成员赋值 num=b;} //给编号成员赋值
inline void Record :: show( ) //显示数据成员的 值 {cout<<"书名:"<<bookname<<endl; cout<<"书号:"<<num<<endl;}
12
例:定义描述图书的类:
数据(属性)有: 书名、编号; 成员函数(方法)有: 能设置书名、编号;能显示书名、编号。
class Record { private: char bookname[20]; //数据成员,表示书名 int num; //数据成员,表示书的编号 public: //以下声明成员函数原型 void regist(char a[20],int b) //设置数据成员 { strcpy(bookname, a ); num=b; } void show( ); //显示数据成员的值 {cout<<"书名:"<<bookname<<endl; cout<<"书号:"<<num<<endl;} };