第8章类和对象 8.1概述 面向过程的程序设计方法采用函数(过程)来描述对数据的 操作,但又将函数与数据分离。这种实质上的依赖与形式上 的分离使得所编写出来的大型程序难于控制,严重时甚至可 能导致程序的崩溃。 C++的类体现了OOP技术所要求的抽象和封装机制。类将 欲处理目标的属性(数据)和对其进行操作的方法(函数) 封装成一个整体。这样,既把自然界中的一类实体抽象成 种具有自主行为的数据类型,同时又将它们的属性隐藏起来 以阻止外界的干扰。 类描述了数据类型的组织形式;对象则是类的实例,是存放 在内存中可操作的变量
第8章 类和对象 8.1 概述 面向过程的程序设计方法采用函数(过程)来描述对数据的 操作,但又将函数与数据分离。这种实质上的依赖与形式上 的分离使得所编写出来的大型程序难于控制,严重时甚至可 能导致程序的崩溃。 C++ 的类体现了 OOP 技术所要求的抽象和封装机制。类将 欲处理目标的属性(数据)和对其进行操作的方法(函数) 封装成一个整体。这样,既把自然界中的一类实体抽象成一 种具有自主行为的数据类型,同时又将它们的属性隐藏起来 以阻止外界的干扰。 类描述了数据类型的组织形式;对象则是类的实例,是存放 在内存中可操作的变量
8.2类 82.1类的说明 class class name I private. pr members, public: pub_members, protected: pro members, 其中:关键字 private,pubc和 protected为成员属性说明 符,它们分别指出其后所定义的成员分别为私有成员、公有 成员和保护的成员。由于类成员缺省的属性为私有的,所以 在不致于引起二义性的情况下可以省略关键字 private
8.2 类 8.2.1 类的说明 class class_name { pri_members; public: pub_members; }; 其中:关键字 private,public 和 protected 为成员属性说明 符,它们分别指出其后所定义的成员分别为私有成员、公有 成员和保护的成员。由于类成员缺省的属性为私有的,所以 在不致于引起二义性的情况下可以省略关键字 private
类的成员分为两类,一类类似于结构成员—是一些变量 叫做数据成员(对象的属性),另一类是函数,叫做成员函 数(对象的方法) 成员属性规定了成员的访问权限:私有成员只允许对象自身 的方法或友元函数(将在第11章中介绍)访问;公有成员 则还允许对象的“外部”的访问;保护的成员(将在第10 章中介绍)主要用来决定派生类中成员的访问权限。 通常,类中的数据成员被说明成私有的,以阻止外界的随意 访问;而成员函数被说明成公有的,为外界访问对象中的数 据提供一个安全的接口。根据实际需要,有时也将数据成员 说明成公有的,以方便外部的访间,但这样的数据安全性将 难以保证。成员函数也常常说明成私有的,这样的函数仅供 对象内部调用
类的成员分为两类,一类类似于结构成员——是一些变量, 叫做数据成员(对象的属性),另一类是函数,叫做成员函 数(对象的方法)。 成员属性规定了成员的访问权限:私有成员只允许对象自身 的方法或友元函数(将在第 11 章中介绍)访问;公有成员 则还允许对象的“外部”的访问;保护的成员(将在第 10 章中介绍)主要用来决定派生类中成员的访问权限。 通常,类中的数据成员被说明成私有的,以阻止外界的随意 访问;而成员函数被说明成公有的,为外界访问对象中的数 据提供一个安全的接口。根据实际需要,有时也将数据成员 说明成公有的,以方便外部的访问,但这样的数据安全性将 难以保证。成员函数也常常说明成私有的,这样的函数仅供 对象内部调用
∥ PERSON.H #if defined PERSON H #define PERSON H class Person private char Name gI int Age char Sex publIC void Register(const char*, int, char) void GetName(char*) GetAgeo char GetSexo fendi
// PERSON.H #if !defined _PERSON_H_ #define _PERSON_H_ class Person { private: char Name[9]; int Age; char Sex; public: void Register(const char*, int, char); void GetName(char*); int GetAge(); char GetSex(); }; #endif
般而言,类的定义通常都写到一个头文件(H或HPP) 中,供所有用到相应类类型的文件嵌入用。由于类中的成员 函数是由代码组成的,所以通常都将它们写到一个独立的源 程序(CPP)文件中,经编译后与使用对应类类型的模块链 接成一个程序 定义成员函数的一般形式为: type class_ name : func_name( agr_list) func body;
一般而言,类的定义通常都写到一个头文件(.H 或 .HPP) 中,供所有用到相应类类型的文件嵌入用。由于类中的成员 函数是由代码组成的,所以通常都将它们写到一个独立的源 程序(.CPP)文件中,经编译后与使用对应类类型的模块链 接成一个程序。 定义成员函数的一般形式为: type class_name :: func_name() { func_body; }
∥ PERSON. CPP include # include" person. h” 注意:成员函数若定义成: chark Person: GetNameo void Person: Register(const ch return Name strcpy (Name, nm) Age ag Sex =s 岂不是更简便吗?实际上这 样做将破坏数据有封装。由 于函数返回了成员Name的 void Person: GetName(char首地址,就为外部修改该成 员的提供了方便,从而也破 strcpy(nm, Name): 坏了该数据的安全性
// PERSON.CPP #include #include "person.h” void Person :: Register(const char* nm, int ag, char s) { strcpy(Name, nm); Age = ag; Sex = s; } void Person :: GetName(char* nm) { strcpy(nm, Name); } 注意:成员函数若定义成: char* Person :: GetName() { return Name; } 岂不是更简便吗?实际上这 样做将破坏数据有封装。由 于函数返回了成员 Name 的 首地址,就为外部修改该成 员的提供了方便,从而也破 坏了该数据的安全性
int Person:: GetAgeO return Age, char Person:: GetSex( return Sex
int Person :: GetAge() { return Age; } char Person :: GetSex() { return Sex; }
822类与结构 仅需记住一条:类与结构的唯一区别就在于,在类中定义的 成员缺省成员属性为私有的;而在结构中定义的成员缺省成 员属性为公有的
8.2.2 类与结构 仅需记住一条:类与结构的唯一区别就在于,在类中定义的 成员缺省成员属性为私有的;而在结构中定义的成员缺省成 员属性为公有的
82.3内联成员函数 成员函数也可以定义成内联的,而且形式更为灵活。例: 在头文件 PERSON.H中 class Person public void Register(const char*, int, char) void GetName(char*) int GetAgeo return Age, char GetSexO return Sex, 1
8.2.3 内联成员函数 成员函数也可以定义成内联的,而且形式更为灵活。例: 在头文件 PERSON.H 中 class Person { //... public: void Register(const char*, int, char); void GetName(char*); int GetAge() { return Age; } char GetSex() { return Sex; }
在源程序文件 PERSON. CPP中 inline void Person: Register(const chark nm, int ag, char s) strcpy(Name, nm) Age = ag, Sex = s inline void Person: GetName(char* nm strcpy(nm, Name)
在源程序文件 PERSON.CPP 中 inline void Person :: Register(const char* nm, int ag, char s) { strcpy(Name, nm); Age = ag; Sex = s; } inline void Person :: GetName(char* nm) { strcpy(nm, Name); }