第14章堆与拷贝构造函数

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Constructing new student Randy Calling fn() Constructing copy of Randy In function fn() Destructing copy of Randy Return from fn() Destructing Randy
默认拷贝构造函数
14.2不能使用malloc()和free()原因
类对象的建立是分配空间、构造结构以及初始化的三位一体,它们 统一由构造函数来完成。
14.3 分配堆对象
C++的new和delete机制更简单易懂。 void fn() { Tdate* pS; pS=new Tdate; //分配堆空间并构造它 //... delete ps; //先析构,然后将空间返还给堆 }
类定义中,如果未提供自己的拷贝构造函数, 则C++ 提供一个默认拷贝构造函数。 C++提供的默认拷贝构造函数工作的方法是, 完 成一个成员一个成员的拷贝。如果成员是类对象, 则调用其拷贝构造函数或者默认拷贝构造函数。
例 14-2
默认拷贝构造函数的使用
#include <iostream.h> #include <string.h> class Student{ public: Student(char* pName="no name") { cout <<"Constructing new student " <<pName <<endl; strncpy(name,pName,sizeof(name)); name[sizeof(name)-1]='\0'; }
第14章 堆与拷贝构造函数
14.1 堆 14.2 需要new和delete的原因 14.3 分配堆对象 14.4 拷贝构造函数 14.5 默认拷贝构造函数 14.6 浅拷贝与深拷贝 14.7 临时对象 14.8 无名对象 14.9 构造函数用于类型转换
14.1 堆
C++程序的内存格局通常分为四个区 (1)全局数据区(data area);//全局变量、静态数据、常 量存放在全局数据区 (2)代码区(code area);//所有类成员函数和非成员函数 代码存放在代码区 (3)栈区(stack area);//为运行函数而分配的局部变量、 函数参数、返回数据、返回地址等存放在栈区 (4)堆区(即自由存储区)(heap area)。//余下的空间都被 作为堆区。
~Student( ) { cout <<"Destructing " <<name <<endl; } protected: char name[40]; int id; }; void fn(Student s) { cout <<"In function fn( )\n"; } void main() { Student randy("Randy",1234); cout <<"Calling fn()\n"; fn(randy); cout <<"Returned from fn()\n"; }Fra bibliotek4.3 分配堆对象
从堆中还可以分配对象数组。 class Student { public: Student(char* pName="no name") { strncpy(name,pName,sizeof(name)); name[sizeof(name)-1]="\0"; } protected: char name[40]; }; void fn(int noOfObjects) { Student* pS=new Student[noOfObjects]; // new的格式是类型后面跟[元素个数],不能再跟构造函数参数 //所以从堆上分配对象数组,只能调用默认的构造函数。 delete[ ]pS; }
14.3 分配堆对象
堆对象的作用域是整个程序生命期,所以除非程序 运行完毕,否则堆对象作用域不会到期。 堆对象析构是在释放堆对象语句delete执行之时。 (上面的堆对象在执行delete pS;语句时,C++自动 调用其析构函数。)
14.3 分配堆对象
构造函数可以有参数,所以跟在new后面的类类型也可以跟参数。 class Tdate { public: Tdate(int m,int d,int y); protected: int month; int day; int year; }; ....... void fn() { Tdate* pD; pD=new Tdate(1,1,1998);//必须满足参数匹配原则 //如只有默认的构造函数,则可能出错。 delete(pD); }
14.5 拷贝构造函数
何时要用拷贝构造函数? 可用一个对象去构造另一个对象,或者说,用另一 个对象值初始化一个新构造的对象。
例: Student S1(“Jenny”); Student s2=sl; //用s1的值去初始化s2
对象作为函数参数传递时,也要涉及对象的拷贝:
14.5 拷贝构造函数

void fn(Student fs) { //... } void main() { Student ms; fn(ms); }
函数fn()的参数传 递的方式是传值,此 时,需要使用新的构 造函数 Student(Student &s)
例 14-1
拷贝构造函数的使用
#include <iostream.h> #include <string.h> class Student{ public: Student(char* pName="no name",int ssId=0) { strncpy(name,pName,40); name[39]='\0'; id = ssId; cout <<"Constructing new student " <<pName <<endl; } Student(Student& s) //拷贝构造函数 { cout<<"Constructing copy of"<<<<endl; strcpy(name,"copy of "); strcat(name,); id=s.id; }
相关文档
最新文档