1 / 42

类与对象 (一)

类与对象 (一). 内容. 类是什么?对象是什么? 如何创建类和对象? 类的成员变量和成员函数 类成员的访问控制 对象的使用. 对象. 对象是一件事物 对象具有属性和操作 属性:状态,特征,组成成员, 操作:修改属性,访问属性,执行命令. 例:文件. 属性 文件名 filename 长度 length 修改日期 modify_date 文件内容 contents. 例:文件. 操作 文件复制 copy 文件更名 rename 文件打印 print. 类. 类是具有相似特征的对象的抽象 文件类 所有具体文件对象的抽象

Download Presentation

类与对象 (一)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 类与对象 (一)

  2. 内容 • 类是什么?对象是什么? • 如何创建类和对象? • 类的成员变量和成员函数 • 类成员的访问控制 • 对象的使用

  3. 对象 • 对象是一件事物 • 对象具有属性和操作 • 属性:状态,特征,组成成员, • 操作:修改属性,访问属性,执行命令

  4. 例:文件 • 属性 • 文件名 filename • 长度 length • 修改日期 modify_date • 文件内容 contents • ......

  5. 例:文件 • 操作 • 文件复制 copy • 文件更名 rename • 文件打印 print • ......

  6. • 类是具有相似特征的对象的抽象 • 文件类所有具体文件对象的抽象 • 书 类所有具体书对象的抽象 • 学生类所有具体学生对象的抽象

  7. 类与对象 • 类是抽象的,对象是具体的 • 类是类型,对象是变量 • 类是模型,对象是实例

  8. class File { char file_name[100]; int length; Date modify_date; char * contents ; bool copy(File & target); bool rename(char * new_name); bool print(); }; 属性 操作 注意分号

  9. bool File::copy(File & destineFile) { ...... } bool File::rename(char * new_name) { ...... } bool File::print() { ....... }

  10. //修改文件名为new_name bool File::rename(char * new_name) { strcpy( file_name, new_name); }

  11. //复制当前文件内容到指定文件中 bool File::copy(File & target) { char * & pTarget = target.contents; delete [] pTarget; //释放原来的空间 pTarget = new char[length + 1]; strcpy(pTarget, contents); }

  12. 对象的创建 • 直接创建变量 • File f1, f2; • 动态创建变量 • File *pFile; • pFile = new File; • ...... • delete pFile;

  13. 访问成员变量 圆点操作符 • strcpy( f1.file_name , "oopd.dat"); • f1.length += 10; • cout << pFile->contents; 指针操作符

  14. 访问成员函数 f1.copy(f2); f1.rename("classA"); pFile->print(); pFile->rename("newname"); f1.copy(*pFile);

  15. 内联(inline)函数 class File { ...... bool File::rename(char * new_name) { strcpy( file_name, new_name); } ...... };

  16. 非内联函数 函数原型 class File { ...... bool rename(char * new_name); }; bool File::rename(char * new_name) { strcpy( file_name, new_name); } 指定类域

  17. 内联函数与非内联函数 • 内联函数的好处: • 类的定义集中 • 内联函数的缺点: • 类定义的规模太大 • 代码不能共享 • 可阅读性不好,难于理解

  18. 类作用域 • 类作用域包括: • 类的定义体 • 类的所有非内联成员函数的定义体 • 类成员的作用域是类作用域 • 类对象的作用域遵循一般变量的作用域规则(文件作用域、局部作用域)

  19. 对象的作用域 File my_file; void main() { File your_file; my_file.copy(your_file); your_file.rename("newname"); } ......

  20. 域 操作符 :: • ::identifier 文件域标识符 • classname::identifier 类域标识符 • identifier 当前(或外层)域标识符 bool File::rename(char file_name) { strcpy(File::filename, file_name); }

  21. 类和对象的好处 • 将数据和操作组织在一起 • 易于理解 • 易于修改与维护 • 类为对象提供了模板 • 各个对象可以共享类的特征 • 复用 • 下面的话题:封装

  22. 何为封装? 实现(implementation) • 信息隐藏 接口(interface)

  23. 封装 • 用户角度:简单 • 只了解接口,不了解细节 • 只需要结果,不规定实现方式 • 对象角度:保护 • 信息安全(不直接访问数据) • 安全审计(auditing)

  24. 封装在类中的实现 • 类的成员的访问控制 • 公有(public) --公开 • 保护(protected) --适当公开 • 私有 (private) --不公开

  25. 访问控制的基本原则 • 类的数据成员一般不公开 • private, protected • 表示接口的函数成员一般公开 • public • 与实现细节有关的函数成员不公开 • private, protected

  26. 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(); }; 具有复杂的实现

  27. class File { private: ...... //数据成员 print_file_information(); print_file_contents(); public: bool copy(File & target); bool rename(char * new_name); bool print(); };

  28. 类成员的访问 File f1,f2; File *pFile f1.length += 10; cout << pFile->contents; f1.copy(f2); f1.rename("newname"); pFile->print();

  29. 可访问规则 • 对类对象的访问遵循作用域规则 • 文件、局部、类作用域 • 对类成员的访问遵循访问控制规则 • 公有、保护、私有

  30. 特殊的类成员 • 常量成员 • 对象一旦定义,就不能更改该成员 • 静态成员 • 由该类的所有对象共享 • 对象成员 • 一个类的对象作为另一个类的对象的组成部分

  31. 常量成员 class Polygon { const int edge_num; //边的个数 Point point[100]; //各个顶点位置 //...... public: int GetEdgeNumber(); void SetEdgeNumber(int num) { edge_num = num; } ...... };

  32. 静态成员 class File { private: static int file_number ; ...... public: static int get_file_number() { return file_number;} };

  33. 理解静态成员 File类 file_number(4) get_file_number() 共享 file2 "bfile" file1 "afile" file3 "cfile" file4 "dfile"

  34. 静态成员的使用 • 初始化必须在全局范围进行 int File::file_number = 0; class File { static int file_number = 0; ...... }; main() { int File::file_number = 0; ...... }

  35. 静态数据成员 • 静态数据成员可以由所有成员函数访问 void File::incFileNumber() { file_number ++; }

  36. 静态函数成员 • 静态函数成员只可以访问静态数据成员 int get_file_number() { cout << file_name; ...... return file_number; }

  37. 静态成员的用途 • 记录对象个数 • 一般在构造函数中增加,析构函数中递减 • 所有对象共享资源 • 内存、文件、数据库、打印机

  38. 对象成员 • 一个或多个对象作为另一个对象的成员

  39. 对象成员的意义 • 对象之间的组成关系是对象之间存在的重要关系,它反映了自然界中存在的全局与局部、总体和部分的关系,是面向对象思想的重要组成部分。

  40. 对象成员 class Date { int year, month, day; public: SetDate(int y, int m, int d); GetDate(char * date); }; class People { Date birthday; char name[20]; ...... };

  41. 对象成员的使用 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是公有成员

  42. 小 结 • 类的含义 • 对象的含义 • 类的定义和对象的使用 • 类成员的访问控制 • 特殊的类成员

More Related