c++面向对象课后答案第7章_第1页
c++面向对象课后答案第7章_第2页
c++面向对象课后答案第7章_第3页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1. 概念填空题C+ 最重要的特性之一就是代码重用,为了实现代码重用,代码必须具有通用性 。通用代码需要不受数据 类型 的影响, 并且可以自动适应数据类型的变化。 这种程序 设计类型称为 参数化 程序设计。模板是 C+支持参数化程序设计的工具,通过它可 以实现参数化 多态性 性。函数模板的定义形式是 template < 模板参数表 > 返回类型 函数名(形式参数表 ) 。其 中,<模板参数表 >中参数可以有 多 个,用逗号分开。 模板参数主要是 模板类型 参 数。它代表一种类型,由关键字 typename 或 class 后加一个标识符构成,标识符代 表一个潜在的内置

2、或用户定义的类型参数。类型参数由可以是任意合法标识符。 C+规定参 数名必须在函数定义中至少出现一次。编译器通过如下匹配规则确定调用那一个函数: 首先, 寻找最符合 函数名 和 参数类型 的 一般函数,若找到则调用该函数;否则寻找一个 函数模板 ,将其实例化成一个 模板函 数 ,看是否匹配,如果匹配,就调用该 模板函数 ;再则,通过 类型转换 规则进行 参数的匹配。 如果还没有找到匹配的函数则调用错误。 如果有多于一个函数匹配, 则调用产 生 二义性 ,也将产生错误。类模板使用户可以为类声明一种模式, 使得类中的某些数据成员、 某些成员函数的参数、 某 些成员函数的返回值能取 任意类型 (包括

3、 系统预定类型 和 用户自定义 的类型)。 类是对一组对象的公共性质的抽象, 而类模板则是对不同类的 数据类型? 的抽象, 因此类 模板是属于更高层次的抽象。 由于类模板需要一种或多种 类型 参数, 所以类模板也常常 称为 参数化类 。2. 简答题简述函数模板生成函数的过程。简述类模板生成对象的过程。简述函数模板与模板函数、类模板与模板类的区别。3. 选择题关于函数模板 , 描述错误的是( A )。A. 函数模板必须由程序员实例化为可执行的函数模板B. 函数模板的实例化由编译器实现C. 一个类定义中 ,只要有一个函数模板 , 则这个类是类模板D. 类模板的成员函数都是函数模板 ,类模板实例化后

4、 , 成员函数也随之实例化 下列的模板说明中 , 正确的是( D )。<typename T1,T2><class T1,T2><class T1,class T2><typename T1,typename T2>函数模板定义如下 :template <typename T>Max( T a, T b ,T &c)c=a+b; 下列选项正确的是( B )。A. int x, y; char z;x, y, z;Max(x, y, z);Max( x, y, z);x, y; float z;x; double y, z ;下

5、列有关模板的描述错误的是 (D) 。A 模板把数据类型作为一个设计参数,称为参数化程序设计。B 使用时,模板参数与函数参数相同,是按位置而不是名称对应的。 C 模板参数表中可以有类型参数和非类型参数。D 类模板与模板类是同一个概念。 类模板的使用实际上是将类模板实例化成一个( A函数B对象类模板的模板参数( D)。A只能作为数据成员的类型C只可作为成员函数的参数类型 类模板的实例化( A)。A在编译时进行C在运行时进行 以下类模板定义正确的为( A)。A template<class T,int i=0>C template<class T,typename T>C)。

6、C类D抽象类B只可作为成员函数的返回类型D以上三种均可B属于动态联编D在连接时进行B template<class T,class int i>D template<class T1,T2>4编程题 设计一个函数模板,其中包括数据成员 板参数 T 可实例化成字符串。#include <iostream>#include <string>using namespace std;template<typename T>void Sort(T* a,int n) int i,j;T t;for(i=0;i<n-1;i+) for(j=

7、0;j<n-i-1;j+)if (aj>aj+1) t=aj; aj=aj+1; aj+1=t;T an 以及对其进行排序的成员函数 sort( ),模template<typename T>void Print(T* a,int n) int i;for(i=0;i<n;i+) cout<<ai<<" "cout<<endl;stringStr10="Zhang","Li","Wang","Qian","Zhao&qu

8、ot;,"Wu","Xu","Tang","Shen","Liang"int Int8=20,12,0,-5,9,-18,6,11; double Dou7=,6,10,-9,;Sort<string>(Str,10);Sort<int>(Int,8);Sort<double>(Dou,7);Print(Str,10);Print(Int,8);Print(Dou,7);return 0;int设计一个类模板,其中包括数据成员 T an 以及在其中进行查找数据

9、元素的函数 search(T) 模板参数 T 可实例化成字符串。#include <iostream>using namespace std;template<typename T,int n>class Aint size;T* element;public:A();A();int Search(T);void SetElement(int index,const T& value);template<typename T,int n>A<T,n>:A() size=n>1? n:1;element=new Tsize; temp

10、late<typename T,int n>A<T,n>:A() delete element;template<typename T,int n>int A<T,n>:Search(T t)int i;for(i=0;i<size;i+) if(elementi=t) return i;return -1;template<typename T,int n>void A<T,n>:SetElement(int index,const T& value) elementindex=value;A<int

11、,5> intAry; / 用 int 实例化,建立模板类对象A<double,10> douAry;/ 用 double 实例化,建立模板类对象int i;for(i=0;i<5;i+)(i,i+3);for(i=0;i<10;i+)(i,(i+i)*;i=(7);if(i>=0)cout<<i<<endl;i=;if(i>=0)cout<<i<<endl;return 0;设计一个单向链表类模板, 节点数据域中数据从小到大排列, 并设计插入、 删除节点的成员 函数。#include<iostre

12、am> using namespace std;template<typename T>class List;/ 数据域/ 指针域/ 生成头结点的生成一般结点的构造函数Node<T>:Node()link=NULL;Node<T>:Node(const T & data)template<typename T>class NodeT info;Node<T> *link; public:Node();构造函数Node(const T & data);/ friend class List<T>temp

13、late <typename T> template <typename T> info=data; link=NULL;/ 定义链表类template<typename T>class ListNode<T> *head;/ 链表头指针和尾指针public:List();List();void MakeEmpty();Node<T>* Find(T data); void PrintList();void InsertOrder(Node<T>/ 构造函数,生成头结点 ( 空链表 )/ 析构函数/ 清空一个链表,只余表头

14、结点/ 搜索数据域与 data 相同的结点,返回该结点的地址/ 打印链表的数据域*p); / 按升序生成链表Node<T>* CreatNode(T data);/ 创建一个结点 ( 孤立结点 )Node<T>* DeleteNode(Node<T>* p); / 删除指定结点;template<typename T>List<T>:List()head=new Node<T>(-9999);/ 头结点,最小的数据从小到大插入template<typename T>List<T>:List()Mak

15、eEmpty();delete head;template<typename T>void List<T>:MakeEmpty()Node<T> *tempP;while(head->link!=NULL)tempP=head->link;head->link=tempP->link; / 把头结点后的第一个节点从链中脱离delete tempP;/ 删除( 释放) 脱离下来的结点template<typename T> Node<T>* List<T>:Find(T data)Node<T&

16、gt; *tempP=head->link;while(tempP!=NULL && tempP->info!=data) tempP=tempP->link;return tempP; / 搜索成功返回该结点地址,不成功返回 NULLtemplate<typename T>void List<T>:PrintList()Node<T>* tempP=head->link;while(tempP!=NULL)cout<<tempP->info<<'t'tempP=tempP

17、->link;cout<<endl;template<typename T>void List<T>:InsertOrder(Node<T> *p)Node<T> *tempP=head,*tempQ=head; /tempQ 指向 tempP 前面的一个节点 while(tempP!=NULL)if(p->info<tempP->info)break; / 找第一个比插入结点大的结点,由 tempP 指向 tempQ=tempP;tempP=tempP->link;p->link=tempP;te

18、mpQ->link=p;template<typename T>Node<T>* List<T>:CreatNode(T data)/ 建立新节点Node<T>*tempP=new Node<T>(data);return tempP;template<typename T>Node<T>* List<T>:DeleteNode(Node<T>* p)Node<T>* tempP=head->link,*tempQ=head,*tempC;while(tempP!

19、=NULL && tempP!=p)tempQ=tempP;tempP=tempP->link;tempC=tempP;tempQ->link=tempP->link;return tempC;int main()Node<int> * P1;List<int> list1;int a10=20,12,0,-5,9,-18,6,11,5,3,i,j;for(i=0;i<10;i+)P1=(ai);(P1);();cout<<" 请输入一个要求删除的整数 "<<endl;cin>&g

20、t;j;P1=(j);if(P1!=NULL)P1=(P1);delete P1;();else cout<<" 未找到 "<<endl;cout<<" 请输入一个要求插入的整数 "<<endl;cin>>j;P1=(j);(P1);();();/ 清空 list1();return 0;(=)为单链表类模板增加一个复制构造函数和赋值运算符 (=) 。 在上题基础上, List 类增加一个复制构造函数和赋值运算符 template<typename T>List<T>:L

21、ist(List& l) head=new Node<T>(-9999);/ 现建立头结点 Node<T>* tempP=>link,*tempC;while(tempP!=NULL) tempC=CreatNode(tempP->info); InsertAfter(tempC);tempP=tempP->link;template<typename T>List<T>& List<T>:operator=(List& l)MakeEmpty();/ 先释放原来链表的数据结点Node<T>* tempP=>link,*tempC;while(tempP!=NULL) tempC=C

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论