- 1、本文档共89页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[理学]第三章构造函数和析构函数
例如:下面程序中共创建了7 个对象,使用了3 次拷贝构造函数。 #include “tpoint.h” Tpoint fun(Tpoint q); void main() { Tpoint M(12,20),P(0,0),S(0,0); Tpoint N(M); P=fun(N); S=M; cout“P=”P.xcoord()“,”P.ycoord() endl; cout“S=”S.xcoord()“,”S.ycoord() endl; } Tpoint fun(Tpoint q) { cout“OK\n”; int x=q.xcoord()+10; int y=q.ycoord()+15; Tpoint R(x,y); return R; } //…tpoint.h #include iostream.h class Tpoint { public: Tpoint(int xp,int yp) {x=xp; y=yp;} Tpoint(Tpoint p); ~Tpoint() {cout“Destructor called.\n”;} int xcoord() {return x;} int ycoord() {return y;} private: int x,y; }; Tpoint::Tpoint(Tpoint p) { x=p.x; y=p.y; cout“Copy_initialization constructor called.\n”; } 输出结果如下: Copy_initialization constructor called. Copy_initialization constructor called. OK Copy_initialization constructor called. Destructor called. Destructor called. Destructor called. P=22,35 S=12,20 Destructor called. Destructor called. Destructor called. Destructor called. 程序输出结果说明程序中出现了三次调用构造函数: Tpoint N(M); //M 对象创建N 对象 P=fun(N); //实参N 对象被拷贝到形参q对象 return R; //函数返回时,调用拷贝构造函数,用对象R创建 // 一个临时对象,保存R 的数据,在主函数中临 // 时对象被释放前,将它的内容赋值到对象P 中。 临时对象 P 放 入 取 出 R fun()主函数 暂存区 main()区 临时对象起暂存作用的情况如下图所示: 析构函数的作用与构造函数几乎正好相反,它在对象删除前被自动调用,来完成一些清理工作,也就是一些扫尾工作。 析构函数与构造函数一样也是类的一个公有函数成员,它也不能有返回值,它的名称必须由类名前面加“~”构成。 析构函数 例如在下面情况下需要使用析构函数:一个对象当结束其生命期时,比如在函数体内定义的对象,当该函数调用结束时,局部对象被释放(包括局部对象,全局对象,静态局部对象)。 构造函数打开一个文件,使用完文件时,需要关闭文件。 从堆中分配了动态内存区,在对象消失之前必须释放。 析构函数的特点: 无返回类型; 无参数; 不能随意调用; 不能重载。 而构造函数可以有参数,也可以重载。 析构函数与构造函数的功能相对应,所以析构函数名是构造函数名前加一个逻辑反运算符“~” 实际上,析构函数不仅限于释放资源方面,它还可以用来被执行用户希望在最后一次使用对象之后所执行的
文档评论(0)