C++面向对象程序设计教学探讨

2014-07-18 00:18熊启军宁彬屈俊峰曹文平
电脑知识与技术 2014年13期
关键词:面向对象程序设计教学改革

熊启军 宁彬 屈俊峰 曹文平

C++面向对象程序设计教学探讨

熊启军,宁彬,屈俊峰,曹文平

(湖北文理学院 数学与计算机科学学院 湖北 襄阳 441053)

摘要:《C++面向对象程序设计》课程承担着培养程序设计能力和面向对象思维能力的作用,而C++语言自身的特点繁多,且通常是学生学习面向对象的第一门语言,使得教学存在很大困难。从课程内容的选择和组织、教学方法、考核方式、学习方法等角度出发进行改革和研究,运用于实际教学之中具有显著提高教学效果的作用。

关键词:C++语言;面向对象;程序设计;教学方法;教学改革

中图分类号:G642 文献标识码:A 文章编号:1009-3044(2014)13-3037-03

Discussion for C++ & Oriented Object Programming

XIONG Qi-jun, NING Bin, QU Jun-feng, CAO Wen-ping

(College of Mathematics & Computer Science HuBei University of Arts and Science, Xiangyang 441053, China)

Abstract: "C++ object-oriented programming" course undertakes training in programming and object-oriented thinking, and many features of the C++ language, and it is often the first course to learn object-oriented languages, so that teaching is very difficult. Reform and research from the selection and organization of course content, teaching methods, exam methods, learning methods, these can improve teaching effectiveness.

Key words: C++ language; Oriented Object; Programming; Teaching Method; Teaching Reform

随着计算机编程语言的蓬勃产生和发展、编程语言适用的领域、应用型软件的巨大需求,程序员必须掌握C++的时代已经过去。但是,在学校里,C++仍是计算机及相关专业的必修课。《C++面向对象程序设计》既要讲述语言本身,又要讲述面向对象的知识,还要通过C++来实现面向对象的特征,因而存在内容多、难度大、程序冗长、调试困难等问题,进而教学越来越困难、教学效果越来越差。因此,针对该课程的教学改革势在必行。

1 课程内容

1.1计算机语言间的关系

在地方院校的计算机类专业的教学计划中,一般是先讲授过程化的C语言,主要包括基本的语法规则、算法和程序调试技巧;再讲述面向对象的C++语言;最后讲述高度集成和封装的C#或Java语言。显然,C++语言在其中承担了承上启下的角色,承担了巩固基础、培养计算思维、熟练调试技能的角色,承担了由过程化的程序设计思想向面向对象程序设计思想转换的角色。每个角色的主要作用虽不相同,但都是主角,都是不可缺少的。

图1 语言间关系

1.2教学内容间的关系

《C++面向对象程序设计》课程在教学中不仅地位和作用重要,而且其涉及的教学内容广泛。其教学内容概括起来包括三个部分:一是C++语言的基本语法,二是面向对象的四大特征及基本理论,三是使用C++语言来实现面向对象的特征[1]。对于学习过C语言的来说,第一部分内容只需关注与C语言不同的地方,第二部分是“死板”的理论知识,第三部分既是重点也是难点,也是当前教学改革、研究的重点。

图2 是《C++面向对象程序设计》中第三部分的主要教学内容及相互关系。

2 教学改革

2.1改革教学内容

由于大学教育的大众化,对该课程的教学目标、教学内容当然应该“因校而异”。

1)教学目标存在差异

我校对该课程的主要教学目标是以C++语言为工具载体,向同学们讲述面向对象的特性及其实现,为后续的面向对象的程序设计语言、对象的分析、面向对象的设计、测试等学习做必要的理论铺垫。

2) C++语言的特异性

由于C++是一种诞生较早的语言,是一种半面向对象的语言[2],因而存在一些“人为的缺陷”。

个人认为“为了达到使用某种功能的目的,创造了一些关键词、概念、表示方法、理论等”,这种特异性使得学习、使用C++变得困难、容易产生混淆。

譬如:Const修饰一个常指针,使用1个或2个Const的差别(Const的位置不同);使用构造函数来定义对象,在定义对象的格式上存在巨大差异(使用默认构造函数定义对象不能带括号,使用全是缺省值的构造函数定义对象不能带括号,使用其它构造函数定义对象必须带括号);静态数据成员必须在类外初始化;常数据成员只能通过构造函数的初始化列表进行初始化;常对象和常函数的访问限制;拷贝构造函数的功能、调用时机及缺陷性(含有指针型的成员变量时);在多重继承时,为了保留祖先特征的一个副本,避免二义性,提出了虚基类的概念;虚函数与纯虚函数在函数首部上的细小差别;运算符重载;友元等。这些死板的规则大大增加了学习的难度,并且离开了C++,不能照搬到其他语言之上。

面向对象的主要特征包括抽象、封装、继承、多态。虽然不同的面向对象语言在这几个特征上理论是相同的,但是在实现上存在差异。

譬如:C++是一种半面向对象的程序设计语言,但Java是一种完全面向对象的语言;C++中有friend关键词,标示了友元函数或友元类,Java中没有这个关键词,也不会允许外部的函数访问另一个类的私有成员;C++中存在命名空间的概念、Java中存在包的概念,二者之间具有一定的相似性,但在实现继承时,继承的权限上有很大的不同;C++允许类的多继承,Java不存在类的多继承;都具有多态性,但在多态性的体现上存在着差距;内存管理上存在差异……。

正因为不同的程序设计语言存在差异,我们在教学时,求同存异,着重抓住共性,坚持“理论够用,重在实践”的原则,对于C++的特异性不渲染,不深究。

3) 编程风格存在差别

教师在编写函数时,各自的风格不同。譬如:在定义成员函数的首部时,函数的参数可以是普通的值类型、可以是指针类型、可以是引用型、可以是const型,不同的教师或者著书者可能钟情于某种表达方式、或者这几种方式的结合体。定义方式不同导致功能不同,而学生不能立即领会其中的差异,给学习、理解增加了难度。因此,在组织教学时,尽可能使用相对固定的、简洁的参数形式。

4)教学内容的取舍

各校的层次不同、选用的教材不同、教学目标不同、教学内容当然可以不同。

根据我校实际,对“C++实现面向对象特征”这部分的教学内容进行了取舍,其中,粗体部分的知识点为重点内容,斜体部分为略讲内容。如图2所示。

对该课程的教学内容进行适当的取舍,对知识点的讲授注意与其它语言的异同性,紧紧把握“重在共性、去粗取精”的原则。

2.2重视算法

绝大多数程序设计语言,在语法上大同小异,在算法上总是高度一致的。

虽然C++语言在类的抽象、封装上是面向对象的,但是在成员函数的实现上仍然是面向过程的。因此,可以将数据结构中的部分算法搬到C++来实现、练习,特别是线性结构的知识。譬如:集合的并交差运算、多项式的表示、2个多项式相加等。既用C语言实现,又用C++来实现,这样做,既让学生感受到了面向过程与面向对象的差别,也让学生领会到了算法的一致性。领悟到语言只是工具,算法才是灵魂。

2.3 教学方法

任何一种教学方法都不是孤立的,总是与其他教学方法配合使用、取长补短,力求发挥最大的效力、达到最好的教学效果[3]。

1)案例式教学

正由于C++所特有的性质和使用限制,教学中单纯的理论说教只能是让学生枯燥乏味、昏昏入睡,只有通过活生生的实例才能引人入胜,寓教于乐、“寓理于例”之中,因为它既有强烈的示范作用也给了学生思考的空间和时间[4]。通过“理论——案例——演示——总结”的方式来组织教学,起到“照葫芦画瓢、照猫画虎”的效果,真正做到了有理、有例、有结,也符合知识的“记忆、模仿、应用”的认知规律。

2) 框架式教学

类的定义具有相对固定的框架,体现在两个方面:

一是成员变量的声明在前、且是私有的,成员函数的声明在后、且是公共的;

二是成员函数的种类和格式是固定的。成员函数包括构造函数、拷贝构造函数、析构函数、输出函数、其它处理函数。在定义这些函数时,遵循一定的次序和原则,譬如:所有的类都必须显式地拥有缺省参数的构造函数、拷贝构造函数、数据成员的get、set函数、输出数据成员值的函数等。一个类遵循这样的框架来组织和定义,在创建对象、使用成员时可以避免一些错误,而且是一种良好的编程习惯。

3) 渐进式教学

知识点之间是相互联系的,讲授时遵循由易到难的次序讲授。如讲述构造函数时,从系统提供的默认构造函数到自定义默认构造函数,到带参数的构造函数,到带默认值的构造函数,到构造函数的重载、歧义,到带子对象的构造函数;从函数模板到类模板;从单继承到多继承,从多继承到虚基类的引出等,存在明显的渐进关系。

以虚基类的引出为例。在三层结构的继承中,存在多重继承,(图3重复继承)出现了孙类中存在祖先的2个副本,如何访问呢?只能通过作用域来区分(对象名.类名::成员名),但这种访问格式上总显得特别别扭、不伦不类,怎么实现只保留一份副本呢?因此,引入了虚基类的概念。这种“提出问题、解决问题”的方式也是一种渐进的思想。

图3 重复继承

2.4考核方式

改变单一的考核方式为多样的考核方式[5][6]。譬如:取消统一的卷面考试,取而代之的是课程设计,按照软件工程的流程完成一个小型项目,且以答辩验收的方式来评价学习效果,考核学生的综合应用能力;取消集中统一的考核,取而代之的是以题库为基础的机考,随到随考,直到通过为止。

3 学习方法

对于程序设计语言的学习,始终把握“三动”的方法,即动眼、动脑、动手(阅读、思考、上机实践)。

C++程序的代码一般都较长,阅读时先从主函数开始,看看定义了哪些对象,使用了哪些函数,再有目的地去阅读相应的函数代码。这样才能目标明确、抓住重点、理清思路、理解题意。

在课外,看着教材的目录,回忆课堂上讲述的知识点、例子,是否能清晰的再现。否则,赶紧翻开书阅读、理解、思考。

“三动”学习法中最重要的就是“动手”。上机实践是检验学习效果最准确的方式。这一点是不言而喻的。

4 结束语

总的来说,《C++面向对象程序设计》课程的教学应该首先培养学习兴趣、调动学习的主动性;其次是培养计算思维的思想,增强学生的动手能力;最后是教学内容、教学方法和手段的改革。这些教学改革措施是笔者经过反复的实践教学总结得出的,并已经在程序设计类课程教学中运用,取得了良好的教学效果。同时,教学改革和研究必须与时俱进,需要广大师生不断探索、丰富和实践。 参考文献:

[1] 游洪跃.C++面向对象程序设计教程[M].北京:清华大学出版社,2012.

[2] 黄平牧,肖波.面向对象方法和C++程序设计[M].北京:北京邮电大学出版社,2010.

[3] 郭艳燕,任满杰,贺利坚,张树粹.C++程序设计课程中多种教学方法的配合使用[J].计算机教育,2012(8):78-80.

[4] 胡枫.《C语言程序设计》的案例式教学的设计[J].青海师范大学学报(自然科学版),2010(4):49-50.

[5] 季耀君.面向对象程序设计与C++教学对策研究[J].西南农业大学学报(社会科学版),2013(8):168-169.

[6] 孙庚.项目教学法在“C++程序设计”课程教学中的实践[J].计算机教育,2008(2):52-53.

面向对象的主要特征包括抽象、封装、继承、多态。虽然不同的面向对象语言在这几个特征上理论是相同的,但是在实现上存在差异。

譬如:C++是一种半面向对象的程序设计语言,但Java是一种完全面向对象的语言;C++中有friend关键词,标示了友元函数或友元类,Java中没有这个关键词,也不会允许外部的函数访问另一个类的私有成员;C++中存在命名空间的概念、Java中存在包的概念,二者之间具有一定的相似性,但在实现继承时,继承的权限上有很大的不同;C++允许类的多继承,Java不存在类的多继承;都具有多态性,但在多态性的体现上存在着差距;内存管理上存在差异……。

正因为不同的程序设计语言存在差异,我们在教学时,求同存异,着重抓住共性,坚持“理论够用,重在实践”的原则,对于C++的特异性不渲染,不深究。

3) 编程风格存在差别

教师在编写函数时,各自的风格不同。譬如:在定义成员函数的首部时,函数的参数可以是普通的值类型、可以是指针类型、可以是引用型、可以是const型,不同的教师或者著书者可能钟情于某种表达方式、或者这几种方式的结合体。定义方式不同导致功能不同,而学生不能立即领会其中的差异,给学习、理解增加了难度。因此,在组织教学时,尽可能使用相对固定的、简洁的参数形式。

4)教学内容的取舍

各校的层次不同、选用的教材不同、教学目标不同、教学内容当然可以不同。

根据我校实际,对“C++实现面向对象特征”这部分的教学内容进行了取舍,其中,粗体部分的知识点为重点内容,斜体部分为略讲内容。如图2所示。

对该课程的教学内容进行适当的取舍,对知识点的讲授注意与其它语言的异同性,紧紧把握“重在共性、去粗取精”的原则。

2.2重视算法

绝大多数程序设计语言,在语法上大同小异,在算法上总是高度一致的。

虽然C++语言在类的抽象、封装上是面向对象的,但是在成员函数的实现上仍然是面向过程的。因此,可以将数据结构中的部分算法搬到C++来实现、练习,特别是线性结构的知识。譬如:集合的并交差运算、多项式的表示、2个多项式相加等。既用C语言实现,又用C++来实现,这样做,既让学生感受到了面向过程与面向对象的差别,也让学生领会到了算法的一致性。领悟到语言只是工具,算法才是灵魂。

2.3 教学方法

任何一种教学方法都不是孤立的,总是与其他教学方法配合使用、取长补短,力求发挥最大的效力、达到最好的教学效果[3]。

1)案例式教学

正由于C++所特有的性质和使用限制,教学中单纯的理论说教只能是让学生枯燥乏味、昏昏入睡,只有通过活生生的实例才能引人入胜,寓教于乐、“寓理于例”之中,因为它既有强烈的示范作用也给了学生思考的空间和时间[4]。通过“理论——案例——演示——总结”的方式来组织教学,起到“照葫芦画瓢、照猫画虎”的效果,真正做到了有理、有例、有结,也符合知识的“记忆、模仿、应用”的认知规律。

2) 框架式教学

类的定义具有相对固定的框架,体现在两个方面:

一是成员变量的声明在前、且是私有的,成员函数的声明在后、且是公共的;

二是成员函数的种类和格式是固定的。成员函数包括构造函数、拷贝构造函数、析构函数、输出函数、其它处理函数。在定义这些函数时,遵循一定的次序和原则,譬如:所有的类都必须显式地拥有缺省参数的构造函数、拷贝构造函数、数据成员的get、set函数、输出数据成员值的函数等。一个类遵循这样的框架来组织和定义,在创建对象、使用成员时可以避免一些错误,而且是一种良好的编程习惯。

3) 渐进式教学

知识点之间是相互联系的,讲授时遵循由易到难的次序讲授。如讲述构造函数时,从系统提供的默认构造函数到自定义默认构造函数,到带参数的构造函数,到带默认值的构造函数,到构造函数的重载、歧义,到带子对象的构造函数;从函数模板到类模板;从单继承到多继承,从多继承到虚基类的引出等,存在明显的渐进关系。

以虚基类的引出为例。在三层结构的继承中,存在多重继承,(图3重复继承)出现了孙类中存在祖先的2个副本,如何访问呢?只能通过作用域来区分(对象名.类名::成员名),但这种访问格式上总显得特别别扭、不伦不类,怎么实现只保留一份副本呢?因此,引入了虚基类的概念。这种“提出问题、解决问题”的方式也是一种渐进的思想。

图3 重复继承

2.4考核方式

改变单一的考核方式为多样的考核方式[5][6]。譬如:取消统一的卷面考试,取而代之的是课程设计,按照软件工程的流程完成一个小型项目,且以答辩验收的方式来评价学习效果,考核学生的综合应用能力;取消集中统一的考核,取而代之的是以题库为基础的机考,随到随考,直到通过为止。

3 学习方法

对于程序设计语言的学习,始终把握“三动”的方法,即动眼、动脑、动手(阅读、思考、上机实践)。

C++程序的代码一般都较长,阅读时先从主函数开始,看看定义了哪些对象,使用了哪些函数,再有目的地去阅读相应的函数代码。这样才能目标明确、抓住重点、理清思路、理解题意。

在课外,看着教材的目录,回忆课堂上讲述的知识点、例子,是否能清晰的再现。否则,赶紧翻开书阅读、理解、思考。

“三动”学习法中最重要的就是“动手”。上机实践是检验学习效果最准确的方式。这一点是不言而喻的。

4 结束语

总的来说,《C++面向对象程序设计》课程的教学应该首先培养学习兴趣、调动学习的主动性;其次是培养计算思维的思想,增强学生的动手能力;最后是教学内容、教学方法和手段的改革。这些教学改革措施是笔者经过反复的实践教学总结得出的,并已经在程序设计类课程教学中运用,取得了良好的教学效果。同时,教学改革和研究必须与时俱进,需要广大师生不断探索、丰富和实践。 参考文献:

[1] 游洪跃.C++面向对象程序设计教程[M].北京:清华大学出版社,2012.

[2] 黄平牧,肖波.面向对象方法和C++程序设计[M].北京:北京邮电大学出版社,2010.

[3] 郭艳燕,任满杰,贺利坚,张树粹.C++程序设计课程中多种教学方法的配合使用[J].计算机教育,2012(8):78-80.

[4] 胡枫.《C语言程序设计》的案例式教学的设计[J].青海师范大学学报(自然科学版),2010(4):49-50.

[5] 季耀君.面向对象程序设计与C++教学对策研究[J].西南农业大学学报(社会科学版),2013(8):168-169.

[6] 孙庚.项目教学法在“C++程序设计”课程教学中的实践[J].计算机教育,2008(2):52-53.

面向对象的主要特征包括抽象、封装、继承、多态。虽然不同的面向对象语言在这几个特征上理论是相同的,但是在实现上存在差异。

譬如:C++是一种半面向对象的程序设计语言,但Java是一种完全面向对象的语言;C++中有friend关键词,标示了友元函数或友元类,Java中没有这个关键词,也不会允许外部的函数访问另一个类的私有成员;C++中存在命名空间的概念、Java中存在包的概念,二者之间具有一定的相似性,但在实现继承时,继承的权限上有很大的不同;C++允许类的多继承,Java不存在类的多继承;都具有多态性,但在多态性的体现上存在着差距;内存管理上存在差异……。

正因为不同的程序设计语言存在差异,我们在教学时,求同存异,着重抓住共性,坚持“理论够用,重在实践”的原则,对于C++的特异性不渲染,不深究。

3) 编程风格存在差别

教师在编写函数时,各自的风格不同。譬如:在定义成员函数的首部时,函数的参数可以是普通的值类型、可以是指针类型、可以是引用型、可以是const型,不同的教师或者著书者可能钟情于某种表达方式、或者这几种方式的结合体。定义方式不同导致功能不同,而学生不能立即领会其中的差异,给学习、理解增加了难度。因此,在组织教学时,尽可能使用相对固定的、简洁的参数形式。

4)教学内容的取舍

各校的层次不同、选用的教材不同、教学目标不同、教学内容当然可以不同。

根据我校实际,对“C++实现面向对象特征”这部分的教学内容进行了取舍,其中,粗体部分的知识点为重点内容,斜体部分为略讲内容。如图2所示。

对该课程的教学内容进行适当的取舍,对知识点的讲授注意与其它语言的异同性,紧紧把握“重在共性、去粗取精”的原则。

2.2重视算法

绝大多数程序设计语言,在语法上大同小异,在算法上总是高度一致的。

虽然C++语言在类的抽象、封装上是面向对象的,但是在成员函数的实现上仍然是面向过程的。因此,可以将数据结构中的部分算法搬到C++来实现、练习,特别是线性结构的知识。譬如:集合的并交差运算、多项式的表示、2个多项式相加等。既用C语言实现,又用C++来实现,这样做,既让学生感受到了面向过程与面向对象的差别,也让学生领会到了算法的一致性。领悟到语言只是工具,算法才是灵魂。

2.3 教学方法

任何一种教学方法都不是孤立的,总是与其他教学方法配合使用、取长补短,力求发挥最大的效力、达到最好的教学效果[3]。

1)案例式教学

正由于C++所特有的性质和使用限制,教学中单纯的理论说教只能是让学生枯燥乏味、昏昏入睡,只有通过活生生的实例才能引人入胜,寓教于乐、“寓理于例”之中,因为它既有强烈的示范作用也给了学生思考的空间和时间[4]。通过“理论——案例——演示——总结”的方式来组织教学,起到“照葫芦画瓢、照猫画虎”的效果,真正做到了有理、有例、有结,也符合知识的“记忆、模仿、应用”的认知规律。

2) 框架式教学

类的定义具有相对固定的框架,体现在两个方面:

一是成员变量的声明在前、且是私有的,成员函数的声明在后、且是公共的;

二是成员函数的种类和格式是固定的。成员函数包括构造函数、拷贝构造函数、析构函数、输出函数、其它处理函数。在定义这些函数时,遵循一定的次序和原则,譬如:所有的类都必须显式地拥有缺省参数的构造函数、拷贝构造函数、数据成员的get、set函数、输出数据成员值的函数等。一个类遵循这样的框架来组织和定义,在创建对象、使用成员时可以避免一些错误,而且是一种良好的编程习惯。

3) 渐进式教学

知识点之间是相互联系的,讲授时遵循由易到难的次序讲授。如讲述构造函数时,从系统提供的默认构造函数到自定义默认构造函数,到带参数的构造函数,到带默认值的构造函数,到构造函数的重载、歧义,到带子对象的构造函数;从函数模板到类模板;从单继承到多继承,从多继承到虚基类的引出等,存在明显的渐进关系。

以虚基类的引出为例。在三层结构的继承中,存在多重继承,(图3重复继承)出现了孙类中存在祖先的2个副本,如何访问呢?只能通过作用域来区分(对象名.类名::成员名),但这种访问格式上总显得特别别扭、不伦不类,怎么实现只保留一份副本呢?因此,引入了虚基类的概念。这种“提出问题、解决问题”的方式也是一种渐进的思想。

图3 重复继承

2.4考核方式

改变单一的考核方式为多样的考核方式[5][6]。譬如:取消统一的卷面考试,取而代之的是课程设计,按照软件工程的流程完成一个小型项目,且以答辩验收的方式来评价学习效果,考核学生的综合应用能力;取消集中统一的考核,取而代之的是以题库为基础的机考,随到随考,直到通过为止。

3 学习方法

对于程序设计语言的学习,始终把握“三动”的方法,即动眼、动脑、动手(阅读、思考、上机实践)。

C++程序的代码一般都较长,阅读时先从主函数开始,看看定义了哪些对象,使用了哪些函数,再有目的地去阅读相应的函数代码。这样才能目标明确、抓住重点、理清思路、理解题意。

在课外,看着教材的目录,回忆课堂上讲述的知识点、例子,是否能清晰的再现。否则,赶紧翻开书阅读、理解、思考。

“三动”学习法中最重要的就是“动手”。上机实践是检验学习效果最准确的方式。这一点是不言而喻的。

4 结束语

总的来说,《C++面向对象程序设计》课程的教学应该首先培养学习兴趣、调动学习的主动性;其次是培养计算思维的思想,增强学生的动手能力;最后是教学内容、教学方法和手段的改革。这些教学改革措施是笔者经过反复的实践教学总结得出的,并已经在程序设计类课程教学中运用,取得了良好的教学效果。同时,教学改革和研究必须与时俱进,需要广大师生不断探索、丰富和实践。 参考文献:

[1] 游洪跃.C++面向对象程序设计教程[M].北京:清华大学出版社,2012.

[2] 黄平牧,肖波.面向对象方法和C++程序设计[M].北京:北京邮电大学出版社,2010.

[3] 郭艳燕,任满杰,贺利坚,张树粹.C++程序设计课程中多种教学方法的配合使用[J].计算机教育,2012(8):78-80.

[4] 胡枫.《C语言程序设计》的案例式教学的设计[J].青海师范大学学报(自然科学版),2010(4):49-50.

[5] 季耀君.面向对象程序设计与C++教学对策研究[J].西南农业大学学报(社会科学版),2013(8):168-169.

[6] 孙庚.项目教学法在“C++程序设计”课程教学中的实践[J].计算机教育,2008(2):52-53.

猜你喜欢
面向对象程序设计教学改革
基于Visual Studio Code的C语言程序设计实践教学探索
从细节入手,谈PLC程序设计技巧
面向对象的计算机网络设计软件系统的开发
面向对象的数据交换协议研究与应用
高职高专院校C语言程序设计教学改革探索
面向对象Web开发编程语言的的评估方法
PLC梯形图程序设计技巧及应用
面向对象信息提取中影像分割参数的选择