1、项目8 自制多功能计算器课件目录8.1 项目情景18.2 知识准备28.3 项目解决38.4 知识拓展48.1 项目情景 利用前面学习的方法做一个计算器,针对不同类型的运算我们要写很多相似的代码,维护和修改相当的麻烦而一个真正实用的计算器能够完成很多不同数据类型的运算。这些方法仅类型不同,其它的都是相同的,就像是榨果汁,放进去的是苹果就是榨苹果汁,放进去的柠檬就是榨柠檬汁。我们需要一个“榨汁机”。其实我们说的“榨汁机”就是C+中的模板。有了模板可以大大减少重复代码的编写。8.2 知识准备8.2.1 模板 回主目录回主目录8.2.1 模板 模板的概念:所谓模板是一种使用无类型参数来产生一系列函数
2、或类的机制,是C+的一个重要特性。它的实现,方便了更大规模的软件开发。若一个程序的功能是对某种特定的数据类型进行处理,则可以将所处理的数据类型说明为参数,以便在其他数据类型的情况下使用,这就是模板的由来。模板是以一种完全通用的方法来设计函数或类而不必预先说明将被使用的每个对象的类型。通过模板可以产生类或函数的集合,使它们操作不同的数据类型,从而避免需要为每一种数据类型产生一个单独的类或函数。8.2.1 模板 对不同数据类型的操作完全相同,用函数模板实现。函数模板的定义:template 函数返回类型 函数名(形参表)/函数定义体 说明:(1)template是一个声明模板的关键字。(2)表示声
3、明一个模板关键字class不能省略,它不表示类定义。(3)如果类型形参多于一个,每个形参前都要加class,可以包含基本数据类型可以包含类类型。8.2.1 模板 类类模板和函数模板类似,为类定义一个灵活多样的模模板和函数模板类似,为类定义一个灵活多样的模式,从而避免了编写大量的、因数据类型不同而不得不重式,从而避免了编写大量的、因数据类型不同而不得不重新编写的类新编写的类。定义一个类模板定义一个类模板:template class类名类定义体;说明说明:(1)template是声明各模板的关键字,表示声明一个模板,模板参数可以是一个,也可以是多个。(2)class表示其后面的参数用于指定模板的
4、一个统一类型,不表示类定义。(3)参数1、参数2、,其中每个参数都表示某种类型的临时代号。8.3 项目解决项目解决 用模板知识设计多功能计算器,实现基本数据类型数据的加减乘除 1.定义加减乘除函数模板 template/定义加法函数模板 T Add(T x,T y)return x+y;template/定义减法函数模板 T Sub(T x,T y)return x-y;template/定义乘法函数模板 T Mul(T x,T y)return x*y;template/定义除法函数模板 T Div(T x,T y)return x/y;8.3 项目解决项目解决 2.使用模板完成加减乘除运算
5、 (代码参照课本项目8)运行效果如图:8.4 知识拓展知识拓展 8.4.1 运算符重载8.4.2 异常回主目录回主目录8.4.1 运算符重载运算符重载1.运算符重载的格式 用成员函数重载运算符的一般格式为:函数返回值类型 operator 运算符(0个参数或者1个参数)用友元函数重载单目运算符的一般格式为:函数返回值类型 operator 运算符(class 类型 参数1)用友元函数重载双目运算符的一般格式为:函数返回值类型 operator 运算符(类型 参数1,类型 参数2)8.4.1 运算符重载运算符重载2.运算符重载几点说明(1)哪些运算符可以用作重载?(2)运算符重载后,优先级和结合
6、性怎么办?用户重新定义运算符,不改变原运算符的优先级和结合性。8.4.1 运算符重载运算符重载(3)重载运算符有哪些限制?不可臆造新的运算符。必须把重载运算符限制在C+语言中已有的运算符范围内的允许重载的运算符之中。重载运算符坚持4个“不能改变”。不能改变运算符操作数的个数;不能改变运算符原有的优先级;不能改变运算符原有的结合性;不能改变运算符原有的语法结构。8.4.2 异常异常1.异常的概述 程序的错误,一种是编译错误,即语法错误。如果使用了错误的语法、函数、结构和类,程序就无法被生成运行代码。另一种是在运行时发生的错误,它分为不可预料的逻辑错误和可以预料的运行异常。运行异常,可以预料,但不
7、能避免,它是由系统运行环境造成的。如,内存空间不足,而程序运行中提出内存分配申请时,得不到满足,就会发生异常。8.4.2 异常异常2.异常的基本思想 在小型程序中,一旦发生异常,一般是将程序立即中断运行,从而无条件释放所有资源。对于大型程序来说,运行中一旦发生异常,应该允许恢复和继续运行。恢复的过程就是把产生异常所造成的恶劣影响去掉,中间可能要涉及一系列的函数调用链的退栈,对象的析构,资源的释放等。继续运行就是异常处理之后,在紧接着异常处理的代码区域中继续运行。8.4.2 异常异常3.使用异常的步骤(1)定义异常(try语句块)将那些可能产生错误的语句框定在try语句中(2)定义异常处理(catch语句块)(3)将异常处理的语句放在catch块中,以便异常被传递过来时就处理它(4)抛掷异常(throw语句)(5)检测是否产生异常,若产生异常,则抛掷异常。8.4.2 异常异常一个除数是零的一个除数是零的异常异常处理处理。void main()int x,y=10;cinx;tryif(x=0)throw x;y=y/x;coutyendl;catch(int x)cout除数为零,除法无效!endl;END