第8讲子对象共用数据的保护_第1页
第8讲子对象共用数据的保护_第2页
第8讲子对象共用数据的保护_第3页
第8讲子对象共用数据的保护_第4页
第8讲子对象共用数据的保护_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

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

文档简介

1、子对象的初始化、常数据成员、常指针、子对象的初始化、常数据成员、常指针、常引用、常成员函数常引用、常成员函数C+程序设计程序设计第第8讲讲 子对象、共用数据的保护子对象、共用数据的保护在程序运行过程中,根据需要可以随时建立或删除的对象;堆在程序运行过程中,根据需要可以随时建立或删除的对象;堆对象创建在一些空闲的存储单元中,这些存储单元称为堆。对象创建在一些空闲的存储单元中,这些存储单元称为堆。1、堆对象、堆对象堆内存:堆内存:C+支持动态数据结构,提供了指针这一特殊形式的数据类型,支持动态数据结构,提供了指针这一特殊形式的数据类型,并在内存中开辟了称为堆的动态存储区。堆是程序共享的空间。并在内

2、存中开辟了称为堆的动态存储区。堆是程序共享的空间。栈内存:栈内存:每个函数都有自己的栈,栈用来在函数之间传递参数。函数中每个函数都有自己的栈,栈用来在函数之间传递参数。函数中定义的变量保存在栈中,每个定义的变量保存在栈中,每个C+对象的数据成员也保存在栈中。对象的数据成员也保存在栈中。栈空间不需要显式的分配和释放。栈空间不需要显式的分配和释放。复习运算符复习运算符 new、delete复习运算符复习运算符 new、delete(1)new运算符运算符动态创建动态创建对象;对象;new ()knew运算符运算符返回返回一个与一个与new所分配对象类型相匹配所分配对象类型相匹配的的指针指针;k如果

3、如果new运算符不能分配到所需要的内存,将返回运算符不能分配到所需要的内存,将返回0,这时为空指针,这时为空指针;k使用使用new运算符运算符创建对象创建对象时,它可以根据其参数来时,它可以根据其参数来选择选择适当的适当的构造函数构造函数;在在C+中的全局对象和局部对象的生存期是严格定义的,程序员不能中的全局对象和局部对象的生存期是严格定义的,程序员不能以任何方式改变它们的生存期,但是可以创建一些生存期能被程序员控制以任何方式改变它们的生存期,但是可以创建一些生存期能被程序员控制的对象,它们的分配和释放可以根据程序运行中的操作来决定,可以动态的对象,它们的分配和释放可以根据程序运行中的操作来决

4、定,可以动态分配和释放对象。分配和释放对象。new创建数组:(创建数组:(需要给出数组的结构说明需要给出数组的结构说明)new k使用使用new创建对象数组或一般数组时,创建对象数组或一般数组时,不能不能为该数为该数组组指定初始值指定初始值,其初始值为,其初始值为缺省值缺省值;例如:例如:A *ptr;ptr=new A5;k使用使用new 创建创建对象数组对象数组时,类中必须说明时,类中必须说明缺省构缺省构造函数造函数;功能:删除功能:删除用用new创建的对象或一般类型的创建的对象或一般类型的指针指针;delete 删除对象数组删除对象数组delete (2)delete运算符运算符例如:冒

5、泡法排序例如:冒泡法排序#include class Paixupublic:Paixu();Paixu(int n);void shuru();void maopao();void disp();Paixu();private:int numb;float *p;Paixu:Paixu()numb=0; p=NULL;Paixu:Paixu(int n)numb=n; p=new floatn;Paixu:Paixu() numb=0; delete p; void Paixu:shuru() if(numb=0 & p=NULL) coutnumb; p=new floatnumb

6、; for(int i=0;ipi;void Paixu:maopao()int i,j; float t; for(i=0;inumb-1;i+) for(j=0;jpj+1) t=pj;pj=pj+1;pj+1=t;void Paixu:disp()int i; for(i=0;inumb;i+) coutpi ; coutendl;int main()Paixu shuzu; shuzu.shuru();shuzu.maopao();shuzu.disp();return 0;复习复习数据类型数据类型布尔型数据布尔型数据 布尔型变量的说明:布尔型变量的说明:例:例:bool flag;

7、布尔型数据的取值:布尔型数据的取值:只有只有 false 和和 true 两个值两个值 bool型数据占据型数据占据1字节内存。字节内存。string是一种自定义的类型,可以方便地执行是一种自定义的类型,可以方便地执行C-串所不能直接执行的一切操作。它处理空间占用问串所不能直接执行的一切操作。它处理空间占用问题是自动的,需要多少,用多少。题是自动的,需要多少,用多少。例如:例如:#include#includeint main() string str1(“one”,str2(“tow”);cout “交换前的串:交换前的串:n str1” str1“str2”str2;str1.swap(s

8、tr2);cout “交换后的串:交换后的串:n str1” str1“str2”str2sName=sName;this-NEXT=NEXT;Node(string sName,string sAddree,string sPhone,string sMobile, string sEmail):stud(sName,sAddree,sPhone,sMobile,sEmail)/空语句体空语句体,用来从文件读数据信息用来从文件读数据信息;class List/定义一个定义一个List类类private:Node*Start;/表头指针表头指针,固定在表头固定在表头Node*Curr;/当前遍

9、历位置指针当前遍历位置指针Node*Prev;/当前位置的前节点指针当前位置的前节点指针Node*End;/表尾指针表尾指针,固定在表尾固定在表尾intiPosition; /当前节点在表中的位置序号当前节点在表中的位置序号public:List()/构造函数构造函数Start=Curr=Prev=End=NULL;iPosition=1;一、子对象一、子对象子对象即子对象即对象成员对象成员;当类中出现了子对象(对象成员)时,该类的当类中出现了子对象(对象成员)时,该类的构造函数要包含对子对象的初始化,通常构造函数要包含对子对象的初始化,通常采用采用成员初始化列表成员初始化列表的方法来的方法来

10、初始化子对象初始化子对象;l子对象子对象:当:当一个类的成员一个类的成员是是另一个类的对象另一个类的对象时,该对象就为子对象;时,该对象就为子对象;子对象(续)子对象(续)例:分析下列程序的输出结果。例:分析下列程序的输出结果。#include class Apublic: A(int i,int j) a1=i;a2=j; void Print() couta1, a2endl;private: int a1,a2;class Bprivate: A a; int b;子对象子对象a子对象(续)子对象(续)public: B(int i,int j,int k):a(i,j),b(k) vo

11、id Print();void B:Print() a.Print(); coutbendl;void main() B b(6,7,8); b.Print();对子对象成员函数的调用对子对象成员函数的调用输出:输出:6,78成员初始化列表成员初始化列表a是是A类类对象,对象,是是B类类的子对的子对象象子对象(续)子对象(续)例:分析下列程序的输出结果。例:分析下列程序的输出结果。/part.hclass Partpublic: Part(); Part(int i); Part(); void Print();private: int val;子对象(续)子对象(续)/part.cpp#in

12、clude #include part.hPart:Part() val=0; coutDefault Constructor of Part. endl;Part:Part(int i) val=i; coutConstructor of Part valendl;Part:Part()子对象(续)子对象(续) coutDestructor of Part valendl;void Part:Print() coutvalendl;/whole.h#includepart.hclass Wholepublic: Whole();子对象(续)子对象(续) Whole(int i,int j,i

13、nt k); Whole(); void Print();private: Part one; Part two; int date;/whole.cpp#include #include whole.hWhole:Whole()子对象子对象one、two子对象(续)子对象(续) date=0; coutDefault constructor of Whole. endl;Whole:Whole(int i,int j,int k):two(i),one(j) date=k;coutConstructor of Whole. endl;Whole:Whole() coutDestructor

14、of Whole. endl;void Whole:Print() one.Print(); two.Print();成员初成员初始化列表始化列表构造函数体构造函数体子对象(续)子对象(续) coutdateendl;/ex613.cpp#include whole.hvoid main() Whole anObject(5,6,10); anObject.Print();输出:输出: Constructor of Part 6 Constructor of Part 5 Constructor of Whole. 6 5 10 Destructor of Whole. Destructor

15、of Part 5 Destructor of Part 6子对象(续)子对象(续) #include whole.hvoid main() Whole anObject; anObject.Print();输出:输出: Default constructor of Part. Default constructor of Part. Default constructor of Whole. 0 0 0 Destructor of Whole. Destructor of Part 0 Destructor of Part 0子对象(续)子对象(续)子对象必须子对象必须在成员初始化列表中初始

16、化在成员初始化列表中初始化;说明:说明:建立一个对象时,它的建立一个对象时,它的所有子对象一起建立所有子对象一起建立;先执行先执行子对象构造函数子对象构造函数,再执行,再执行对象的构造函数体对象的构造函数体;析构函数析构函数的的执行顺序执行顺序与与构造函构造函数的数的执行顺序执行顺序严格严格相反相反;构造函数构造函数的的调用顺序调用顺序仅与仅与子对象在类中声明的顺序子对象在类中声明的顺序有有关,而与成员初始化列表中给出的对构造函数的调用顺关,而与成员初始化列表中给出的对构造函数的调用顺序无关;序无关;构造函数的成员初始化列表中构造函数的成员初始化列表中未给出对子对象的调用未给出对子对象的调用,

17、则表示使用则表示使用子对象子对象的的缺省构造函数缺省构造函数;二、(二、(9.6) 共用数据的保护共用数据的保护程序中有些数据是共享的,例如实参与形程序中有些数据是共享的,例如实参与形参,变量与其引用,数据及其指针等。有时在参,变量与其引用,数据及其指针等。有时在无意之中的误操作会改变有关数据,因此有时无意之中的误操作会改变有关数据,因此有时需要对数据进行保护,这时可以使用需要对数据进行保护,这时可以使用const。回顾一般常量(简单类型的常量)回顾一般常量(简单类型的常量) const 或或const int const x=2;或或const int x=2;int const a3=1,

18、2,3;或或const int a3=1,2,3;数组元素的值是常量,不能更新;数组元素的值是常量,不能更新;(一)常对象(一)常对象常对象常对象希望数据成员不被改变的对象,可以声明为常对象希望数据成员不被改变的对象,可以声明为常对象 const class A public: A(int i,int j) x=i;y=j;private:int x,y;const A a1(3,4);或或 A const a1(3,4);常对象常对象a1注意:注意:常对象中的数据成员为常变量常对象中的数据成员为常变量且必须有初值。对象且必须有初值。对象a1中的所中的所有数据成员都不能被修改。有数据成员都不能

19、被修改。可以将对象的成员声明为可以将对象的成员声明为constconst,包括,包括常数据成员常数据成员和和常常成员函数成员函数。常数据成员的作用和用法与一般常变量相似,用关键常数据成员的作用和用法与一般常变量相似,用关键字字const来声明常数据成员。常数据成员的值是不能来声明常数据成员。常数据成员的值是不能改变的。改变的。1、常数据成员、常数据成员常数据成员只能通过成员初始化列表的方法进行初常数据成员只能通过成员初始化列表的方法进行初始化;常数据成员不能被赋值。始化;常数据成员不能被赋值。二、常对象成员二、常对象成员注意:注意: 例:例:分析下列程序的输出结果。分析下列程序的输出结果。#i

20、nclude #include using namespace std;using namespace std;class Aclass A public:public: A(int i); A(int i); void Print(); void Print();private:private: const int a;const int a; static const int b; static const int b; const int& r; const int& r; int c;int c;const int A:b=10;const int A:b=10;A:A

21、(int iA:A(int i) :a(i),r(a):a(i),r(a)c=8; c=8; 私有私有成员,常引用成员,常引用r r私有成员,常量私有成员,常量a a私有常静态数据成员私有常静态数据成员b b成员初始化列表成员初始化列表,常成员常成员( (除常静态成员外除常静态成员外) )在此初始化在此初始化私有常静态数据成员私有常静态数据成员b b初始化初始化void A:Print()void A:Print() couta:b:r:cendl; couta:b:r:cendl; int main()int main() A a1(100),a2(0); A a1(100),a2(0);

22、a1.Print(); a1.Print(); a2.Print(); a2.Print(); return 0; return 0; 输出100:10:100:80:10:0 2、常成员函数、常成员函数 使用使用constconst关键字进行说明的成员函数;关键字进行说明的成员函数; ( ) ) constconst; ;constconst是函数类型的一个组成部分,在函数实现部是函数类型的一个组成部分,在函数实现部分必须带有分必须带有constconst关键字;关键字;说明:说明: 只有只有常成员函数才能操作常对象常成员函数才能操作常对象;表成员函数与对象之间的操作关系表成员函数与对象之间

23、的操作关系常成员函数(续)常成员函数(续)例:分析下列程序是否正确。例:分析下列程序是否正确。#include class Mpublic: M(int x,int y) X=x;Y=y; void Move(int x,int y) X=x;Y=y; void Print() const coutX, Yendl;private: int X,Y;一般成员函数一般成员函数常成员函数常成员函数常成员函数(续)常成员函数(续)void main() const M m1(1,2); m1.Move(3,3); m1.Print(); M m2(3,4); m2.Move(3,3); m2.Pri

24、nt();常对象常对象m1一般对象一般对象m2错误错误,一般成员函数,一般成员函数不能操作常对象不能操作常对象正确,常成员函数正确,常成员函数可以操作常对象可以操作常对象常成员函数(续)常成员函数(续)例:分析下列程序的输出结果。例:分析下列程序的输出结果。#include class Rpublic: R(int r1,int r2) R1=r1;R2=r2; void Print() coutR1:R2endl; void Print() const coutR1;R2endl;private: int R1,R2;void main() R a(5,4);常成员函数(续)常成员函数(续)

25、 a.Print(); const R b(20,52); b.Print();输输出出5:420;52 对重载条件的补充:对重载条件的补充:void Print();void Print() const;可重载;可重载;常对象调用常成员函数,常对象调用常成员函数,一般对象调用一般成员函数一般对象调用一般成员函数成员函数引用数据成员的操作关系成员函数引用数据成员的操作关系数据成员数据成员非非const成员函成员函数数const成员函数成员函数非非const 数据数据成员成员可以使用,也可可以使用,也可以改变值以改变值可以使用,但不可以使用,但不可以改变值可以改变值const 数据成数据成员员可

26、以使用,但不可以使用,但不可以改变值可以改变值可以使用,但不可以使用,但不可以改变值可以改变值const 对象的对象的数据成员数据成员不允许使用和改不允许使用和改变值变值可以使用,但不可以使用,但不可以改变值可以改变值三、常指针和常引用三、常指针和常引用 1、常指针、常指针char * const ptr1=strptr1;ptr1是一个是一个常量指针常量指针;ptr1=strptr2;*ptr1=m;ptr1不不可以更新可以更新ptr1所指向的变量可以所指向的变量可以更新;更新;注意注意const的位置的位置const char * ptr2=strptr1;ptr2是一个是一个指向字符常量

27、指向字符常量的指针的指针;ptr2=strptr2;*ptr2=m;ptr2可以更新可以更新ptr2所指向的字符串所指向的字符串不不可可以更新;以更新;错误错误正确正确正确正确错误错误(1)指向对象的常指针)指向对象的常指针定义指向对象的常指针的形式:定义指向对象的常指针的形式:类名类名 * const 指针变量名指针变量名=对象地址;对象地址;例如:例如:Point t1; Point * const ptr1; ptr1=&t1;错,常指针不错,常指针不能被赋值能被赋值常指针往往作为函数的形参,目的是不允许在函数执行常指针往往作为函数的形参,目的是不允许在函数执行过程中改变指针变量

28、的值,使其始终指向原来的对象。过程中改变指针变量的值,使其始终指向原来的对象。(2)指向常对象的指针变量)指向常对象的指针变量定义指向常对象的指针变量的形式:定义指向常对象的指针变量的形式:const 类名类名 * 指针变量名;指针变量名;说明:说明:a、如果一个变量已被声明为常量,只能用指、如果一个变量已被声明为常量,只能用指向常变量的指针变量指向它,而不能用一向常变量的指针变量指向它,而不能用一般的指针去指向它。般的指针去指向它。例如:例如: const char c=“Boy”, const char *p1; p1=c; char *p2=c;错,错,p2不是指向不是指向常变量的指针常

29、变量的指针例如:例如: const Point p1(10,12); const Point *p; p=&p1; Point *p2; p2=&p1; 错错b、指向常变量的指针变量除了可以指向常变量、指向常变量的指针变量除了可以指向常变量外,还可以指向外,还可以指向未被声明未被声明为为const的变量的变量。此。此时时不能通过此指针变量改变该变量的值不能通过此指针变量改变该变量的值。例如:例如: char c1=a; const char *p; p=&c1; *p=b; c1=b;错,不能通过错,不能通过p改变变量改变变量c1的值的值例如:设例如:设Point类的数

30、据成员类的数据成员x访问权限是访问权限是公有的公有的 Point p1(10,12); const Point *p=&p1; p1.x=18; (*p).x=18; 错错c、如果、如果函数的形参函数的形参是指向是指向非非const型变量型变量的指的指针,针,实参实参只能用指向只能用指向非非const变量变量的指针,的指针,而而不能用指向不能用指向const变量变量的指针,这样,的指针,这样,可以在执行函数的过程中可以改变形参指可以在执行函数的过程中可以改变形参指针变量所指向的变量(实参指针变量所指针变量所指向的变量(实参指针变量所指向的变量)的值。如果向的变量)的值。如果函数的形参函

31、数的形参是指向是指向const型变量型变量的指针,在执行函数的过程的指针,在执行函数的过程中不能改变指针变量所指向的变量的值。中不能改变指针变量所指向的变量的值。因此因此允许实参允许实参是指向是指向const变量变量的指针,的指针,或指向或指向非非const变量变量的指针。的指针。例如:例如: const char str=“boy”; void fun(char *ptr); fun(str);Str是是const型数组型数组函数函数fun的形参是指向非的形参是指向非const型变量的指针型变量的指针调用调用fun函数,实参是函数,实参是const变量的地址,因此错。变量的地址,因此错。例如

32、例如:void fun(const Point *p);Point p1(10,12);fun(&p1);指向常对象的指针最常用于函数的形指向常对象的指针最常用于函数的形参参,目的是保护形参指针所指的对象目的是保护形参指针所指的对象,使它在使它在函数执行过程中不被修改。函数执行过程中不被修改。形参形参实参实参合法否合法否改变指针所指改变指针所指的变量的值的变量的值指向非指向非const型变量的指针型变量的指针非非const变量变量的地址的地址合法合法改变指针所指向的改变指针所指向的变量的值变量的值指向非指向非const型变量的指针型变量的指针const变量的变量的地址地址非法非法/指向

33、指向const型型变量的指针变量的指针const变量的变量的地址地址合法合法不可以不可以指向指向const型型变量的指针变量的指针非非const变量变量的地址的地址合法合法不可以不可以2、常引用、常引用 (不能通过不能通过引用,引用,更新更新被引用的对象被引用的对象)const & & double x=1.2; const double & v=x;则:则:v=12.3错误。错误。3、常指针与常引用的作用、常指针与常引用的作用使用常参数表明该函数不会更新某个参数所指向或使用常参数表明该函数不会更新某个参数所指向或所引用的对象,并使该函数具有更大的适应性;所引用的对象,并使该函数具有更大的适应性;实参 形参常类型非常类型常类型非常类型例:分析下列程序的输出结果。例:分析下列程序的输出结果。#include const int N=6;void print(const int *p,int n);void main() int arrayN; for(int i=0;ia

温馨提示

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

评论

0/150

提交评论