C语言程序设计 第六章 类和对象(二)_第1页
C语言程序设计 第六章 类和对象(二)_第2页
C语言程序设计 第六章 类和对象(二)_第3页
C语言程序设计 第六章 类和对象(二)_第4页
C语言程序设计 第六章 类和对象(二)_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

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

文档简介

1、第第六六章章 类和对象类和对象( (二二) )第第一节一节 对象指针和对象引用对象指针和对象引用 第第 6 6 章章一、一、指向类的成员的指针指向类的成员的指针: 在C+中,可以说明指向类的数据成员和成员函数的指针。1 1、指向类的数据成员的指针指向类的数据成员的指针:、定义格式、定义格式: : * * =; 例如,定义一个指向类A的数据成员c的指针pc: int A *pc=&A c;、赋值方法:、赋值方法: = & = & ;、引用方法:、引用方法: 使用类的对象引用时: 对象名对象名. .* *指针名指针名第第 6 6 章章 使用对象指针引用时: 对象指针名对象指

2、针名-* *指针名指针名 利用引用的方法可以实现类中数据成员的赋值:、使用类A对象给pc所指向的数据成员c赋值: int A *pc=&A c; A a; a.*pc=10;、使用指向类A对象指针p给pc所指向的数据成员c赋 值: int A *pc=&A c; A a; A *p=&a; p-*pc=10;第第 6 6 章章2 2、指向类的成员函数的指针指向类的成员函数的指针:、定义、定义格式格式: : ( ( :* * ) )()、赋值方法:、赋值方法: = = ;、引用方法:、引用方法: 使用类的对象引用时: ( ( .* * ) )(); 使用类的对象指针引用时

3、: ( ( -* * ) )();第第 6 6 章章二、对象指针:二、对象指针:1 1、对象指针的定义和赋值:、对象指针的定义和赋值: 已知对象a是类A的一个对象,pa是一个指向对象 a的指针,定义如下: A a; A * *pa=&a;2 2、 对象指针可作函数参数和返回值:对象指针可作函数参数和返回值: 对象指针作函数形参时,要求调用函数的实参是对象的地址值。因此,使用对象指针作函数参数使用对象指针作函数参数的最的最大大好处好处实际上是实际上是实现传址调用实现传址调用。这样可以提高运行效率,减少时空开销。第第 6 6 章章例例1 1 使用指向类的成员指针的例子#include cl

4、ass A public: A(int i) a=i; int fun(int b) return a*c+b; int c; /公有数据成员公有数据成员 private: int a;void main() A x(8); /定义定义x是类是类A的一个对象,并初始化的一个对象,并初始化 int A *pc; /定义指向类定义指向类A中的数据成员的指针中的数据成员的指针pc pc=&A c; /说明说明pc是指向类是指向类A的数据成员的数据成员c的的 x.*pc=3; /通过类的对象通过类的对象x为数据成员为数据成员c赋值赋值 int (A *pfun)(int); / 定义指向类定义

5、指向类A的成员函数的指针的成员函数的指针pfun第第 6 6 章章 pfun=A fun; /pfun指向类指向类A的成员函数的成员函数fun A *p=&x; /定义指向类定义指向类A对象对象x的(对象)指针的(对象)指针 p cout*pfun)(5)endl; /通过指向对象的指针通过指向对象的指针p来调用成员函数来调用成员函数 运行结果: 29第第 6 6 章章例例2 2、使用指向对象的指针作函数参数的例子。#include class M public: M() x=y=0; M(int i,int j) x=i;y=j; void copy(M *m); /形参是指向类中对

6、象的指针形参是指向类中对象的指针 void setxy(int i,int j) x=i;y=j; void print() coutx,yx; /通过指向类中对象的指针为另一对象的数据成员通过指向类中对象的指针为另一对象的数据成员x赋值赋值 y=m-y; /通过指向类中对象的指针为另一对象的数据成员通过指向类中对象的指针为另一对象的数据成员y赋值赋值第第 6 6 章章void fun(M m1,M *m2); /参数一个是类的对象,一个是指向类的对象的指针参数一个是类的对象,一个是指向类的对象的指针void main() M p(5,7),q; /定义定义M类的两个对象类的两个对象p和和q,

7、并初始化并初始化 q.copy(&p); /调用成员函数调用成员函数copy(),实参为实参为&p,为为q对象赋值对象赋值 fun(p,&q); p.print(); q.print();void fun(M m1,M *m2) m1.setxy(12,15); m2-setxy(22,25); 运行程序的结果:5,722,25第第 6 6 章章三、对象引用:三、对象引用:1 1、对象引用的定义和赋值:、对象引用的定义和赋值: 已知对象引用ra是类A的一个对象a的引用,其说明格式如下: A a; A &ra=a;2 2、对象引用可作函数参数及返回值:、对象引用可

8、作函数参数及返回值: 使用对象引用作函数参数不但具有用对象指针作函数参数的优点,而且用对象引用作函数参数将更简单,更直接。 第第 6 6 章章例例3 3、使用对象引用作函数参数分析例2的程序#include class M public: M() x=y=0; M(int i,int j) x=i;y=j; void copy(M &m); void setxy(int i,int j) x=i;y=j; void print() coutx,yendl; private: int x,y;void M copy(M &m) x=m.x; y=m.y;第第 6 6 章章void

9、 fun(M m1,M &m2);void main() M p(5,7),q; q.copy(p); fun(p,q); p.print(); q.print();void fun(M m1,M &m2) m1.setxy(12,15); m2.setxy(22,25);运行程序的结果:5,722,25第第 6 6 章章四、四、thisthis指针指针: thisthis指针指针是一个隐含于每一个类的成员函数中的是一个隐含于每一个类的成员函数中的特殊指针特殊指针,是一种系统自动创建的指向当前对象的指,是一种系统自动创建的指向当前对象的指针,当使用对象调用一个成员函数时,系统将

10、创建针,当使用对象调用一个成员函数时,系统将创建thisthis指向该对象。指向该对象。通常this指针被隐含使用,有时也被显式使用。第第二节二节 数数 组组 第第 6 6 章章 一、一、对象数组对象数组:1 1、对象数组对象数组的定义:的定义:、定义:定义: 对象数组是指数组元素对象数组是指数组元素都都为同类的若干个对象的为同类的若干个对象的数组。数组。、对象数组定义格式对象数组定义格式: : 2、对象数组的赋值对象数组的赋值: 对象数组的赋值和一般数组赋值一样,可以在定义时被赋初值,也可以先定义而后再被赋值。例例4 4、分析对象数组的赋值方法以及对象数组引用的程序。第第 6 6 章章#in

11、clude class DATE public: DATE() month=day=year=0; DATE (int m,int d,int y) month=m; day=d; year=y; void print() coutMonth=month,Day=day,Year=yearendl; private: int month,day,year;第第 6 6 章章void main()DATE dates5=DATE(7,22,1998),DATE(7,23,1998),DATE(7,24,1998); dates3=DATE(7,25,1998); dates4=DATE(7,26

12、,1998); for(int i=0;i5;i+) datesi.print();运行程序输出结果如下:Month=7,Day=22,Year=1998Month=7,Day=23,Year=1998Month=7,Day=24,Year=1998Month=7,Day=25,Year=1998Month=7,Day=26,Year=1998第第 6 6 章章二、二、指向数组的指针和指针数组指向数组的指针和指针数组:1 1、指向数组的指针指向数组的指针: 指向数组的指针可以是指向一般数组的指针,也可以是指向对象数组的指针。 指向对象数组的指针的定义格式: ( ( * * ) ) 2 2、指针

13、数组指针数组: 指针数组是指数组元素为指针的数组指针数组是指数组元素为指针的数组。 指针数组的元素可以是指向同一类型的一般指针,也可以是指向同一类的对象的指针。 对象指针数组的格式: * * 第第 6 6 章章注意:注意:指向数组的指针和指针数组是两个完全不同的概念,但两者的定义格式相似相似。例例6 6、 一个指向对象数组指针的例子。#include class M public: M() a=b=0; M(int i,int j) a=i;b=j; void print() couta,bt; private: int a,b;void main() M m24;第第 6 6 章章 int

14、x=10,y=10; for(int i=0;i2;i+) for(int j=0;j4;j+) mij=M(x+=2,y+=10); M (*pm)4(m); / pm是指向是指向m对象数组的含有对象数组的含有4个元素的列数组指针个元素的列数组指针 for(i=0;i2;i+) coutendl; for(int j=0;j4;j+) ( * ( * (pm+i)+j).print(); coutendl; 执行该程序输出如下结果:12,20 14,30 16,40 18,5020,60 22,70 24,80 26,90第第 6 6 章章例例7 7、一个使用对象指针数组的例子。#inclu

15、de class A public: A(int i=0,int j=0) a=i;b=j; /构造函数中设置了参数缺省值构造函数中设置了参数缺省值 void print(); private: int a,b;void A:print() couta,bendl;void main() A a1(7,8),a2,a3(5,7); /定义类定义类A的三个对象,的三个对象,a1和和a3初始化初始化第第 6 6 章章 A *b3=&a3,&a2,&a1; /定义对象指针数组定义对象指针数组b,并初始化,并初始化 for(int i=0;iprint(); /也可写成也可写成

16、 *bi.print();执行该程序输出如下结果 :5,70,07,8第第三节三节 常对象和常成员常对象和常成员第第 6 6 章章一、常对象和常对象引用:一、常对象和常对象引用:1 1、常对象常对象:是指对象常量是指对象常量。 定义格式: const ; 或者 const ;如:class A public: A(int i,int j)x=i;y=j; private: int x,y;第第 6 6 章章const A a1(3,4); A const a2(8,19);2 2、常对象引用:、常对象引用: 常对象引用定义格式如下: const &=; 或者 const &=;

17、二、常指针:二、常指针: 使用const修饰指针时,由于const的位置不同,而含意不同。、地址是常量地址是常量:第第 6 6 章章 格式: * *const=; 如: char * *const ptr1=strptr1 ptr1=strptr2; /ptr1被重新赋名(不允许) * *ptr1=“strptr2” /ptr1指向新的字符串、指向的内容是常量、指向的内容是常量: 格式: const * *=; 如:const char * *ptr1=strptr1; ptr1=strptr2; /ptr1被重新赋名 *ptr1=“strptr2”; /ptr1指向新的字符串(不允许)第第

18、6 6 章章例例9 9、使用常指针作函数的参数#includeconst int N=6; /定义定义int型常量型常量 N,并初始化,并初始化void print(const int *p,int n); /指向指向int型常量的常指针型常量的常指针p作一个形参作一个形参void main() int arrayN; for(int i=0;iarrayi; print(array,N); /实参是非常量数组实参是非常量数组arrayvoid print(const int *p,int n) cout*p; for(int i=1;in;i+) cout,*(p+i); coutendl;

19、第第 6 6 章章运行程序: 假如从键盘上输入数组的六个元素 1 2 3 4 5 6 得到输出结果如下 : 1,2,3,4,5,6三、常成员:三、常成员:1、常数据成员:、常数据成员: 定义格式如下: constconst类型数据成员名;类型数据成员名; 由于const类型对象必须被初始化,并且不能更新,因此,在类中说明了常数据成员时,只能通过成员初只能通过成员初始化列表的方式来生成构造函数始化列表的方式来生成构造函数实现实现对数据成员对数据成员的的初初始化始化。 带有成员初始化列表的构造函数格式:第第 6 6 章章构造函数名构造函数名( (参数表参数表) ):成员初始化列表:成员初始化列表

20、函数体函数体 例例1212、对类中数据成员使用const说明的例子。#include class A public: A(int i); void print(); const int &r; /说明说明r是是int型的常引用型的常引用 private: const int a; /说明说明a是常是常int型变量,即为常数据成员型变量,即为常数据成员 static const int b; /说明说明b是静态常量,即静态常数据成员是静态常量,即静态常数据成员;const int A:b=10; /为类为类A的静态常数据成员的静态常数据成员b进行初始化进行初始化第第 6 6 章章A:A(

21、int i):a(i),r(a) /利用初始化列表生成的构造函数利用初始化列表生成的构造函数void A:print() couta:b:rendl;void main() A a1(100),a2(0); /通过对象来完成其数据成员的初始化通过对象来完成其数据成员的初始化 a1.print(); a2.print();运行程序得到结果:100:10:1000:10:0第第 6 6 章章2 2、常成员函数:、常成员函数: 只有常成员函数才有资格操作常量或常对象只有常成员函数才有资格操作常量或常对象, ,没有使用const关键字说明的成员函数不能用来操作常对象。 定义格式:类型说明符函数名类型说

22、明符函数名( (参数表参数表) )constconst 函数体函数体 例11、分析说明常成员函数特征的例子。#include class R public: R(int r1,int r2) R1=r1;R2=r2; void print(); 第第 6 6 章章 void print() const; private: int R1,R2;void R:print() coutR1:R2endl;void R:print() const coutR1;R2endl;void main() R a(5,4); a.print(); const R b(20,52); b.print(); 第第

23、 6 6 章章执行该程序输出结果:5:420;52第第四四节节 子对象和堆对象子对象和堆对象第第 6 6 章章一、子对象:子对象: 当一个类中有另一个类的对象作为数据成员时,当一个类中有另一个类的对象作为数据成员时,则该数据成员称为子对象。则该数据成员称为子对象。 子对象反映了两个类之间的包含关系。子对象反映了两个类之间的包含关系。如果在类中出现了子对象,那么该类的构造函数通常也采用成员构造函数通常也采用成员初始化列表的方法来实现对子对象的初始化。初始化列表的方法来实现对子对象的初始化。在成员在成员初始化列表中除包含对子对象的初始化外包含还对类初始化列表中除包含对子对象的初始化外包含还对类中其

24、他数据成员的初始化。中其他数据成员的初始化。例例13、 分析一个含有子对象的例子。#includeclass A public: A(int i,int j) A1=i;A2=j; void print()coutA1,A2endl;第第 6 6 章章 private: int A1,A2;class B public: B(int i,int j,int k):a(i,j),b(k) void print(); private: A a; int b;void B:print()a.print();coutbendl;第第 6 6 章章void main()B b(6,7,8);b.prin

25、t(); 运行程序,得结果:6,78二、堆对象:堆对象: 堆对象是在程序运行过程中根据需要随时可以建堆对象是在程序运行过程中根据需要随时可以建立或删除的对象,又称动态对象。立或删除的对象,又称动态对象。 堆是创建堆对象时在内存中占据的一些空闲的存储堆是创建堆对象时在内存中占据的一些空闲的存储单元。单元。 创建或删除堆对象时,需要使用动态分配内存空间的两个运算符:new 和 delete 第第 6 6 章章1 1、 运算符运算符newnew的用法:的用法:、用来创建堆对象:、用来创建堆对象:创建格式: new new ()或 new new () 如:intint *p; p=new intin

26、t a(2); A A *ptr; ptr=new A A(5,6);、用来创建一般类型的数组:、用来创建一般类型的数组: 创建格式: new new (算术表达式)(算术表达式) 第第 6 6 章章 如:int *p;p=new int5;、用来创建对象数组:用来创建对象数组: 创建格式: new new (算术表达式)(算术表达式) 如: A *ptr; ptr=new A5; 注意:注意:使用new运算符创建对象数组和一般数组时不能为所创建的数组指定初始值,其初始值为缺省不能为所创建的数组指定初始值,其初始值为缺省值。值。 第第 6 6 章章、运算符、运算符deletedelete的用法:的用法:、用来删除使用、用来删除使用newnew创建的对象或一般类型的指针:创建的对象或一般类型的指针: 删除格式: deletedelete 如: intint *p; p

温馨提示

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

评论

0/150

提交评论