C 面向对象程序设计.ppt
《C 面向对象程序设计.ppt》由会员分享,可在线阅读,更多相关《C 面向对象程序设计.ppt(26页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、C+面向对象程序设计第十章 运算符重载与类模板1C+面向对象程序设计蚌埠学院计算机系学习目标理解为什么要进行运算符重载,在什么情况下要进行运算理解为什么要进行运算符重载,在什么情况下要进行运算符重载符重载掌握通过成员函数重载运算符,借助友元函数实现运算符掌握通过成员函数重载运算符,借助友元函数实现运算符重载重载理解引用在运算符重载中的作用,引用作为参数和返回值理解引用在运算符重载中的作用,引用作为参数和返回值的好处和用法的好处和用法理解类型转换的必要性,能够在程序设计中正确应用类型理解类型转换的必要性,能够在程序设计中正确应用类型转换转换理解为什么要引入类模板的概念,掌握类模板的应用理解为什么
2、要引入类模板的概念,掌握类模板的应用2C+面向对象程序设计蚌埠学院计算机系10.1 为什么要进行运算符重载10.1.1 10.1.1 10.1.1 10.1.1 运算符重载的例子运算符重载的例子运算符重载的例子运算符重载的例子在程序中,经常会使用运算符,但在程序中,经常会使用运算符,但在程序中,经常会使用运算符,但在程序中,经常会使用运算符,但C+C+C+C+中已经定义的中已经定义的中已经定义的中已经定义的运算符都是针对基本数据类型的,那么能否将它们用于复运算符都是针对基本数据类型的,那么能否将它们用于复运算符都是针对基本数据类型的,那么能否将它们用于复运算符都是针对基本数据类型的,那么能否将
3、它们用于复杂的类对象呢?在学习本章之前,我们往往是编写实现相杂的类对象呢?在学习本章之前,我们往往是编写实现相杂的类对象呢?在学习本章之前,我们往往是编写实现相杂的类对象呢?在学习本章之前,我们往往是编写实现相应运算功能的函数来解决复杂类型的运算问题。首先来看应运算功能的函数来解决复杂类型的运算问题。首先来看应运算功能的函数来解决复杂类型的运算问题。首先来看应运算功能的函数来解决复杂类型的运算问题。首先来看一个复数加法运算的例子,请注意程序中,加法运算时表一个复数加法运算的例子,请注意程序中,加法运算时表一个复数加法运算的例子,请注意程序中,加法运算时表一个复数加法运算的例子,请注意程序中,加
4、法运算时表达式的书写形式。达式的书写形式。达式的书写形式。达式的书写形式。【例例例例6-16-16-16-1】复数的加运算。见教材复数的加运算。见教材复数的加运算。见教材复数的加运算。见教材P133P133P133P1333C+面向对象程序设计蚌埠学院计算机系程序说明:程序说明:程序说明:程序说明:在在在在【例例例例10-110-110-110-1】为了解决复数的存储问题,在复数类为了解决复数的存储问题,在复数类为了解决复数的存储问题,在复数类为了解决复数的存储问题,在复数类ComplexComplexComplexComplex中,定义了两个私有成员变量:中,定义了两个私有成员变量:中,定义
5、了两个私有成员变量:中,定义了两个私有成员变量:realrealrealreal(复数的实(复数的实(复数的实(复数的实部)和部)和部)和部)和imagimagimagimag(复数的虚部);并定义了公有的复数加法函(复数的虚部);并定义了公有的复数加法函(复数的虚部);并定义了公有的复数加法函(复数的虚部);并定义了公有的复数加法函数数数数add()add()add()add()和友元输出函数和友元输出函数和友元输出函数和友元输出函数print()print()print()print()显示复数。在显示复数。在显示复数。在显示复数。在mainmainmainmain函数中函数中函数中函数中
6、定义了三个复数对象,使用加法函数定义了三个复数对象,使用加法函数定义了三个复数对象,使用加法函数定义了三个复数对象,使用加法函数addaddaddadd进行进行进行进行3 3 3 3个复数的相个复数的相个复数的相个复数的相加,并输出结果。加,并输出结果。加,并输出结果。加,并输出结果。在程序中三个复数相加的表达式为:在程序中三个复数相加的表达式为:在程序中三个复数相加的表达式为:在程序中三个复数相加的表达式为:c4=c1.add(c2).add(c3);c4=c1.add(c2).add(c3);c4=c1.add(c2).add(c3);c4=c1.add(c2).add(c3);用这种方式
7、书写表达式,不仅形式复杂、不符合人们用这种方式书写表达式,不仅形式复杂、不符合人们用这种方式书写表达式,不仅形式复杂、不符合人们用这种方式书写表达式,不仅形式复杂、不符合人们的日常书写习惯,而且不易理解;复数的运算越复杂,书的日常书写习惯,而且不易理解;复数的运算越复杂,书的日常书写习惯,而且不易理解;复数的运算越复杂,书的日常书写习惯,而且不易理解;复数的运算越复杂,书写的表达式越困难,给使用自定义类编写程序带来诸多不写的表达式越困难,给使用自定义类编写程序带来诸多不写的表达式越困难,给使用自定义类编写程序带来诸多不写的表达式越困难,给使用自定义类编写程序带来诸多不便。如果能够像使用基本类型
8、那样用运算符来书写复数运便。如果能够像使用基本类型那样用运算符来书写复数运便。如果能够像使用基本类型那样用运算符来书写复数运便。如果能够像使用基本类型那样用运算符来书写复数运算表达式(如算表达式(如算表达式(如算表达式(如c4=c1+c2+c3;c4=c1+c2+c3;c4=c1+c2+c3;c4=c1+c2+c3;),不仅书写简单,也更容),不仅书写简单,也更容),不仅书写简单,也更容),不仅书写简单,也更容易理解;这正是在易理解;这正是在易理解;这正是在易理解;这正是在C+C+C+C+中引入了运算符重载的意义所在。中引入了运算符重载的意义所在。中引入了运算符重载的意义所在。中引入了运算符重
9、载的意义所在。下面通过使用运算符重载进行复数加运算例子来了解如何下面通过使用运算符重载进行复数加运算例子来了解如何下面通过使用运算符重载进行复数加运算例子来了解如何下面通过使用运算符重载进行复数加运算例子来了解如何进行运算符的重载。进行运算符的重载。进行运算符的重载。进行运算符的重载。4C+面向对象程序设计蚌埠学院计算机系【例例10-210-2】使用运算符重载进行复数加运算使用运算符重载进行复数加运算见教材见教材见教材见教材P134P134P134P134输出结果:输出结果:输出结果:输出结果:11+2i11+2i11+2i11+2i程序说明:程序说明:程序说明:程序说明:该程序的作用和该程序
10、的作用和该程序的作用和该程序的作用和【例例例例10-110-110-110-1】相同,只是用运算符重载函数相同,只是用运算符重载函数相同,只是用运算符重载函数相同,只是用运算符重载函数代替了加法函数。代替了加法函数。代替了加法函数。代替了加法函数。比较两个程序不难发现,比较两个程序不难发现,比较两个程序不难发现,比较两个程序不难发现,【例例例例10-210-210-210-2】中书写的复数相加表中书写的复数相加表中书写的复数相加表中书写的复数相加表达式,含义清晰,便于书写。让复数类的使用变得更加简易。达式,含义清晰,便于书写。让复数类的使用变得更加简易。达式,含义清晰,便于书写。让复数类的使用
11、变得更加简易。达式,含义清晰,便于书写。让复数类的使用变得更加简易。程序中程序中程序中程序中“+”运算符重载的定义如下:运算符重载的定义如下:运算符重载的定义如下:运算符重载的定义如下:Complex operator+(Complex&c);Complex operator+(Complex&c);Complex operator+(Complex&c);Complex operator+(Complex&c);它与一般函数的定义非常相似,不同的是运算符重载函数它与一般函数的定义非常相似,不同的是运算符重载函数它与一般函数的定义非常相似,不同的是运算符重载函数它与一般函数的定义非常相似,不同
12、的是运算符重载函数的名字(的名字(的名字(的名字(“operator+operator+operator+operator+”)是由)是由)是由)是由“operatoroperatoroperatoroperator”关键字和紧随其关键字和紧随其关键字和紧随其关键字和紧随其后的运算符后的运算符后的运算符后的运算符“+”组成;关键字组成;关键字组成;关键字组成;关键字“operatoroperatoroperatoroperator”表明该函数是一个表明该函数是一个表明该函数是一个表明该函数是一个运算符重载函数。在运算符重载函数。在运算符重载函数。在运算符重载函数。在【例例例例10-210-21
13、0-210-2】中,该函数是作为类中,该函数是作为类中,该函数是作为类中,该函数是作为类ComplexComplexComplexComplex的的的的成员函数,因此把以这种方式的运算符重载称作重载为类运算成员函数,因此把以这种方式的运算符重载称作重载为类运算成员函数,因此把以这种方式的运算符重载称作重载为类运算成员函数,因此把以这种方式的运算符重载称作重载为类运算符。符。符。符。5C+面向对象程序设计蚌埠学院计算机系【例例10-310-3】重载为友元运算符进行复数加运算重载为友元运算符进行复数加运算见教材见教材见教材见教材P136P136P136P136输出结果:输出结果:输出结果:输出结果
14、:11+2i11+2i11+2i11+2i程序说明:程序说明:程序说明:程序说明:本例实现的功能与本例实现的功能与本例实现的功能与本例实现的功能与【例例例例10-110-110-110-1】和和和和【例例例例10-210-210-210-2】完全相同。完全相同。完全相同。完全相同。本例中,本例中,本例中,本例中,“+”运算符重载函数的定义如下:运算符重载函数的定义如下:运算符重载函数的定义如下:运算符重载函数的定义如下:Complex operator+(Complex&c1,Complex&c2);Complex operator+(Complex&c1,Complex&c2);Comple
15、x operator+(Complex&c1,Complex&c2);Complex operator+(Complex&c1,Complex&c2);由于该函数是一般的普通函数,不是类的成员函数,只是由于该函数是一般的普通函数,不是类的成员函数,只是由于该函数是一般的普通函数,不是类的成员函数,只是由于该函数是一般的普通函数,不是类的成员函数,只是为能够访问类的私有数据成员,而把其声明为类的友元函为能够访问类的私有数据成员,而把其声明为类的友元函为能够访问类的私有数据成员,而把其声明为类的友元函为能够访问类的私有数据成员,而把其声明为类的友元函数,因此在定义时参数表中必须指定两个参数:第数,
16、因此在定义时参数表中必须指定两个参数:第数,因此在定义时参数表中必须指定两个参数:第数,因此在定义时参数表中必须指定两个参数:第1 1 1 1个参数个参数个参数个参数作为运算符的左操作数,第作为运算符的左操作数,第作为运算符的左操作数,第作为运算符的左操作数,第2 2 2 2参数作为运算符的右操作数。参数作为运算符的右操作数。参数作为运算符的右操作数。参数作为运算符的右操作数。6C+面向对象程序设计蚌埠学院计算机系10.1.2 10.1.2 注意事项注意事项n nC+C+C+C+对运算符重载作出了一定的限制和规定,在重载运算符时,需要对运算符重载作出了一定的限制和规定,在重载运算符时,需要对运
17、算符重载作出了一定的限制和规定,在重载运算符时,需要对运算符重载作出了一定的限制和规定,在重载运算符时,需要注意以下几点:注意以下几点:注意以下几点:注意以下几点:不是所有运算符都可以被重载。不是所有运算符都可以被重载。不是所有运算符都可以被重载。不是所有运算符都可以被重载。C+C+C+C+的大部分运算符都可以被重载。可以重载的运算符如下:的大部分运算符都可以被重载。可以重载的运算符如下:的大部分运算符都可以被重载。可以重载的运算符如下:的大部分运算符都可以被重载。可以重载的运算符如下:new new new new newnewnewnew delete delete delete dele
18、te deletedeletedeletedelete +-*/%&+-*/%&+-*/%&+-*/%&|=+=-=|=+=-=|=+=-=|=+=-=*-/=%=&=|=*-/=%=&=|=*-/=%=&=|=*-/=%=&=|=&|+-*-&|+-*-&|+-*-&|+-*-()()()()n n其中,运算符其中,运算符其中,运算符其中,运算符()()()()是函数调用运算符,是函数调用运算符,是函数调用运算符,是函数调用运算符,是下标运算符。是下标运算符。是下标运算符。是下标运算符。+、-、*和和和和&的一元、二元形式都可以被重载。自增运算符的一元、二元形式都可以被重载。自增运算符的一元
19、、二元形式都可以被重载。自增运算符的一元、二元形式都可以被重载。自增运算符 +和自减运算符和自减运算符和自减运算符和自减运算符 -的前置、后置形式都可以被重载。的前置、后置形式都可以被重载。的前置、后置形式都可以被重载。的前置、后置形式都可以被重载。n n以上可重载运算符中,除了赋值运算符以上可重载运算符中,除了赋值运算符以上可重载运算符中,除了赋值运算符以上可重载运算符中,除了赋值运算符=之外,基类中所有被重载之外,基类中所有被重载之外,基类中所有被重载之外,基类中所有被重载的运算符都将被派生类继承。的运算符都将被派生类继承。的运算符都将被派生类继承。的运算符都将被派生类继承。7C+面向对象
20、程序设计蚌埠学院计算机系n n不可以重载的运算符如下:不可以重载的运算符如下:不可以重载的运算符如下:不可以重载的运算符如下:.(.(.(.(成员运算符成员运算符成员运算符成员运算符).*().*().*().*(成员对象选择符成员对象选择符成员对象选择符成员对象选择符):():():():(解析运算解析运算解析运算解析运算符符符符)?:(条件运算符)(条件运算符)(条件运算符)(条件运算符)n n重载不能改变运算符的优先级。重载不能改变运算符的优先级。重载不能改变运算符的优先级。重载不能改变运算符的优先级。假定已定义了复数类假定已定义了复数类假定已定义了复数类假定已定义了复数类Complex
21、,Complex,Complex,Complex,并且已定义了加法和乘法并且已定义了加法和乘法并且已定义了加法和乘法并且已定义了加法和乘法运算符重载函数,运算符重载函数,运算符重载函数,运算符重载函数,Complex c1(1,2),c2(3,4),c3(5,6),answer;Complex c1(1,2),c2(3,4),c3(5,6),answer;Complex c1(1,2),c2(3,4),c3(5,6),answer;Complex c1(1,2),c2(3,4),c3(5,6),answer;answer=c1+c2*c3;answer=c1+c2*c3;answer=c1+c
22、2*c3;answer=c1+c2*c3;在这个表达式中,乘法运算优先级高于加法运算,它等在这个表达式中,乘法运算优先级高于加法运算,它等在这个表达式中,乘法运算优先级高于加法运算,它等在这个表达式中,乘法运算优先级高于加法运算,它等效于效于效于效于answer=c1+(c2*c3);answer=c1+(c2*c3);answer=c1+(c2*c3);answer=c1+(c2*c3);如同系统定义数据类型一样如同系统定义数据类型一样如同系统定义数据类型一样如同系统定义数据类型一样,可以使用括号强制改变重载可以使用括号强制改变重载可以使用括号强制改变重载可以使用括号强制改变重载运算符的计算
23、顺序,例如:运算符的计算顺序,例如:运算符的计算顺序,例如:运算符的计算顺序,例如:answer=(c1+c2)*c3;answer=(c1+c2)*c3;answer=(c1+c2)*c3;answer=(c1+c2)*c3;n n重载不能改变运算符的结合律。重载不能改变运算符的结合律。重载不能改变运算符的结合律。重载不能改变运算符的结合律。8C+面向对象程序设计蚌埠学院计算机系重载不能改变运算符的操作数个数。重载不能改变运算符的操作数个数。重载不能改变运算符的操作数个数。重载不能改变运算符的操作数个数。重载的一元运算符仍然是一元运算符,重载的二元运算符仍然是重载的一元运算符仍然是一元运算符
24、,重载的二元运算符仍然是重载的一元运算符仍然是一元运算符,重载的二元运算符仍然是重载的一元运算符仍然是一元运算符,重载的二元运算符仍然是二元运算符。二元运算符。二元运算符。二元运算符。C+C+中唯一的三元运算符(?:)不能被重载。中唯一的三元运算符(?:)不能被重载。中唯一的三元运算符(?:)不能被重载。中唯一的三元运算符(?:)不能被重载。运算符运算符运算符运算符 +、-、*、&和和和和 既可以用作一元运算符和二元运算符,既可以用作一元运算符和二元运算符,既可以用作一元运算符和二元运算符,既可以用作一元运算符和二元运算符,对这几个运算符,要分别把他们重载为一元运算符和二元运算对这几个运算符,
25、要分别把他们重载为一元运算符和二元运算对这几个运算符,要分别把他们重载为一元运算符和二元运算对这几个运算符,要分别把他们重载为一元运算符和二元运算符。符。符。符。不能创建新的运算符,只有现用的运算符才能被重载。不能创建新的运算符,只有现用的运算符才能被重载。不能创建新的运算符,只有现用的运算符才能被重载。不能创建新的运算符,只有现用的运算符才能被重载。运算符重载函数的参数至少有一个必须是类的对象或者是类的运算符重载函数的参数至少有一个必须是类的对象或者是类的运算符重载函数的参数至少有一个必须是类的对象或者是类的运算符重载函数的参数至少有一个必须是类的对象或者是类的对象的引用。对象的引用。对象的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向对象程序设计 面向 对象 程序设计
限制150内