版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C+程序设计 第五章 堆与拷贝构造函数 沈阳航空工业学院C+程序设计 第五章 堆与拷贝构造函数 沈阳航空工业学院 内存空间的访问方式内存空间的访问方式 计算机的内存储器被划分为一个个的存储单元。存储单元计算机的内存储器被划分为一个个的存储单元。存储单元按一定的规则编号,这个编号就是存储单元的地址。每个字节按一定的规则编号,这个编号就是存储单元的地址。每个字节是一个基本内存单元。是一个基本内存单元。 在在C+C+程序中是如何从内存单元中存取数据呢?程序中是如何从内存单元中存取数据呢?1 1、通过变量名、通过变量名 在变量获得内存空间的同时,变量名成了相应内存空间的在变量获得内存空间的同时,变量名
2、成了相应内存空间的名称。名称。2 2、通过地址、通过地址 如果当变量名不够方便或者根本没有变量名可用时,这是如果当变量名不够方便或者根本没有变量名可用时,这是就需要直接用地址来访问内存空间。就需要直接用地址来访问内存空间。1.1.指针指针C+程序设计 第五章 堆与拷贝构造函数 沈阳航空工业学院 指针变量的声明指针变量的声明int a=5;int*pa=&a;cout*pa成员名成员名 等同于等同于 (*对象指针名对象指针名).成员名成员名 C+程序设计 第五章 堆与拷贝构造函数 沈阳航空工业学院例:使用指针来访问例:使用指针来访问PointPoint类的成员类的成员#includeusing
3、namespace std;class Pointpublic:Point(int xx,int yy) x=xx,y=yy;int getx()return x;int gety()return y;private: int x,y;void main() Point a(4,5); Point *p1; p1=&a; coutgetx()endl; cout(*p1).gety()endl;C+程序设计 第五章 堆与拷贝构造函数 沈阳航空工业学院 引用的概念引用的概念2. 引引 用用 引用是给变量取一个别名,它引入了变量的一个同意词。引用是给变量取一个别名,它引入了变量的一个同意词。 格式
4、:格式: type & 含义是含义是“type类型的引用类型的引用” 此引用与此引用与type类型变量的地址相联系。类型变量的地址相联系。 如:如:int i;int &j=i;创建一个整型引用创建一个整型引用j, j是是i的地址的别名。的地址的别名。 j和和i的地址相同,表示同一个变量。的地址相同,表示同一个变量。 int i=5; int &j=i; i=i+1;/i,j都为都为6注意:注意: 在声明引用时,马上就要对它进行初始化,不能在声明完后重赋值。在声明引用时,马上就要对它进行初始化,不能在声明完后重赋值。 故故 int i; int &j; j=i; 是错误是错误 引用运算符只在声
5、明时使用,任何其他引用运算符只在声明时使用,任何其他“&”的使用都是地址操作的使用都是地址操作符。符。5i6i, j5i, jC+程序设计 第五章 堆与拷贝构造函数 沈阳航空工业学院#includeusing namespace std; void main()int i; int &j=i; i=5;i+;cout&i &jendl;couti jendl;0 x0012FF7C 0 x0012FF7C6 6C+程序设计 第五章 堆与拷贝构造函数 沈阳航空工业学院#includeusing namespace std; class Pointprivate: int x,y;public:
6、Point(int vx,int vy)x=vx;y=vy; void print()coutx=x y=yendl; 对类对象定义引用与指针举例对类对象定义引用与指针举例 C+程序设计 第五章 堆与拷贝构造函数 沈阳航空工业学院void main()Point p1(10,10);Point &pref=p1; /引用引用coutp1 addr:&p1 pref addr:&prefendl;p1.print(); pref.print();Point p2(20,20),*pt;pt=&p2; /指针指针coutp2 addr:&p2 pt addr:ptprint();p1 addr:0
7、 x0012FF78 pref addr:0 x0012FF78x=10 y=10 x=10 y=10p2 addr:0 x0012FF6C pt addr:0 x0012FF6Cx=20 y=20 x=20 y=20C+程序设计 第五章 堆与拷贝构造函数 沈阳航空工业学院 类的引用作为传递的参数类的引用作为传递的参数#includeusing namespace std;class Aprivate: int x;public:A(int vx) coutConstructor called! vxendl; x=vx; A() coutDeconstructor called! xendl
8、;void print()coutx=xendl;void f1(A &voo) cout&voo=&vooendl; voo.print();void main() A obj(10); obj.print(); cout&obj=&objendl; f1(obj); Constructor called! 10 x=10&obj=0 x0012FF70&voo=0 x0012FF70 x=10Deconstructor called! 10C+程序设计 第五章 堆与拷贝构造函数 沈阳航空工业学院#includeusing namespace std;char s80=Hello World
9、;char &replace(int k)return sk;char *rep(int k) return &sk;void main() replace(11)=!;coutsendl;coutreplace(11)endl;*rep(5)=+;coutrep(0)endl;cout*rep(0)endl;coutreplace(0)endl;coutrep(6)endl;cout*rep(6)endl;coutreplace(6)endl;Hello World!Hello+World!HHWorld!WW 引用作为返回值引用作为返回值 若一个函数返回了引用,那么该函数的调用也可以被赋值
10、。如:若一个函数返回了引用,那么该函数的调用也可以被赋值。如:C+程序设计 第五章 堆与拷贝构造函数 沈阳航空工业学院3. 动态内存分配动态内存分配 所谓动态内存分配是指在程序运行期间根据实际需要随时申请内存,并在所谓动态内存分配是指在程序运行期间根据实际需要随时申请内存,并在不需要时释放。不需要时释放。 new运算符与运算符与delete运算符一起使用,就可以直接进行动态内存的申请和运算符一起使用,就可以直接进行动态内存的申请和释放释放 new运算符运算符 格式:格式: =new (); 功能:动态地分配存储空间。功能:动态地分配存储空间。new能自动计算要分配的类型的大小并能返能自动计算要
11、分配的类型的大小并能返 回正确的指针类型。若返回值为回正确的指针类型。若返回值为0 (NULL),则分配存储空间未成功。,则分配存储空间未成功。 delete运算符运算符格式:格式: delete ; 如如delete s; delete ; 如如delete s;s为任意维数数组,为任意维数数组,功能:指针名指将被释放的存储区的起始地址,该存储区必须是功能:指针名指将被释放的存储区的起始地址,该存储区必须是new分分配的。配的。 C+程序设计 第五章 堆与拷贝构造函数 沈阳航空工业学院q int *p =new int(200)则同时给变量赋上了初值则同时给变量赋上了初值200。q 若分配失
12、败,若分配失败,new将返回一个空指针:将返回一个空指针:p=NULL。q 用用new创建一维整型数组,有创建一维整型数组,有2个元素个元素 int *S=new int2;200& p& SNULL pq Point *p =new Point(10,20) q 用用new创建一维点类型数组,有创建一维点类型数组,有2个元素个元素 Point *S=new Point2;10& p20& S随机随机& pp指向垃圾内存指向垃圾内存q delete p;q 注意:内存被释放,并不表示指针会消亡或者成了注意:内存被释放,并不表示指针会消亡或者成了NULL指针。指针。 一般写作:一般写作:dele
13、te p; p=NULL;C+程序设计 第五章 堆与拷贝构造函数 沈阳航空工业学院/为对象动态分配为对象动态分配#includeusing namespace std;class Pointprivate: int x,y;public:Point(int vx=0,int vy=0)coutConstructor is called!endl;x=vx ; y=vy;void print() cout x yendl; Point()coutDecostructor is called!endl; ; C+程序设计 第五章 堆与拷贝构造函数 沈阳航空工业学院void main() cout为
14、对象动态分配内存为对象动态分配内存print();delete p; p=NULL ; 该对象是使用该对象是使用new运算符动态创建的,在使用运算符动态创建的,在使用delete运算符释放它时,运算符释放它时,delete将会自动调用析构函数将会自动调用析构函数为对象动态分配内存为对象动态分配内存Constructor is called!12 12Decostructor is called!C+程序设计 第五章 堆与拷贝构造函数 沈阳航空工业学院/动态创建对象数组动态创建对象数组class Pointprivate: int x,y;public:Point(int vx=10,int v
15、y=10)x=vx ; y=vy;void print() cout x yendl; ;void main() int i; cout动态创建对象数组动态创建对象数组endl;Point *p=new Point3;if (p=NULL) /p=NULL表示申请失败表示申请失败exit(0);for( i=0;i3;i+) pi.print();delete p; p=NULL ; 动态创建对象数组动态创建对象数组10 1010 1010 10C+程序设计 第五章 堆与拷贝构造函数 沈阳航空工业学院q 拷贝初始化构造函数是一种特殊的成员函数。拷贝初始化构造函数是一种特殊的成员函数。q 功能:
16、用一个已知的对象来初始化一个被创建的同类的对象。功能:用一个已知的对象来初始化一个被创建的同类的对象。拷贝初始化构造函数实际上也是构造函数。拷贝初始化构造函数实际上也是构造函数。q 特点:特点: 1、函数名与类同名,该函数没有返回类型;、函数名与类同名,该函数没有返回类型; 2、函数只有一个参数,且是对类对象的引用;、函数只有一个参数,且是对类对象的引用; 3、每个类都必须有一个拷贝构造函数。、每个类都必须有一个拷贝构造函数。q 格式:格式: :(const&) 其中,其中,const是一个类型修饰符,被它修饰的对象是一个不是一个类型修饰符,被它修饰的对象是一个不能被更新的常量。能被更新的常量
17、。q 如果类中没有说明拷贝构造函数,则编译系统自动生成一个如果类中没有说明拷贝构造函数,则编译系统自动生成一个具有上术形式的缺省拷贝构造函数。作为该类的公有成员。具有上术形式的缺省拷贝构造函数。作为该类的公有成员。4. 拷贝构造函数拷贝构造函数C+程序设计 第五章 堆与拷贝构造函数 沈阳航空工业学院#includeusing namespace std;class Person char* pName;public:Person(char* pN)cout Constructing pN endl;pName=new charstrlen(pN)+1;if(pName!=0)strcpy(pN
18、ame,pN);Person()coutDestructing pName endl;if(pName) delete pName;pName=NULL;void main()Person p1(Tom);Person p2(p1);堆内存未拷贝堆内存未拷贝Constructing TomDestructing TomDestructing葺葺葺葺葺葺葺葺葺葺导致执行错误导致执行错误浅拷贝浅拷贝拷贝后拷贝后拷贝前拷贝前&堆堆1p2&堆堆1Tomp1堆堆1&堆堆1Tomp1堆堆1C+程序设计 第五章 堆与拷贝构造函数 沈阳航空工业学院#includeusing namespace std;cla
19、ss Person char* pName;public:Person(char* pN);Person(const Person& p);Person();Person:Person(char* pN)coutConstructing pN endl;pName=new charstrlen(pN)+1;if(pName!=0) strcpy(pName,pN);Person:Person(const Person& p)coutCopying p.pName n;pName=new charstrlen(p.pName)+1;if(pName!=0) strcpy(pName,p.pNam
20、e);Person:Person() coutDestructing pName endl; if(pName) delete pName; pName=NULL;void main() Person p1(Tom); Person p2(p1); Constructing TomCopying TomDestructing TomDestructing Tom拷贝后拷贝后拷贝前拷贝前&堆堆1p2深拷贝深拷贝&堆堆1Tomp1堆堆1&堆堆1Tomp1堆堆1Tom堆堆2&堆堆2C+程序设计 第五章 堆与拷贝构造函数 沈阳航空工业学院调用拷贝构造函数调用拷贝构造函数 class Personpub
21、lic:Person(char* pN);Person(const Person& p);Person();protected: char* pName;Person:Person(char* pN)pName=new charstrlen(pN)+1;if(pName!=0) strcpy(pName,pN);coutthis Constructing pNameendl;Person:Person(const Person& p)pName=new charstrlen(p.pName)+1;if(pName!=0) strcpy(pName,p.pName);coutthis Copyi
22、ng p.pName n;Person:Person() coutthis Destructing pName endl; if(pName) delete pName; pName=NULL;Person fun(Person Q) coutfun.n; return Q;void main()coutmain.n;Person p1(Tom); Person p2=p1;fun(p2);main.0012F55C Constructing Tom0012F560 Copying Tom0012F564 Copying Tomfun.0012F568 Copying Tom0012F564 Destructing Tom0012F568 Destructing Tom0012F560 Destructing Tom0012F55C Destructing TomC+程序设计
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高端卫浴知识培训课件
- 浙江省杭州市余杭区2023-2024学年五年级上学期英语期末试卷(1月)
- 宁夏银川一中、昆明一中2023届高三联合二模考试数学(文)试题 附答案
- 年产9000万平方米瓦楞纸板项目可行性研究报告模板-立项拿地
- 湖北疫情知识培训课件
- 商务礼仪-待人技巧
- 2025年度网络安全责任书标准范本
- 人口老龄化对医疗卫生服务利用及医疗卫生费用的影响
- 2025版旧设备买卖及拆解回收再利用协议3篇
- 强化整体认知 提升思维水平-“双减”政策下小学数学作业设计
- 2024年06月上海广发银行上海分行社会招考(622)笔试历年参考题库附带答案详解
- TSG 51-2023 起重机械安全技术规程 含2024年第1号修改单
- 计算机科学导论
- 浙江省杭州市钱塘区2023-2024学年四年级上学期英语期末试卷
- 《工程勘察设计收费标准》(2002年修订本)
- 2024年一级消防工程师《消防安全技术综合能力》考试真题及答案解析
- 2024-2025学年六上科学期末综合检测卷(含答案)
- 安徽省森林抚育技术导则
- 泌尿外科护理疑难病例讨论
- 英格索兰空压机操作规程
- 简单通用利润表
评论
0/150
提交评论