APP下载

面向对象程序设计中构造、析构函数的教学探讨

2019-03-04韩祥波

电脑知识与技术 2019年34期
关键词:教学实践

摘要:结合构造、析构函数出现的原因探讨了构造函数的三种形式,分析了拷贝构造函数的三种调用方式,讨论了全局对象、静态对象、块对象的构造、析构过程。通过卓越班面向对象程序设计中多次教学实践证明,学生兴趣提升,对知识点的理解更有深度。

关键词:C++;析构;拷贝构造函数;全局对象;静态对象;教学实践

中图分类号:G642 文献标识码:A

文章编号:1009-3044(2019)34-0168-02

1 概述

在C++中类的实例即对象的创建需要一系列初始化的工作,为此引入了构造函数达到自动调用、分配内存空间、初始化数据来创建对象的目的。由于其自动调用的特性决定了构造函数的诸多要求:函数名和类名相同,且无返回值,可以重载,不能被继承,不能用函数名调用。析构函数则是与构造函数相反:对结束生命周期的对象回收来释放内存。析构函数也是自动调用并没有函数返回值,不能被继承,由于没有形参无法实现函数重载,故类的析构函数只能有1个,而构造函数可以有多个。构造函数常见形式有:默认构造函数、普通的构造函数、拷贝构造函数。默认构造函数的特点是没有参数,若没有定义构造函数,则编译器自动生成一个无参构造函数作为默认构造函数,而拷贝构造函数仅有一个参数,且参数类型是对自身类的引用,且与参数类型的构造函数则为普通的构造函数。

2 教学实践

2.1 三种构造函数并及拷贝构造函数的三种调用方式

下面举例来说明上述三种构造函数并对拷贝构造函数的复杂调用方式进行了探讨。

#include

class Cobj{public:Cobi0{x=0;)Cobj(int In){x=m;)

Cobj(const Cobj&p)(x=p.x;cout《”Calling constructor:”<

intx;};

void fI(Cobj p)(cout<<”Calling fl”<

Cobj f20 {cout<<”Calling fl”《endl; Cobj

a(102);

re-turn a;}

main0 {Cobj a(lOI);Cobj b=a; f1(b);

b= f20;}

其中Cobi0(x=0;)为默认构造函数,将类的成员x初始为0;普通构造函数Cobj(int m){x=m;)使得成员值为用户设定值。拷贝构造函数Cobj(const Cobj&p)的参数必须是本类的引用,此处的const不是必须项,加入的目的是保护传人的实参不改变。主函数中Cobjb=a语句目的是用a初始化b从而第1次调用拷贝构造函数。

fl(b)语句使得对象b作为funl的实参而第2次调用拷贝构造函数;语句b= f20使得函数的返回值是类对象,函数返回时调用拷贝构造函数。

2.2 全局对象、静态对象、块对象的构造与析构

下面结合一个综合实例来说明构造函数、析构函数的执行顺序。该实例包含全局对象、静态对象、块对象、自定义函数等复杂情况。

#include

class

Cobj( public: Cobj(int n){num=n;cout<<”constructor”<

-CobiO{cout<<”destructor”<

Cobj stl(lOOl);static Cobj st2(1002);voidfnO{Cobj st3(1003);】

mainO{cout《”begin”《endl; int i=l;Cobj st4(1004);

for(i=l;i<=2;i++) {static Cobj st5(1005); Cobj st6(1006);1

fn0; cout<<”end”<

执行结果如图2所示。

分析下执行过程:启动代码会在启动main0之前完成所有的初始化工作,因此在输出”begin”前构造全局对象1001,接着构造静态对象1002后才执行主函数。在main0中先构造对象1004,然后进入循环语句,在三次循环中对于普通对象1006每次循环都是先构造,当本次循环结束时作为块对象生命周期要结束,故调用析构函数。主函数中的for语句用”(...)”代替时,块内定义的对象当块执行完毕后也要立刻释放。如对象1007就属于这种情况。而对于块内的1005对象由于是静态对象只创造1次,在退出主函数时调用析构函数才释放。接着执行fn0函数构造对象1003,该函数执行完毕后随即释放1003。最后退出主函数时释放静态对象1002和全局对象1001。首行代码用#include 与命名空间模式则无法输出”destructor1001”。即全局对象在不同的编译情景下会有较大差异。

3 结论

构造函数、析构函数的自动调用使得不少同学迷茫,本文分析了这两个函数出现的缘由,结合几个教学案例分析了默认构造函数、普通的构造函数、拷贝构造函数的定义格式和使用方法,并对拷贝构造函数的多种调用方式进行了代码解析,通过全局对象、静态对象、块对象在程序中的构造、析构过程阐明了面向对象程序设计中对象这个特定角色的来世今生。

参考文献:

[1]尹诗玉,方欢,基于C++语言的外部输入若干问题的探讨[J].电脑知识与技术,2018(04).

[2] BjarneStroustrup.C++程序设计语言:特别版[M].裘宗燕,译.北京:机械工业出版社,2010.

[3]谭浩强.C++面向对象程序设计[M].北京:清华大学出版社,2006.

[4]陈维兴,林小茶.C++面向对象程序设计教程[M].北京:清华大学出版社,2000.

[5]钱能.C++程序设计教程[M].北京:清华大学出版社,1999.

[6]罗宪,王家伟,周建丽.“高级语言程序设计”“面向对象程序设计”精品课程教学改革与实践[J].重庆交通大学学报(社会科学版),2009,9(1).

[7]孙振华,戎丽霞.浅谈微课在高职计算机专业教学中的应用研究——以《C#程序设计》课程为例[J].电脑知识与技术,2015(18).

[8] Stanley,B.Lippman,Barbara E.Moo.C++Primer中文版:第四版[M].李师贤,等译.北京:人民邮电出版社,2006.

[9]吕凤翥.C++语言基础教程[M].北京:清华大学出版社,1999.

【通联编辑:王力】

收稿日期:2019-09-23

作者簡介:韩祥波(1975-),男,山东淄博人,讲师,硕士,研究方向为计算机软件与理论。

猜你喜欢

教学实践
立足课堂,因学施教
浅论高中化学生活化教学的实践与思考
浅谈初中物理实验教学与学生创新能力的培养
测量平差课程教学改革探讨与实践