420 likes | 573 Views
类与对象 (一). 内容. 类是什么?对象是什么? 如何创建类和对象? 类的成员变量和成员函数 类成员的访问控制 对象的使用. 对象. 对象是一件事物 对象具有属性和操作 属性:状态,特征,组成成员, 操作:修改属性,访问属性,执行命令. 例:文件. 属性 文件名 filename 长度 length 修改日期 modify_date 文件内容 contents. 例:文件. 操作 文件复制 copy 文件更名 rename 文件打印 print. 类. 类是具有相似特征的对象的抽象 文件类 所有具体文件对象的抽象
E N D
类与对象 (一)
内容 • 类是什么?对象是什么? • 如何创建类和对象? • 类的成员变量和成员函数 • 类成员的访问控制 • 对象的使用
对象 • 对象是一件事物 • 对象具有属性和操作 • 属性:状态,特征,组成成员, • 操作:修改属性,访问属性,执行命令
例:文件 • 属性 • 文件名 filename • 长度 length • 修改日期 modify_date • 文件内容 contents • ......
例:文件 • 操作 • 文件复制 copy • 文件更名 rename • 文件打印 print • ......
类 • 类是具有相似特征的对象的抽象 • 文件类所有具体文件对象的抽象 • 书 类所有具体书对象的抽象 • 学生类所有具体学生对象的抽象
类与对象 • 类是抽象的,对象是具体的 • 类是类型,对象是变量 • 类是模型,对象是实例
class File { char file_name[100]; int length; Date modify_date; char * contents ; bool copy(File & target); bool rename(char * new_name); bool print(); }; 属性 操作 注意分号
bool File::copy(File & destineFile) { ...... } bool File::rename(char * new_name) { ...... } bool File::print() { ....... }
//修改文件名为new_name bool File::rename(char * new_name) { strcpy( file_name, new_name); }
//复制当前文件内容到指定文件中 bool File::copy(File & target) { char * & pTarget = target.contents; delete [] pTarget; //释放原来的空间 pTarget = new char[length + 1]; strcpy(pTarget, contents); }
对象的创建 • 直接创建变量 • File f1, f2; • 动态创建变量 • File *pFile; • pFile = new File; • ...... • delete pFile;
访问成员变量 圆点操作符 • strcpy( f1.file_name , "oopd.dat"); • f1.length += 10; • cout << pFile->contents; 指针操作符
访问成员函数 f1.copy(f2); f1.rename("classA"); pFile->print(); pFile->rename("newname"); f1.copy(*pFile);
内联(inline)函数 class File { ...... bool File::rename(char * new_name) { strcpy( file_name, new_name); } ...... };
非内联函数 函数原型 class File { ...... bool rename(char * new_name); }; bool File::rename(char * new_name) { strcpy( file_name, new_name); } 指定类域
内联函数与非内联函数 • 内联函数的好处: • 类的定义集中 • 内联函数的缺点: • 类定义的规模太大 • 代码不能共享 • 可阅读性不好,难于理解
类作用域 • 类作用域包括: • 类的定义体 • 类的所有非内联成员函数的定义体 • 类成员的作用域是类作用域 • 类对象的作用域遵循一般变量的作用域规则(文件作用域、局部作用域)
对象的作用域 File my_file; void main() { File your_file; my_file.copy(your_file); your_file.rename("newname"); } ......
域 操作符 :: • ::identifier 文件域标识符 • classname::identifier 类域标识符 • identifier 当前(或外层)域标识符 bool File::rename(char file_name) { strcpy(File::filename, file_name); }
类和对象的好处 • 将数据和操作组织在一起 • 易于理解 • 易于修改与维护 • 类为对象提供了模板 • 各个对象可以共享类的特征 • 复用 • 下面的话题:封装
何为封装? 实现(implementation) • 信息隐藏 接口(interface)
封装 • 用户角度:简单 • 只了解接口,不了解细节 • 只需要结果,不规定实现方式 • 对象角度:保护 • 信息安全(不直接访问数据) • 安全审计(auditing)
封装在类中的实现 • 类的成员的访问控制 • 公有(public) --公开 • 保护(protected) --适当公开 • 私有 (private) --不公开
访问控制的基本原则 • 类的数据成员一般不公开 • private, protected • 表示接口的函数成员一般公开 • public • 与实现细节有关的函数成员不公开 • private, protected
class File { private: char file_name[100]; int length; Date modify_date; char * content; public: bool copy(File & target); bool rename(char * new_name); bool print(); }; 具有复杂的实现
class File { private: ...... //数据成员 print_file_information(); print_file_contents(); public: bool copy(File & target); bool rename(char * new_name); bool print(); };
类成员的访问 File f1,f2; File *pFile f1.length += 10; cout << pFile->contents; f1.copy(f2); f1.rename("newname"); pFile->print();
可访问规则 • 对类对象的访问遵循作用域规则 • 文件、局部、类作用域 • 对类成员的访问遵循访问控制规则 • 公有、保护、私有
特殊的类成员 • 常量成员 • 对象一旦定义,就不能更改该成员 • 静态成员 • 由该类的所有对象共享 • 对象成员 • 一个类的对象作为另一个类的对象的组成部分
常量成员 class Polygon { const int edge_num; //边的个数 Point point[100]; //各个顶点位置 //...... public: int GetEdgeNumber(); void SetEdgeNumber(int num) { edge_num = num; } ...... };
静态成员 class File { private: static int file_number ; ...... public: static int get_file_number() { return file_number;} };
理解静态成员 File类 file_number(4) get_file_number() 共享 file2 "bfile" file1 "afile" file3 "cfile" file4 "dfile"
静态成员的使用 • 初始化必须在全局范围进行 int File::file_number = 0; class File { static int file_number = 0; ...... }; main() { int File::file_number = 0; ...... }
静态数据成员 • 静态数据成员可以由所有成员函数访问 void File::incFileNumber() { file_number ++; }
静态函数成员 • 静态函数成员只可以访问静态数据成员 int get_file_number() { cout << file_name; ...... return file_number; }
静态成员的用途 • 记录对象个数 • 一般在构造函数中增加,析构函数中递减 • 所有对象共享资源 • 内存、文件、数据库、打印机
对象成员 • 一个或多个对象作为另一个对象的成员
对象成员的意义 • 对象之间的组成关系是对象之间存在的重要关系,它反映了自然界中存在的全局与局部、总体和部分的关系,是面向对象思想的重要组成部分。
对象成员 class Date { int year, month, day; public: SetDate(int y, int m, int d); GetDate(char * date); }; class People { Date birthday; char name[20]; ...... };
对象成员的使用 void People::SetBirthday(int y, int m, int d) { birthday.SetDate(y , m , d); } People mary; mary.SetBirthday(1999,1,2); mary.birthday.year = 1997; //如果year是公有成员
小 结 • 类的含义 • 对象的含义 • 类的定义和对象的使用 • 类成员的访问控制 • 特殊的类成员