“C++面向对象程序设计”教学方法探讨

2015-03-07 14:14杜青
电脑知识与技术 2015年34期
关键词:面向对象程序设计教学方法

杜青

摘要:“C++面向对象程序设计”课程涉及了很多的知识点,学生很难在短时间内掌握面向对象程序设计的核心思想。为此介绍了在该门课程教学中采用的教学方法,对课程中重要的知识点如类的概念、类的继承机制等内容,通过例题详细阐述;对于难点问题,如构造函数、运算符重载等,通过例题分步骤进行讲解,由浅入深,使学生尽快理解和掌握。这种教学方式在该门课程的教学中加以应用,取得了较好的效果。

关键词:C++;面向对象;程序设计;类;教学方法

中图分类号: TP311 文献标识码:A 文章编号:1009-3044(2015)34-0118-03

Abstract: There are lots of knowledge points included in the course, C++ Object-Oriented programming, which makes it hard for students to grasp the key ideas of it. This paper introduces the teaching methods in the course to elaborates the key points like classes and their inheritance mechanism, and explains the difficult points like constructors, operators, etc step by step by focusing on examples, which facilitates the comprehension of students. This teaching method has been successfully applied in the course, and a good result has been obtained.

Key words: C++; object-oriented; programming; classes; teaching methods

1 概述

“C++面向对象程序设计”是计算机专业学生一门重要的专业基础课,学生在掌握C++结构化程序设计的基础上,通过这门课程的学习,进一步掌握C++面向对象程序设计的基础知识。

由于“C++面向对象程序设计”涉及的知识点非常多,初学者很难在短时间内领会面向对象程序设计的核心思想,在面对实际问题时,难以用面向对象程序设计的方法构建出合理的程序框架。

因此在“C++面向对象程序设计”课程的教学中,需要抓住重点,理清难点。对类的概念、继承的机制等关键知识点着重阐述,使学生掌握面向对象程序的基本结构;针对难点问题,如构造函数与运算符重载等,结合具体实例,由浅入深进行分析,使学生掌握面向对象程序设计的基本方法。

2 建立类的概念

类的概念是面向对象程序设计的基础,体现了面向对象程序设计的两大特性,即抽象性与封装性。

在进行结构化程序设计时,根据题目要求,先设计函数,再在主函数中定义变量,存放原始数据,之后调用函数进行处理操作,最后输出结果。

在进行面向对象程序设计时,要先根据题目要求设计类,再在主函数中定义类对象,存放待处理数据,接着调用类的成员函数实现处理操作并输出结果。

因此类的设计是进行面向对象程序设计的关键步骤。在介绍类的设计时,先从一个简单的类——学生类入手,使学生对类的概念有一个初步的了解。在此基础上,再将一些C++结构化程序设计的经典例题,如求给定范围素数、一维数组应用、二维数组应用等,改用面向对象程序设计的方法去实现,使学生进一步了解类的设计过程,能够根据题目要求,确定类中的数据成员及成员函数,从而掌握类设计的基本方法。

在完成类设计的基础上,进一步掌握类的应用,即定义类对象和调用类的成员函数,从而掌握面对象程序设计的基本步骤。

3 理解类的继承机制

类的继承性是面向对象程序设计的重要特性。通过类的继承机制,实现了软件代码的重用。

在讲述单继承时,先通过简单的例题,例如学生类,介绍单继承的概念,继承的方式,派生类从基类继承成员的访问属性,以及在派生类中如何新增成员和改写基类已有的成员,派生类构造函数及析构函数的执行过程。

再通过较复杂的例题,例如图形类,进一步介绍如何根据题目要求,设计基类及派生类,如何确定基类及派生类的数据成员及成员函数,如何定义基类及派生类的构造函数等。

在讲述多重继承时,通过简单的例题,例如家具类,介绍多重继承的概念,继承的方式,派生类构造函数及析构函数的执行过程,多重继承的二义性问题以及二义性问题的解决方法——虚拟继承等。

由于给出具体实例,使学生对复杂的继承机制有了直观的了解,在解决实际问题时,能够根据要求,建立基类,并由基类派生子类,实现软件代码的复用。

4 难点问题的分析

C++面向对象程序设计的基础知识中有一些概念比较复杂,难以理解。可以通过一些简单的例题,分步骤说明概念的含义,提高学生对复杂概念的理解能力。

4.1 类对象的初始化

定义类对象时,会自动调用类的构造函数实现类对象的初始化。构造函数的概念中,复制构造函数、类继承中构造函数的执行过程,是构造函数概念的难点。

4.1.1复制构造函数

复制构造函数可以将一个已有对象的值赋给一个新对象。如不定义复制构造函数,系统提供默认的复制构造函数,而默认复制构造函数只能实现浅复制,如要实现深复制,就需要自定义复制构造函数。

在讲述复制构造函数时,先通过学生类例题,分析复制构造函数的特点,以及调用复制构造函数的各种情况,再修改类中的普通构造函数,在该函数中申请一定的内存资源。通过查看运行结果中的错误,分析出现错误的原因及解决的办法,之后修改已有的复制构造函数,增加代码,实现深复制,最终程序能够正常运行。通过一系列的分析,学生知道了在什么情况下需要实现深复制,以及实现深复制的方法,加深了对概念的理解和记忆。

学生类例题的主要代码如下。

class Student

{public:

Student(long nu=0,char na[]="noname"):num(nu)

{ name=new char[20]; strcpy(name,na); }

Student(const Student& s):num(s.num) //复制构造函数定义

{ name=new char[20]; strcpy(name,s.name);} //实现深复制

void show()

{ cout

long num;

char *name;

};

void func(Student st3) //按值传递参数时调用复制构造函数

{ st3.show();}

int main()

{ Student st1(1001,"Zhang"),st2(st1); //定义对象时调用复制构造函数

st2.show(); func(st2); return 0;}

4.1.2 类继承时构造函数的执行过程

定义派生类对象时,自动调用派生类的构造函数。由于存在单继承、多重继承、虚拟继承以及对象数据成员等多种情况,分析类继承时构造函数的执行过程,需要分以下5种情况,通过例题分别加以讨论。

⑴ 单继承时派生类构造函数的执行过程

在学生类例题中,使学生类派生出大学生类,再定义大学生类对象,通过查看运行结果,使学生看到基类构造函数及派生类构造函数的执行顺序,进而介绍当基类构造函数带有参数时,派生类构造函数如何向它传递实际参数。

⑵ 单继承时派生类中有对象数据成员时构造函数的执行过程

在大学生类中,增加对象数据成员,即教师类对象,通过该例题,使学生看到定义派生类对象时,基类构造函数、对象成员构造函数、派生类构造函数的执行顺序,进而介绍派生类构造函数如何向对象数据成员的构造函数传递实际参数。

⑶ 多重继承时派生类构造函数的执行过程

通过家具类例题,使学生看到定义派生类对象时,多个基类构造函数以及派生类构造函数的执行顺序。

⑷ 虚拟继承时派生类构造函数的执行过程

通过家具类例题,使学生看到定义派生类对象时,虚基类及直接基类构造函数、派生类构造函数的执行顺序,进而介绍派生类构造函数如何向虚基类构造函数传递实际参数。

⑸ 多重继承时既有虚拟继承也有非虚拟继承时派生类构造函数的执行过程

通过例题,使学生看到定义派生类对象时,虚基类、非虚基类构造函数以及派生类构造函数的执行顺序。

通过以上分步骤讲解,使学生对比较复杂的构造函数的执行过程有直观、清晰的认识。

4.2 类对象的运算

运算符重载是面向对象程序设计中比较重要的概念。通过重载运算符,可以使C++已有的运算符能够用于类对象的运算。

重载双目运算符时,由于存在对象与对象的运算、对象与基本类型数据的运算,以及基本类型数据与对象的运算3种情况,若要定义3个运算符重载函数实现这3种运算,则比较繁琐。对后2种情况,可以通过定义转换构造函数或重载类型转换运算符,将两种不同类型的操作数转换为同一类型数据再进行运算。

⑴ 将基本类型数据转换为对象

利用转换构造函数,可以将基本类型数据转换为类对象。介绍转换构造函数时,通过复数类例题,讲清楚在类中定义转换构造函数的方法,以及转换构造函数与运算符重载函数配合使用,实现基本类型数据与类对象运算的过程。主要代码如下。

class Complex

{public:

Complex(double r=0,double i=0):real(r),imag(i)

{ }

Complex(double r):real(r),imag(0){} //转换构造函数

void show()

{ cout<

{ }

Complex(double r):real(r),imag(0){}

operator double() //重载类型转换运算符

{ return real; }

void show()

{ cout

double real,imag;

};

int main()

{ Complex c1(3,5),c2(4.1,10);

double d=10+c2; cout<

猜你喜欢
面向对象程序设计教学方法
初中英语写作教学方法初探
基于Visual Studio Code的C语言程序设计实践教学探索
教学方法与知识类型的适宜
从细节入手,谈PLC程序设计技巧
面向对象的计算机网络设计软件系统的开发
面向对象的数据交换协议研究与应用
高职高专院校C语言程序设计教学改革探索
面向对象Web开发编程语言的的评估方法
PLC梯形图程序设计技巧及应用
初中数学教师不可忽视的几种教学方法