面向对象的C++语言关键概念教学探索与实践

2013-04-27 03:23李良福
关键词:指针指向成员

李良福

[摘要]C++语言是一门面向对象的高级语言,与C语言相比出现了很多新的概念,正确理解与应用这些新的概念是学好C++语言的关键。本文对引用与指针的概念以及使用方法的区别进行了详细的描述,还对普通指针、指向常量的指针和常指针三种指针所指向的内容和指针本身能否改变进行了对比,对基类中具有不同访问属性的成员经过不同方式继承之后在派生类中的访问权限也进行了比较,对不同重载方式下运算符重载函数参数的个数也进行了总结。通过对这些概念的理解和应用,可以提高大学生初学者和程序员的学习与编程能力。本文作者的教学实践表明,本文的关键概念教学实践起到了良好的教学效果。

[关键字]面向对象 C++语言 关键概念 教学探索

[中图分类号]G434 [文献标识码]A

一、引言

C++语言是在C语言基础上发展的一门面向对象的高级程序设计语言,全面兼容C语言[1]。C++语言采用面向对象的思想,将客观事物看作是具有属性和行为的对象,能够更为直接地描述客观世界中存在的对象以及它们之间的关系[2~3]。目前C++语言是大多数电子、信息、计算机等相关专业中非常重要的程序设计课程,也是这些大学生在学习后续专业课、进行毕业设计、以后上研究生或参加工作从事计算机软件开发的主要编程语言。本人在多年的教学探索与实践过程中发现,大学生对很多新概念的理解方面存在概念模糊、混淆不清的情况,这主要是C++语言有很多新的概念难以理解,仅凭大学生在初次学习时很难对这些概念实现准确理解和掌握,需要教师在授课前提前将这些概念进行备课总结,在上课时采用表格形式在多媒体课件中播放,这样能够极大提高学生对这些概念的领悟和理解能力[4]。本人根据多年的教学工作实践,总结出了多个大学生在学习时难以区分和理解的概念,例如引用与指针的概念的区别,普通指针、指向常量的指针和常指针三种指针的对比,以及公有、私有、保护三种继承方式的区别都进行了详细的比较,对不同重载方式下运算符重载函数参数的个数也进行了总结,为大学生的学习和教师的教学提供了有效参考。

二、引用与指针概念的区别

引用是面向对象的C++语言与C语言不同的一个重要概念,主要用于参数传递,引用的符号&与C语言的指针取地址运算符&、进行与操作的位运算符&相同,需要进行区分。当&符号出现在程序中,判断它究竟是引用、位运算符还是取地址运算符,可以首先看它是否为双目运算符,如果是双目运算符,则为位运算符,例如:

则上述程序中&为位运算符。

取地址运算符&和引用运算符&都是单目运算符。取地址运算符是位于一个已经存在的变量的前面。

则上述程序中就是把整型变量a的地址赋给指针变量p。

引用是标识符的别名。引用是C++中的概念,初学者容易把引用和指针混淆一起。例如,下面程序中,b是a的一个引用,a 是被引用物。

程序中的b相当于a的别名(或称绰号),对b的任何操作就是对a的操作。所以b既不是a的拷贝,也不是指向a的指针,其实b就是a自己。

在下面的示例程序中,c被初始化为a的引用。语句c =b并不能将c修改成为b的引用,只是把c的值改变成为10。由于c 是a的引用,所以a的值也变成了10。

上面的程序看起来有点像在玩文字游戏,没有体现出引用的真正价值。其实,引用的主要目的和功能是传递函数的返回值和参数。在C语言中,函数的返回值和参数的传递方式只有两种:值传递、指针传递;而在C++语言中,函数的返回值和参数的传递方式有三种:值传递、指针传递和引用传递。

下面两个例子分别描述了指针和引用参数传递的用法:

1.采用指针进行参数传递的例子

2.采用引用进行参数传递的例子

1.从现象上看,指针在运行过程中可以改变它所指向的值,而引用一旦和某个对象绑定之后就不会再进行改变;

2.从内存分配上看,程序会为指针变量分配一定的内存区域,而引用是和一个已经存在的对象绑定,不会再分配内存区域;

3.从编译上看,指针可以改变所指向的对象(指针变量中的值可以改变),而引用一旦绑定一个对象后就不会再进行改变。

实际上“引用”可以做的任何事情“指针”也都可以实现,那为什么还要用“引用”这个概念?这是由于指针能够毫无约束地操作内存中的任何地址,尽管指针功能十分强大,但是非常危险,很容易把一些重要数据破坏。而引用在使用时只是和一个已经存在的合法的存储单元关联,不会产生一个空的引用。

三、指向常量的指针与常指针的区别

很多大学生在学习普通指针、指向常量的指针和常指针概念时混淆不清。由于指针功能十分强大,对上述各种指针概念不清楚,就很容易出现内存操作隐患。如果我们希望指针所指向的内容不被随意改变,可以声明指向常量的指针,此时不能通过指针来改变所指对象的值,但指针本身可以改变,可以指向另外的对象。如果我们希望指针本身不被改变,则可以声明常指针,即指针类型的常量(声明为地址类型的常量,指针本身就是常量),则指针本身的值不能被随便改变。表2给出了普通指针、指向常量的指针和常指针在使用时指针本身和指针所指向的内容能否被改变的总结。

下面给出了四个例子,分别表示指向常量的指针和常指针所指向的内容以及指针本身能否被改变的情况。

1.指向常量的指针的例子,所指向的内容不能改变

2.指向常量的指针的例子,指针本身的值可以改变

3.常指针的例子,指针本身不可改变

4.常指针的例子,常指针所指向的内容能改变

四、私有、公有与保护成员的区别

很多学生在学习私有、公有与保护成员三个概念时混淆不清,在使用从基类中继承而来的成员时不清楚在派生类中是什么访问权限,从而导致程序编译或运行错误。基类的成员可以有public(公有类型)、protected(保护类型)、private(私有类型)三种访问属性。其实,结合自然语言中的继承概念,学生就很容易理解。公有类型外界能够看得见,能够被继承下去。保护类型外界看不见,但是也能够被继承下去。私有类型外界看不见,能够被继承下去,占用内存空间,但是在派生类中不可直接访问。保护类型的成员能够被继承下去,在派生类中可以直接访问,但是外界看不见。类的继承方式有public(公有继承)、protected(保护继承)、private(私有继承)三种。不同的继承方式,会导致原来具有不同访问属性的基类成员在派生类当中具有不同的访问属性。表3给出了基类不同访问属性的成员经过不同继承方式后在派生类中的访问权限。

从表3可以看出,基类的私有成员无论经过何种继承方式都不能在派生类当中直接访问,但是在派生类中占有内存空间。在派生类外部,通过派生类的对象只能够访问到以公有方式从基类继承过来的公有成员。

从表3中还可以看出,保护类型成员的访问权限介于公有和私有之间。从横向(外部访问)看,保护类型的成员和私有类型的成员一样,在外部通过派生类的对象不可直接访问保护类型的成员。从纵向(继承与派生关系)看,保护类型的成员和公有类型的成员一样,能够继续派生到下一级的派生类中去。因此,保护类型的成员既实现了数据共享(纵向看),又实现了数据隐藏(横向看),在数据的共享与保护之间找到了一个平衡点,有利于代码的复用与扩充。

五、运算符重载函数参数个数的确定

普通的运算符只能对基本类型的变量进行运算。C++提供了运算符重载的功能,能够为一个已有的运算符提供多重含义。重载后的运算符能够对自定义数据类型的变量进行运算。在C++语言中,运算符重载有两种形式,分别是重载为类的成员函数和类的非成员函数。

重载为类的成员函数时,参数个数等于原来操作数的个数减去1(后置++、后置--运算符除外)。如果某一个对象使用重载了的成员函数,对象自身的数据可以直接访问,因此就不再需要放在参数表中进行传递,少了的操作数就是该对象本身。

当重载为非成员函数(通常为友元函数)时,由于友元函数不属于任何一个类,利用友元函数对某一个对象的数据成员进行操作时,就必须利用该对象的名称来进行,因此所有使用到的参数都必须进行传递,参数个数等于原来操作数的个数(后置++、后置--运算符除外),而且至少应该有一个参数为自定义类型的形参。

在C++语言中,为了区别前置和后置的单目运算符自增自减运算,后置自增与自减单目运算符要在形参列表中增加一个int类型的参数来区分。综上所述,我们采用表4来总结一下不同重载方式下运算符重载函数参数个数的确定方法。

从表4中可以看出,双目运算符重载为类的成员函数时参数为1个,重载为友元函数时参数为2个。前置自增、自减运算符重载为类的成员函数时参数为0个,重载为友元函数时参数为1个;后置自增、自减运算符重载为类的成员函数时参数为1个,重载为友元函数时参数为2个。

六、结论

本文对面向对象的C++语言中几个难以理解的概念进行了详细描述与分析,使得大学生在学习C++语言中一些新的概念时能够得到很好的理解与应用。本文中引用与指针概念的区别,各种指针使用方法的比较、各种继承方式、运算符重载函数参数的个数的总结都采用表格的形式进行了对比,清晰明了,能够提高大学生对面向对象的关键概念的理解和掌握能力。

基金项目:本文研究得到了国家自然科学基金资助(项目编号:61201434)、中国博士后基金特别资助(项目编号:200902593)、教育部博士点基金资助(项目编号:20090202120002)。

[参考文献]

[1]郑莉.C++语言程序设计[M].北京:清华大学出版社,2010.

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

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

[4]范虹.论免费师范生信息技术能力的培养[J],中国电化教育,2011(5): 31-34.

(作者单位:陕西师范大学 计算机科学学院 陕西西安)

猜你喜欢
指针指向成员
三角函数的图像与性质的备考新指向
两只挂钟
中年级“生本写作”教学的“三个指向”
郊游
为什么表的指针都按照顺时针方向转动
我家的新成员
课题组成员
浅析C语言指针