面向对象程序设计课程作业及复习资料
- 格式:doc
- 大小:64.50 KB
- 文档页数:24
《面向对象程序设计c》综合复习题集及答案详解综合复习题集一、单选题1.C++源程序文件的缺省扩展名为(A)。
A.cppB.e某eC.objD.lik2.由C++源程序文件编译而成的目标文件的缺省扩展名为(C)。
A.cppB.e某eC.objD.lik3.由C++目标文件连接而成的可执行文件的缺省扩展名为(B)。
A.cppB.e某eC.objD.lik4.编写C++程序一般需经过的几个步骤依次是()。
A.编译、编辑、连接、调试B.编辑、编译、连接、调试C.编译、调试、编辑、连接D.编辑、调试、编辑、连接5.以下标识符中不全是保留字的是()。
A.caeforintB.defaultthenwhileC.boolclalongD.gotoreturnchar6.能作为C++程序的基本单位是()。
A.字符B.语句C.函数D.源程序文件7.程序中主函数的名字为()。
A.mainB.MAINC.MainD.任意标识符8.C++程序的基本模块为()。
A.表达式B.标识符C.语句D.函数9.可用作C++语言用户标识符的一组标识符是()。
A.voiddefine+WORDB.a3_b3_123YNC.for-abcCaeD.2aDOizeof10.存储以下数据,占用存储字节最多的是()。
A.0B.‘0’C.“0”D.0.011.程序运行中需要从键盘上输入多于一个数据时,各数据之间应使用()符号作为分隔符。
A.空格或逗号B.逗号或回车C.逗号或分号D.空格或回车12.设”inta=12;”,则执行完语句”a+=a某a;”后,a的值是()。
A.12B.144C.156D.28813.假设在程序中a、b、c均被定义成整型,所赋的值都大于1,则下列能正确表示代数式1/abc的表达式是()。
A.1.0/a某b某cB.1/(a某b 某c)C.1/a/b/(float)cD.1.0/a/b/c14.设”inta=15,b=26;”,则”cout<A.15B.26,15C.15,26D.2615.设某是一个bool型的逻辑量,y的值为10,则表达式某&&y的值为()。
面向对象程序设计1. 代码public class Test {public int aMethod() {static int i = 0;i++;return i;}public static void main (String args[]) {Test test = new Test();test.aMethod();int j = test.aMethod();System.out.println(j);}}输出结果为编译失败,static用来修饰全局变量,不能修饰局部变量2. 下面的程序中,temp的最终值是1long temp=(int)3.9;temp%=2;3.在J2EE中属于Web层的组件有:Servlet4. 派生类中的成员不能直接访问基类中的private成员。
5.以public修饰的类如:public class Car{…}则Car可被其它程序包中的类使用6.paint( )方法使用 Graphics 类型的参数7. 下面数据插入语言(DIL)不属于SQL语句的子类8. 实现运行时的多态性要使用虚函数。
9. 创建对象时构造函数被调用10. 如下代码:class Base {Base() { System.out.print(“Base”); }}public class Alpha extends Base {public static void main( String[] args ) {new Alpha();-----调用父类无参的构造方法new Base();}}结果是BaseBase。
11.如果希望控件在界面上按表格行分列排列,应使用GridLayout布局管理器12. 声明抽象方法不可写出大括号叙述正确13. 线程交互中不提倡使用stop()方法14.当检索一个压缩文件时,首先要建立压缩文件输入流对象,该对象以 FileInputStream 对象为参数15.jsp指令中isELIgnored="boolean"的意思是决定是否支持EL表示。
一.选择题(20题,共30分)●作用域运算符的功能●设置虚基类的目的●构造函数的特征●析构函数的说法●重载函数在调用时选择的依据●静态成员的特性●友元●派生类的描述●运算符在C++中不能被重载?●动态联编的描述●纯虚函数和抽象类的描述●抽象类的使用●delete删除一个动态对象●new运算符的下列描述●C++与C语言关系的描述●类定义中,错误的语句书3.1.1(7)●自动调用该类构造函数次数●静态数据成员的描述●派生类的描述●派生类的构造函数的初始化列表中,不能包含●虚基类的声明●赋值兼容规则●虚函数●纯虚函数表述●抽象类表述●重载运算符函数●成员函数重载的运算符、友元函数重载的运算符●关键字class和typename●类模板表述●重载了运算符<< 书7.2节●语句ofstream f()二.填空题(15空,共30分)●标准输入输出流对象cin cout●类中的数据和成员函数●类都有一个隐含的指针指向:正在调用成员函数的对象●非成员函数访问类成员●虚基类的目的:解决二义性问题●基类数据成员的初始化●operator++●运算符函数调用格式●异常处理的保留字●异常错误处理函数terminate() 、set_terminate()三.程序的执行、填空(4题,共20分)四.编程题(3小题,共20分)一.选择题1.如果表达式++i*k中的“++”和“*”都是重载的友元运算符,若采用运算符函数调用格式,则表达式还可以表示为 A 。
A. operator*(i.operator++(),k)B. operator*(operator++(i),k)C. i.operator++().operator*(k)D. k.operator*(operator++(i))2.在下列成对的表达式中,运算符“/”的意义相同的一对是 D 。
A.8/3和8.0/3.0B.8/3.0和8/3C.8.0/3和8/3D.8.0/3.0和8.0/33.如果表达式y*x++中,“*”是作为成员函数重载的运算符,“++”是作为友元函数重载的运算符,采用运算符函数调用格式时,该表达式应表示为 C 。
⾯向对象的程序设计复习资料⾯向对象复习资料·········⼀、名词解释1、软件⼯程——建⽴在系统化、规范化、数量化等⼯程原则和⽅法上的,关于软件开发各阶段的定义、任务和作⽤的⼯程学科。
包括软件开发技术、软件项⽬管理两⽅⾯内容。
2、模型——对现实的简化,提供系统的蓝图,包含架构[总体]设计和组件[详细]设计;包含重要的因素忽略不相⼲的细节;⼀个系统可以从不同视⾓使⽤不同模型进⾏描述;模型可以是架构的[侧重于组织]、也可以关注⾏为[系统的动作]3、对象——现实世界中具有静态特征和动态特征的某个具体的实际事物。
4、封装——把属性和操作封在⼀个对象⾥,不允许外界直接存取和使⽤。
包含属性与⾏为的结合和信息屏蔽两层含义。
5、消息——向对象发出的[服务]请求,包括服务的对象标识、服务标识、输⼊信息和回答信息等。
定义对象之间单路通信,是从发送⽅到接收⽅的控制流,激发某操作、唤醒信号或导致对象的创建或撤消。
⽤箭头表⽰,符号见表6、继承——派⽣类或⼦类⾃动拥有基类或⽗类的全部属性和操作的类创建⽅法7、多态——同⼀操作作⽤于不同对象,有不同解释或不同的执⾏结果。
两种——编译时、运⾏时;3实现⽅式——接⼝、继承、抽象类。
8、UML——⼀种功能强⼤的、⾯向对象的可视化系统分析的建模语⾔[对⾯向对象系统进⾏可视化、详述、构造和⽂档化的⼯具,已成为软件建模的⼯业标准。
] 9、视图——从某个⽅⾯或⾓度出发描述系统,或表达系统某个⽅⾯特征的⼀个或多个图。
10、动作事物——时间、空间上的动作,模型的动词;最基本的是交互与状态机11、交互——⼀组对象在特定上下⽂、为达到特定⽬的进⾏⼀系列消息交换组成的动作,要列出每个操作的消息、动作次序、连接关系。
12、状态——13、⽤例——14、事件流——15、对象关联——16、可见性——描述属性和操作是否可被其他类引⽤17、活动——对象被占⽤以完成某任务,⽤矩形条表⽰。
1.对象(1)从概念层面讲,对象是某种拥有责任的抽象。
(2)从规格层面讲,对象是一系列可以被其他对象使用的公共接口。
(3)从语言实现层面讲,对象封装了代码和数据。
2.软件开发中的经典阶段:需求、分析、设计、规范、实现、测试、部署、维护。
3.设计7原则:开闭原则、里氏代换原则、依赖倒转原则、合成/聚合复用原则、迪M特原则、接口隔离原则、单一职责原则。
4.面向对象的方法学:UML(统一建模语言)、RUP(统一软件开发过程)、XP(极限编程)。
开发方法:Booch、Coad、OMT、UML、OOSE、Wirfs—Brock 5.OOA——运用面向对象方法进行需求分析。
OOD——运用面向对象方法进行系统设计。
OOP——运用面向对象方法进行程序设计。
6.OOA的基本任务:是运用面向对象的方法,对问题域和系统责任进行分析和理解,对其中的事物和它们之间的关系产生正确的认识,找出描述问题域及系统责任所需的类及对象,定义这些类和对象的属性和操作,以及它们之间所形成的结构、静态联系和动态联系。
最终目的:是产生一个符合用户需求,并能够直接反映问题域和系统责任的OOA模型及其详细说明。
优点:(1)加强了对问题域和系统责任的理解。
(2)改进与分析有关的各类人员之间的交流。
(3)对需求的变化具有较强的适应性。
(4)支持软件复用。
OOA的三大策略是:属性策略、方法策略、对象策略。
7.(1)封装:是指对象在其操作中隐藏属性。
它是一种信息隐蔽技术,用户只能看见对象封装界面上的信息,对象的内部实现对用户是隐蔽的。
封装的目的是使对象的使用者和生产者分开,使对象的定义和实现分开。
例如:要从同事那里借钱,在商店购买食物,就不会抢夺同事的钱包,大翻一通,看看里面是否有足够的钱。
而应该询问他们是否可以借你一些钱,他们就会自己翻钱包。
以表示圆的一个对象作为封装的例子。
圆的操作应能计算出半径、直径、周长和面积。
假定选择存储直径,要访问直径的程序员都会选择存储直径属性,而不是通过“获取直径”的操作来访问。
面向对象程序设计复习资料(一)单项选择题1.Java是一门()语言。
A. 机器B. 汇编C. 面向过程的高级D. 面向对象的高级2. 具有相同属性和服务的一组对象的共同模板称为()。
A. 程序B. 类C. 代码D. 概念3.在Java程序中包含主方法的类被称为主类,主方法的访问控制修饰符为()。
A. privateB. protectedC. publicD. static4.Java语言中的switch语句属于()语句。
A. 数据输入B. 数据输出C. 分支处理D. 循环控制5.在类的定义中,实现接口的子句所使用的关键字为()。
A. extendsB. implementsC. publicD. abstract6.在派生类的定义中,继承父类的子句所使用的关键字为()。
A. extendsB. implementsC. publicD. abstract7.下列能表示栈(stack)s1长度的是( )。
A.s1.length()B.s1.lengthC.s1.sizeD.s1.size()8.下面的异常()为文件没有找到异常。
A. NullPointerExceptionB. FileNotFoundExceptionC. ArrayIndexOutOfBoundsExceptionD. IOException9.下列不是InputStream 类的子类的是()。
A. FileInputStreamB. ObjectInputStreamC、 FileOutputStream D. DataInputStream10.进行文件输入输出操作时,最常用的系统包是()。
A. B. java.ioC. java.utilD. java.awt11.类是对具有共同属性和行为的对象的抽象描述,每个对象称为该类的一个()。
A. 产品B. 元素C. 成分D. 实例12.使用JDK运行Java程序时使用的命令是()。
《面向对象程序设计》课程作业及答案作业1:是非题1. 头文件中一般存放着变量和常量的定义、函数的原型以及类的定义。
1. 错2. 程序的编译是以文件为单位的,因此将程序分到多个文件中可以减少每次对程序修改所带来的编译工作量。
4. 对填空题下面是一个求数组元素之和的程序。
主程序中定义并初始化了一个数组,然后计算该数组各元素的和,并输出结果。
函数sum计算数组元素之和。
填充程序中不完整的部分。
________A__________int sum(int [],int);void main(){int ia[5] = {2,3,6,8,10};B ;sumOfArray = sum(ia,5);cout << "Sum of array:" << sumOfArray << endl;}int sum(int array[],int len){int iSum = 0;for(int i = 0; C ; D )E ;return iSum;}答案:A #include <iostream.h>B int sumOfArray;C i < lenD i++E iSum += array[i];阅读理解题写出下列程序的运行结果: //static int i = 20;int x;static int g(int p) {return i + p;}void f(int v){x=g(v);}//#include <iostream.h> extern int x;void f(int);void main(){int i=5;f(i);cout << x;}回答以下问题:1. 程序的运行结果是什么样的?2. 为什么文件中要包含头文件<iostream.h>?3. 在函数main()中是否可以直接调用函数g()?为什么?4. 如果把文件中的两个函数定义的位置换一下,程序是否正确?为什么?5. 文件和中的变量i的作用域分别是怎样的?在程序中直接标出两个变量各自的作用域。
面向对象程序设计复习资料第2章面向对象思维建立面向对象程序设计的特征:①模块化;②抽象化;③封装;④可组合;⑤继承;⑥软件持续使用时间更长。
面向对象思维分为两步:一是需求分析,识别出有哪些对象,它们分别做什么事(who&&what );二是如何利用对象协作完成一件完整的事情(howb•类与对象的概念和关系:1)类是面向对象程序设计方法的核心,利用类可以实现对数据的封装和隐蔽。
在面向对象程序设计中,程序模块是由类构成。
类是对逻辑相关的函数与数据的封装,它是对问题的抽象描述。
C++的语法提供了对自定义类型的支持,这就是类。
正如基本数据类型中隐含的数据和操作,因此在定义一个类时也要说明数据和操作。
2)类实际上是一种抽象机制,它描述了一类为问题的属性和行为,即类描述了一类对象的数据存储和操作特征。
每一个怪物都有一些共同的静态特征,这些共同的特征抽象到类中统称为该类的属性,属性通过声明普通变量来实现。
每一个怪物都有一些共同的动态行为,这些共同的行为抽象到类中统称为该类的操作, 操作通过声明普通变量来实现。
还能调用对象中的函数(构造函数和析构函数除外)・对象间的协作实现如果函数在类外实现,那么必须在函数名前加上类名,否那么不能实现“::"是作用域限定符,用来声明函数属于哪一类;类必须先在类中做原型声明,然后才能在类外实现;system(”psudr”):等待用户按键然后返回,按任意键继续;system(”cls”):清屏操作关键字new :①在堆上获得一块内存空间、②调用构造函数、③返回正确的指针栈(堆栈)是限定仅在表尾进行插入和删除操作的线性表。
单独存放数据的那块内存称为“堆”,存储指针那块内存称为“栈”User *Lucy = new User():声明一个指针对象Lucy ,在名称堆区保存Lucy这个对象的所有信息,在栈中保存Lucy的堆地址。
delete对象名;|销毁之前引用的对象第6章深入学习面对对象函数成员函数:属于一个类的函数;用于完成对象的初始化类函数:类的成员函数,属于一个类的成员,出现在类体中。
面向对象程序设计复习面向对象程序设计(Object-Oriented Programming, OOP)是一种编程范式,它使用“对象”来设计软件。
对象可以包含数据(通常称为属性)和代码(通常称为方法或函数)。
面向对象程序设计的核心概念包括封装、继承、多态和抽象。
封装封装是将数据和操作这些数据的方法组合在一起的过程。
这样做可以隐藏对象的内部状态,只暴露出一个可以被外部访问的接口。
封装的目的是保护数据不被外部代码直接访问和修改,而是通过方法来进行操作。
继承继承允许一个类(子类)继承另一个类(父类或超类)的属性和方法。
这可以减少代码的重复,并且可以创建一个层次结构,其中子类可以扩展或修改父类的行为。
多态多态是指允许不同类的对象对同一消息做出响应,但具体的行为会根据对象的实际类型而有所不同。
这通常是通过方法重载(编译时多态)和方法重写(运行时多态)来实现的。
抽象抽象是简化复杂的现实世界问题的过程,只关注对于当前目标重要的方面。
在面向对象程序设计中,这通常意味着创建抽象类和接口,它们定义了一组方法的签名,但不提供实现细节。
类和对象类是创建对象的蓝图或模板。
它定义了对象的属性和方法。
对象是根据类创建的实例,每个对象都有其自己的状态和行为。
构造函数和析构函数构造函数是一种特殊的方法,当创建新对象时自动调用,用于初始化对象的状态。
析构函数是类的另一个特殊方法,当对象被销毁时调用,用于清理资源。
访问修饰符访问修饰符控制类成员的可见性。
常见的访问修饰符包括public(公开的)、private(私有的)、protected(受保护的)和friend(友元)。
接口和抽象类接口定义了一组方法的签名,但不提供实现。
抽象类可以包含抽象方法,这些方法必须在子类中实现。
组合和聚合组合是一种特殊的“has-a”关系,其中一个对象包含另一个对象作为其属性。
聚合是一种更弱的“has-a”关系,其中一个对象可以与另一个对象相关联,但不是其属性。
《面向对象程序设计》课程作业及答案作业1:是非题1. 头文件中一般存放着变量和常量的定义、函数的原型以及类的定义。
1. 错2. 程序的编译是以文件为单位的,因此将程序分到多个文件中可以减少每次对程序修改所带来的编译工作量。
4. 对填空题下面是一个求数组元素之和的程序。
主程序中定义并初始化了一个数组,然后计算该数组各元素的和,并输出结果。
函数sum计算数组元素之和。
填充程序中不完整的部分。
________A__________int sum(int [],int);void main(){int ia[5] = {2,3,6,8,10};B ;sumOfArray = sum(ia,5);cout << "Sum of array:" << sumOfArray << endl;}int sum(int array[],int len){int iSum = 0;for(int i = 0; C ; D )E ;return iSum;}答案:A #include <iostream.h>B int sumOfArray;C i < lenD i++E iSum += array[i];阅读理解题写出下列程序的运行结果: //static int i = 20;int x;static int g(int p) {return i + p;}void f(int v){x=g(v);}//#include <iostream.h> extern int x;void f(int);void main(){int i=5;f(i);cout << x;}回答以下问题:1. 程序的运行结果是什么样的?2. 为什么文件中要包含头文件<iostream.h>?3. 在函数main()中是否可以直接调用函数g()?为什么?4. 如果把文件中的两个函数定义的位置换一下,程序是否正确?为什么?5. 文件和中的变量i的作用域分别是怎样的?在程序中直接标出两个变量各自的作用域。
答案:1. 程序的运行结果:25因为程序中需要利用cout对象进行输出,而cout是在C++标准I/O库iostream中定义的类ostream的一个对象。
2 在函数main()中不可以直接调用函数g(),因为g()是静态函数,只在它所在的文件内可见。
3 如果把文件中的两个函数定义的位置换一下,程序不正确,因为C++规定所有使用的变量和函数需要先声明,后使用。
在函数f中用到了函数g,所以函数f不能出现在函数g的定义或声明之前。
文件中的变量i的作用域从它的定义开始到文件结束。
中的变量i的作用域从它的定义开始到main函数结束。
编程题写一个函数,完成在链表末尾增加一个节点的操作。
函数的原型为:Node * AddNode(Node * & head, int newData);其中,链表节点的定义如下:struct Node {int data; //存放数据Node * next; //指向链表中的下一个节点};函数参数:函数的第一个参数head指向链表的第一个节点,如果链表为空,则head的值为NULL。
第二个参数newData为要插入的新节点中存放的数据。
函数返回值:当成功地插入新的节点时,函数返回指向新节点的指针,否则,如果不能申请到内存空间,则返回NULL。
3 / 24Node * AddNode(Node *& head, int newData){//在这里写出函数的实现}答案:Node * AddNode(Node * &head, int newData){//申请新的节点空间Node * newNode = new Node;if (newNode == NULL)return NULL;//填充新节点的内容newNode->data = newData;newNode->next = NULL;//插入到链表的结尾if (head == NULL)head = newNode;else{//寻找链表的最后一个节点Node *tail = head;while(tail->next != NULL)tail = tail->next;//将新节点插入到最后tail->next = newNode;}return newNode;}作业2:是非题1. 在不同作用域中的变量可以同名。
对2. 派生类的成员函数可以直接访问基类的所有成员。
2. 错填空题#include<iostream.h>___________A_____________;void main(){int a[6]={2,4,8,6,9,14};int x1=____B______; //调用f1函数求出a中前4各元素之和。
int x2=f1(a,6);cout<<x1<<' '<<x2<<endl;}int f1(int a[], int n){int i,s=0;for(i=0;i<n;i++) s+=a[i];return s;}答案:A int f1(int a[], int n);B f1(a,4)改错题1. 下面的函数将浮点型指针参数para所指向的值赋给一个局部指针变量pFloat所指向的空间,然后输出*pFloat的值。
#include <iostream.h>void func(float * para){float * pFloat;pFloat = para;5 / 24cout << pFloat;}错误为:______________________________________________________改正方法为:________________________________________________________________________________________________________________答案错误为:没有给指针申请空间,就直接赋值改正的方法为:先为pFloat申请空间,再赋值。
2. 下列程序片段对二维数组的每个元素赋值unsigned short SomeArray[5][4];for (int i = 1; i<=5; i++)for (int j = 1; j<=4; j++)SomeArray[i][j] = i+j;错误为:______________________________________________________改正方法为:__________________________________________________ ______________________________________________________________答案错误为:访问数组元素的下标不对改正的方法为:将两个for循环的循环初始值改为0,循环结束条件分别改为i<5和j<4。
编程题写一个函数,找出给定字符串中小写字母字符的个数。
函数的原型为:int CalcAlpha(char *str);函数参数: str为所要处理的字符串;函数返回值:所给字符串中小写字母字符的个数int CalcAlpha(char *str){ //在这里写上程序的实现}答案:int CalcAlpha(char *str){//判断字符指针是否为空if(str == NULL) return 0;//记录小写字母字符个数的变量int num=0;//依次检查各个字符,如果是小写字母,则总数加1for(int i=0; str[i]!=0x0; i++)if(str[i])>='a' && str[i]<='z')num++;//返回数字字符个数return num;}作业3:是非题1. 函数的参数和返回值类型可以是简单数据类型,也可以是指针、引用、数组和类。
3. 错7 / 242. 如果派生类的成员函数的原型与基类中被定义为虚函数的成员函数原型相同,那么,这个函数自动继承基类中虚函数的特性。
5. 对填空题#include<iostream.h>________A___________;int f2(int* a, int n){______ B___________;for(i=1;i<n;i++)if(max<a[i]) max=a[i];return max;}void main(){int b[MM]={3,12,6,20,9,7,34,50,25,66};_______C__________; //求出b[4]至b[8] 之间的最大值并赋给x1_______D___________; //求出b[0]至b[5] 之间的最大值并赋给x2cout<<x1<<' '<<x2<<endl;}答案:A const int MM=10;B int i,max=a[0];C int x1=f2(b+4, 5);D int x2=f2(b, 6);阅读理解题二、valarray是C++的标准模板库中的一个类模板,类模板的每个实例类实现了某个具体的数据类型的数组,如valarray<int>是一个整型的数组类。
该类的使用和一般的数组非常类似,可以通过’[ ]’运算符来访问数组中的每个元素。
C++的标准模板库中还有一个模板函数abs(),其函数原型为:template<class T>valarray<T> abs(const valarray<T> & x);该函数的作用是将作为参数的数组x的每个元素的值取绝对值,并返回得到的新的数组。
如原来的数组为:4 -1 -3 0 -34将这个数组作为参数传递给函数abs后,函数返回的数组就变成:4 1 3 0 34要求:阅读下列程序,回答后面的问题。
/********************************************************************/#include <iostream.h>#include <valarray.h> //该头文件中定义了模板类valarray和模板函数abs() #define ARRAY_SIZE 10typedef valarray<int> INTVALARRAY;void main(){INTVALARRAY val_array(ARRAY_SIZE);//定义一长度为ARRAY_SIZE的数组对象9 / 24//赋初始值for (int i = 0; i < ARRAY_SIZE; i++)val_array[i] = -i;cout << "Size of val_array = " << val_array.size() << "\n";cout << "The values of val_array before calling abs():\n";for (i = 0; i < ARRAY_SIZE; i++)cout << val_array[i] << " ";cout << "\n";INTVALARRAY abs_array = abs(val_array);cout << "The result of val_array after calling abs():\n";for (i = 0; i < ARRAY_SIZE; i++)cout << abs_array[i] << " ";cout << "\n";}/*********************************************************************/ 问题1:写出程序的输出结果问题2:关于程序中的语句:INTVALARRAY val_array(ARRAY_SIZE);下列说法哪些是正确的,哪些是错误的?在下表相应的位置写上“对”或“错”(A)该语句定义了一个对象val_array,这个对象是类valarray<int>的实例(B)该语句说明了一个函数原型,函数的名字为val_array,参数为ARRAY_SIZE,函数的返回值类型为INTVALARRAY(C)板类valarray一定有一个只带一个参数的构造函数(D)模板类valarray一定有一个只带两个参数的构造函数(E)ARRAY_SIZE将作为参数传递给val_array的构造函数,初始化val_array对象问题3:(本小题共12分)下面是模板函数abs()的实现。