Chapter3-关于类和对象的进一步讨论.ppt_第1页
Chapter3-关于类和对象的进一步讨论.ppt_第2页
Chapter3-关于类和对象的进一步讨论.ppt_第3页
Chapter3-关于类和对象的进一步讨论.ppt_第4页
Chapter3-关于类和对象的进一步讨论.ppt_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第 3 章 关于类和对象的进一步讨论 基于C+的面向对象程序设计 2 第3章 关于类和对象的进一步讨论 q3.1 构造函数 q3.2 析构函数 q3.3 对象数组和对象指针 q3.4 共用数据的保护 q3.5 对象的动态建立和释放 q3.6 静态成员 q3.7 友员 q3.8 函数模板与类模板 2 3.4 共用数据的保护 q本节主要内容 3.4.1 常对象 3.4.2 常对象成员 3.4.3 指向对象的常指针 3.4.4 指向常对象的指针变量 3.4.5 对象的常引用 3 3 3.4 共用数据的保护 3.4.1 常对象 q作用:定义一个对象时,当其数据成员的值不希 望被修改时,定义该对象为常对象。 q与定义常变量类似,必须赋初值。 q定义格式: 类名 const 对象名 (实参列表) 或 const 类名 对象名 (实参列表) 4 4 3.4 共用数据的保护 3.4.1 常对象 q常对象不能调用非const型的成员函数,除系统自 动调用的构造函数和析构函数之外。 q常对象的所有数据成员的值是不能被修改的。 q例: const time t(10,15,15); 或 time const t(10,15,15); t.get_time(); /要求必须是常成员函数 5 5 3.4 共用数据的保护 3.4.1 常对象 q常对象的所有数据成员的值是不能被修改的。 q编程时出现修改常对象数据成员值的需求,则将 数据成员声明为可变的数据成员,加mutable。 q例: class mutable int hour; ; const time t(10,15,15); t.get_time(); void time:get_time() hour+=10; 6 6 3.4 共用数据的保护 q本节主要内容 3.4.1 常对象 3.4.2 常对象成员 3.4.3 指向对象的常指针 3.4.4 指向常对象的指针变量 3.4.5 对象的常引用 7 7 3.4 共用数据的保护 3.4.2 常对象成员 (一)常数据成员 p与定义常变量一样。 int const year; 或 const int year; p只能通过构造函数的参数初始化表对常数据成员 进行初始化。 Date:Date (int y):year(y) p对常数据成员,该类所有对象中的该数据成员的 值都是不能改变的,但不同的对象中该数据成员 的值是可以不同的。 8 8 3.4 共用数据的保护 3.4.2 常对象成员 (二)常成员函数 q常成员函数只能引用本类中的数据成员,而不能 修改它们。 q注意:声明和定义时都要加const关键字。 例:void get_time( ) const; q常成员函数引用数据成员情况表 (p90) q常对象中的成员函数未加const声明,编译器默认 为非const成员函数。 9 9 3.4 共用数据的保护 q本节主要内容 3.4.1 常对象 3.4.2 常对象成员 3.4.3 指向对象的常指针 3.4.4 指向常对象的指针变量 3.4.5 对象的常引用 1010 3.4 共用数据的保护 3.4.3 指向对象的常指针 p指向对象的常指针:将指向对象的指针变量声明 为const。 p特点:指向不能改变,即声明时必须初始化。但 可以改变指向对象数据成员的值。 p一般形式: 类名 * const 指针变量名= Time * const p= p常用作函数的形参,避免在函数的执行过程中改 变指针变量的指向。 11 P只能指向t1 11 3.4 共用数据的保护 q本节主要内容 3.4.1 常对象 3.4.2 常对象成员 3.4.3 指向对象的常指针 3.4.4 指向常对象的指针变量 3.4.5 对象的常引用 1212 3.4 共用数据的保护 3.4.4 指向常对象的指针变量 (一)指向常变量的指针变量 p格式: const 类型 * 指针 或者 类型 const * 指针; 例如:const int a=5; /定义常变量 const int *p= /指向一个常变量 p特点:定义后,指针的指向可以改变,但指针指 向对象的内容(值)不可以改变。 p例: 1313 14 void main( ) const int a = 78 ; const int b = 25 ; int c = 13 ; const int *pi = / 只能指向常变量的 / *pi = 56 ;*pi = 56 ; / 错误, 不能修改所指对象的内容 pi = /可以改变指针的指向 pi = /可以指向非常变量 / *pi = 99 ;*pi = 99 ;/错误 c = 99 ; /正确 14 3.4 共用数据的保护 3.4.4 指向常对象的指针变量 (二)指向常对象的指针变量 q常对象,只能用指向常对象的指针指向它。 q指向常对象的指针可以指向一个非常对象。 q如果要改变非常对象数据成员的值可以直接改, 但不能通过该指针改变。 例: Time t1(2,34,54); const Time *p= t1.hour=15; () (*p).hour=15;() 15 指向常对象的指针 非常对象 15 3.4 共用数据的保护 q本节主要内容 3.4.1 常对象 3.4.2 常对象成员 3.4.3 指向对象的常指针 3.4.4 指向常对象的指针变量 3.4.5 对象的常引用 1616 3.4 共用数据的保护 3.4.5 对象的常引用 (一)变量的常引用 p 例: int a=24; const int a=66; /正确 b=89; /错误,常引用不能被更改 1717 3.5 共用数据的保护 3.4.5 对象的常引用 (二)对象的常引用 p 例: void fun(const Time () int main() Time t1(10,13,56); fun(t1); couthourminute; qnew建立对象时,系统自动调用该类的构造函数, 对对象进行初始化。 q如果没有足够的内存,建立失败,返回0值。 2121 3.5 对象的动态建立和释放 (二) delete运算符释放内存空间 q由new运算符建立的对象,使用delete释放。 delete p; q执行delete运算符时,系统自动调用析构函数。 2222 23 3.5 对象的动态建立和释放 q执行两个程序,比较结果,分析发生这种情况的 原因。 q程序一: 23 24 3.5 对象的动态建立和释放 #include “iostream“ using namespace std; class student private: int num; char *name; public: student(int n,char *na):num(n) name=new charstrlen(na)+1; strcpy(name,na); student(student name=; 24 25 3.5 对象的动态建立和释放 void display() coutnumnameendl; student()delete name; ; int main() student s1(1001,“aaaaaa“); s1.display(); student s2(s1); s2.display(); return 0; 25 26 3.5 对象的动态建立和释放 q执行两个程序,比较结果,分析发生这种情况的 原因。 q程序二: 26 27 3.5 对象的动态建立和释放 #include “iostream“ using namespace std; class student private: int num; char *name; public: student(int n,char *na):num(n) name=new charstrlen(na)+1; strcpy(name,na); student(student name=new charstrlen()+1; strcpy(name,); 27 28 3.5 对象的动态建立和释放 void display() coutnumnameendl; student()delete name; ; int main() student s1(1001,“aaaaaa“); s1.display(); student s2(s1); s2.display(); return 0; 28 29 3.5 对象的动态建立和释放 q小结 q利用new动态申请空间时,会调用该类的构造 函数,用delete释放空间时,会调用该在的析 构函数。 q浅复制和深复制问题! 29 30 第3章 关于类和对象的进一步讨论 q3.1 构造函数 q3.2 析构函数 q3.3 对象数组和对象指针 q3.4 共用数据的保护 q3.5 对象的动态建立和释放 q3.6 静态成员 q3.7 友员 q3.8 函数模板与类模板 30 31 3.6 静态成员 问题引入: p例1:定义一个工人类,该类中包含工人的每周工 作时间属性及完成工作时间的设置和统计操作, 统计所有工人的每周工作时间。 p分析:定义工人类 class Worker /定义工人类 char *name; /工人姓名 int time; /工作时间 public: void workTime(int n);/设置和统计 ; 31 32 3.6 静态成员 问题引入: p例1:统计工人工作时间。 p分析:统计多个工人的每周工作时间,必须要实 现工人的每周工作时间在多个工人对象中被共享 。 p同一个类的不同对象都拥有自己的数据成员空间 ,如何实现同一个类的多个对象的之间的数据共 享? 解决方法! 32 33 3.6 静态成员 问题引入: p例1:统计工人工作时间。 p解决方法 方法一:定义全局变量或对象 缺点:不安全,任何功能模块都可以更改; 方法二:定义静态的数据成员 优点:可实现共享,并保证安全性。 33 34 3.6 静态成员 问题引入: p例1:统计工人工作时间。 p解决方法 方法一:定义全局变量或对象 int total=0; /用于统计总工作时间 class Worker /定义工人类 char *name; int time; public: void workTime(int n); ; 全局变量 34 35 3.6 静态成员 int total=0; /用于统计总工作时间 class Worker /定义工人类 char *name; int time; public: void workTime(int n); ; void Worker: workTime(int n) time=n; total+=n; int main() Worker worker1, worker2, worker3; worker1. workTime (48); worker2. workTime (36); worker3. workTime (38); cout“Total=“totalendl; return 0; 运行结果: Total= 122 35 36 3.6 静态成员 问题引入: p例1:统计工人工作时间。 p解决方法 方法一:定义全局变量或对象 缺点:不安全,任何功能模块都可以更改; int total=0; /用于统计总工作时间 class Worker ; void f( ) total+=50; 36 37 3.6 静态成员 问题引入: p例1:统计工人工作时间。 p解决方法 方法一:定义全局变量或对象 缺点:不安全,任何功能模块都可以更改; 方法二:定义静态的数据成员 优点:可实现共享,并保证安全性。 p静态成员 静态数据成员和静态成员函数 37 38 3.6 静态成员 (一)静态数据成员的定义格式 在定义类的成员时前面加static static 类型名 成员名; p例如:统计工人工作时间。 class Worker /定义工人类 static int total; ; 定义静态数 据成员 38 39 3.6 静态成员 class Worker /定义工人类 char *name; int time; public: static int total; void workTime(int n); ; void Worker: workTime(int n) time=n; total+=n; int Worker:total=0; int main() Worker worker1, worker2, worker3; worker1. workTime (48); worker2. workTime (36); worker3. workTime (38); cout“Total=“Worker:totalendl; return 0; 运行结果: Total= 122 静态数据成员 39 40 3.6 静态成员 (二)静态数据成员的初始化 类型 类名 : : 静态成员名 值; 例:int Worker:total=0; p 注意: 1、静态数据成员可以初始化,且必须在类外进 行。 2、若不指定初始化值,系统自动设为0。 3、初始化时不加static。 40 41 3.6 静态成员 (三)静态数据成员的访问 q 方法一:类名 :静态数据成员名 q 方法二:对象名 . 静态数据成员名 例如: coutWorker:total; cout worker1.total; q 注意:静态数据成员同样具有访问控制限制,因 此,必须声明为public的,才能在类外访问。 查看例子 41 3.6 静态成员 class Worker /定义工人类 char *name; int time; public: static int total; void workTime(int n); ; void Worker: workTime(int n) time=n; total+=n; int Worker:total=0; int main() Worker worker1, worker2; worker1. workTime (48); worker2. workTime (36); cout“Total=“worker2.totalendl; cout“Total=“Worker:totalendl; return 0; 运行结果: Total= 84 Total= 84 两种访问方式 4242 43 3.6 静态成员 (四)静态数据成员的特点 q 与非静态数据成员的区别: 一般数据成员在定义对象时才会分配存储空间; 静态数据成员是属于整个类的,不定义对象也占 有内存,该类的所有对象共享其存储空间。 静态数据成员在类外可以用对象和类名进行访问 。 q 与非静态数据成员的联系 都

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论