C++面向对象程序设计教程课后习题答案.ppt_第1页
C++面向对象程序设计教程课后习题答案.ppt_第2页
C++面向对象程序设计教程课后习题答案.ppt_第3页
C++面向对象程序设计教程课后习题答案.ppt_第4页
C++面向对象程序设计教程课后习题答案.ppt_第5页
已阅读5页,还剩171页未读 继续免费阅读

下载本文档

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

文档简介

C+面向对象程序设计教程,第1章 C+程序设计基础 习题解答,.,一、选择题,1下列语句中,错误的是 。 A)const int buffer = 256; B)const int temp; C)const double *point; D)double * const pt = new double(5.5); 解析:修饰符const声明的常量只能被读取,该常量必须在声明时进行初始化,并且它的值在程序中不能改变。选项B)没有初始化,错误。选项C)定义了一个指向const double的指针,其意义为指针 point指向的变量不能通过指针point来改变,D)中表示指针pt是常量指针,已在声明时进行了初始化。 答案:B,2关于函数重载,下列叙述中错误的是 。 A)重载函数的函数名必须相同 B)重载函数必须在参数个数或类型上有所不同 C)重载函数的返回值类型必须相同 D)重载函数的函数体可以有所不同 解析:函数重载是用同一个函数名字在不同的参数类型或参数个数上做类似的操作方作,它们的实现方法可以不同。所以说,重载函数的函数名必须相同,函数体可以有所不同。函数重载必须在参数类型或参数个数上不一样,不能依靠返回值不一样来区分重载函数。 答案:C,3有以下程序: void Fun(int i, int j) cout i + j endl; / 输出i+j void Fun(int i) cout i+ endl; / 输出i+ int main() / 主函数main() int a = 1; / 定义变量i Fun(a); / 调用Fun() return 0; / 返回值0, 返回操作系统 该程序执行后输出的结果是 。 A)1 B)2 C)3 D)4 解析:由于主函数中调用的Fun()函数只有一个参数,故执行的是void Fun( int i )的版本,执行“cout i+ endl;”时,由于是后缀“+”,所以先输出i的值1,再使i加1。 答案:A,二、编程题,1编写一个C+程序,要求输出“欢迎学习C+语言!”。 参考程序: #include / 编译预处理命令 using namespace std; / 使用命名空间std int main() / 主函数main() cout “欢迎学习C+语言!“ endl; / 用C+的方法输出一行 system(“PAUSE“); / 调用库函数system( ),输出提示信息 return 0; / 返回值, 返回操作系统 ,*2编一个程序,用一个函数实现求n个整型数据的最小值。函数原型如下: int Min(int a, int n) 参考程序: #include / 编译预处理命令 using namespace std; / 使用命名空间std int Min(int a, int n) / 求n个整型数据的最小值 int m = a0, i; / 临时变量 for (i = 1; i n; i+) / 依次比较求最小值 if (ai m) / 如果ai更小 m = ai; / ai为当前最小值 return m; / 返回最小值 int main() / 主函数main() int a = 1, 2, 3, 4, 5, 6, 7, 8, 9, -10, n = 10; cout “最小值为“ Min(a, n) endl; / 输出最小值 system(“PAUSE“); / 调用库函数system( ),输出提示信息 return 0; / 返回值, 返回操作系统 ,3求2个数或3个整数中的最大数,用两个同名函数实现,要求编写测试程序。 参考程序: #include / 编译预处理命令 using namespace std; / 使用命名空间std int Max(int x, int y) / 求x,y的最大值 return x y ? x : y; / 返回x,y的最大值 int Max(int x, int y, int z) / 求x,y,z的最大值 int m = x y ? x : y; / x,y的最大值 m = m z ? m : z; / m,z的最大值 return m; / 返回x,y,z的最大值 int main() / 主函数main() cout “2,3的最大值为“ Max(2, 3) endl; cout “1,6,8的最大值为“ Max(1, 6, 8) endl; system(“PAUSE“); / 调用库函数system( ),输出提示信息 return 0; / 返回值, 返回操作系统 ,4用变量的引用作函数形参,实现交换两个整型变量,要求编写测试程序。 参考程序: #include / 编译预处理命令 using namespace std; / 使用命名空间std void Swap(int / 返回值, 返回操作系统 ,*5编一个程序,用同一个函数名对n个数据进行从小到大排序,数据类型可以是整型、单精度实型、双精度实型,用重载函数实现。 参考程序: #include / 编译预处理命令 using namespace std; / 使用命名空间std void Sort(int a, int n) / 对a0.an-1进行排序 int tem, i, j; / 定义变量 for (i = 0; i aj) / ai比aj更大 tem = ai; ai = aj; aj = tem; ,*5编一个程序,用同一个函数名对n个数据进行从小到大排序,数据类型可以是整型、单精度实型、双精度实型,用重载函数实现。 参考程序: void Sort(float a, int n) / 对a0.an-1进行排序 float tem; / 临时变量 int i, j; / 定义变量 for (i = 0; i aj) / ai比aj更大 tem = ai; ai = aj; aj = tem; ,*5编一个程序,用同一个函数名对n个数据进行从小到大排序,数据类型可以是整型、单精度实型、双精度实型,用重载函数实现。 参考程序: void Sort(double a, int n) / 对a0.an-1进行排序 double tem; / 临时变量 int i, j; / 定义变量 for (i = 0; i aj) / ai比aj更大 tem = ai; ai = aj; aj = tem; ,*5编一个程序,用同一个函数名对n个数据进行从小到大排序,数据类型可以是整型、单精度实型、双精度实型,用重载函数实现。 参考程序: int main() / 主函数main() int a = 1, 3, 2, 5, 6, 9, 0, 6; / 定义a float b = 1.6, 3.3, 2.8, 5.6, 6.8, 9.6, 0.6, 6.8; / 定义b double c = 1.2, 3.1, 2.6, 5.8, 6.8, 9.8, 0.8, 6.2;/ 定义c int i, n = 8; / 定义变量 Sort(a, n); / 对a排序 cout “a:“; / 输出提示 for (i = 0; i n; i+) cout ai “ “; / 输出ai cout endl; / 换行 ,*5编一个程序,用同一个函数名对n个数据进行从小到大排序,数据类型可以是整型、单精度实型、双精度实型,用重载函数实现。 参考程序: Sort(b, n); / 对b排序 cout “b:“; / 输出提示 for (i = 0; i n; i+) cout bi “ “; / 输出bi cout endl; / 换行 Sort(c, n); / 对c排序 cout “c:“; / 输出提示 for (i = 0; i n; i+) cout ci “ “; / 输出ci cout endl; / 换行 system(“PAUSE“); / 调用库函数system( ),输出系统提示信息 return 0; / 返回值, 返回操作系统 ,C+面向对象程序设计教程,第2章 类和对象 习题解答,.,一、选择题,1下列选项中,不属于面向对象程序设计特征的是 。 A)继承性 B)多态性 C)类比性 D)封装性 解析:封装性、继承性和多态性是面向对象思想的3个主要特征。封装性指将数据和算法捆绑成一个整体,这个整体就是对象,描述对象的数据被封装在其内部。继承性是指一种事物保留了另一种事物的全部特征,并且具有自身的独有特征。多态性主要指当多个事物继承自一种事物时,同一操作在它们之间表现出不同的行为。 答案:C,2在面向对象方法中,实现信息隐蔽是依靠 。 A)对象的继承 B)对象的多态 C)对象的封装 D)对象的分类 解析:在面向对象方法中,封装性是指将数据和算法捆绑成一个整体,这个整体就是对象,描述对象的数据被封装在内部,只可以通过对象提供的算法来进行操作,从而实现信息隐蔽。 答案:C,3下列关于类和对象的叙述中,错误的是 。 A)一个类只能有一个对象 B)对象是类的具体实例 C)类是某一类对象的抽象 D)类和对象的关系就像数据类型和变量的关系 解析:在面向对象设计中,类是同一种对象的抽象,而不只是对一个对象的抽象,一个类具有多个对象。对象是类的具体实例。就像数据类型和变量的关系,一种数据类型可以定义多个变量,一个变量却只能是一种数据类型。 答案:A,4有以下类声明: class MyClass int num; ; 则MyClass类的成员num是 。 A)公有数据成员 B)公有成员函数 C)私有数据成员 D)私有成员函数 解析:函数声明时,函数名后必须带“”,所以num是数据成员。在类中,当没有用访问权限标识符标识时,默认为私有权限。 答案:C,5在下列函数原型中,可以作为类AA构造函数的是 。 A)void AA(int); B)int AA(); C)AA(int) const D)AA(int); 解析:构造函数用于初始纶对象的数据成员,没有返回类型,而且由于常成员函数不能更新对象的数据成员,所以常成员函数也不可能作为构造函数。 答案:D,6下列关于this指针的叙述中,正确的是 。 A)任何与类相关的函数都有this指针 B)类的成员函数都有this指针 C)类的友元函数都有this指针 D)类的非静态成员函数才有this指针 解析:this指针只能在类的成员函数中使用,它指向该成员函数被调用的对象。但是有两种与类相关的函数都没有this指针,即静态成员函数和友元函数。 答案:D,7有以下程序: class Test private: static int n; / 静态成员 public: Test() n += 2; / 构造函数 Test() n -= 3; / 析构函数 static int GetNum() return n; / 返回n ; int Test:n = 1; / 初始化n int main() / 主函数main() Test *p = new Test; / 定义指针p delete p; / 释放p指向的动太对象 cout “n=“ Test:GetNum() endl;/ 输出n return 0; / 返回值0, 返回操作系统 执行后的输出结果是 。 A)n=0 B)n=1 C)n=2 D)n=3 解析:静态数据成员初始化的值为1,执行“Test *p = new Test”将调用构造函数,执行“n += 2;”,n的值变为3,执行“delete p;”时将调用析构函数,执行“n -= 3;”,n的值减3,变为0。 答案:A,8有以下程序: class MyClass private: int n; / 数据成员 public: MyClass(int k): n(k) / 构造函数 int Get() return n; / 返回n int Get() const return n + 1; / 返回n+1 ; int main() / 主函数main() MyClass a(5); / 定义对象a const MyClass b(6); / 定义对象b cout a.Get() b.Get() endl; / 输出信息 return 0; / 返回值0, 返回操作系统 运行后的输出结果是 。 A)55 B)57 C)75 D)77 解析:const是一个判断重载的标志,a.Get调用“int Get() return n; ”,故得到5,而常对象b执行“ b.Get”时,调用常成员函数“int Get() const return n + 1; ”,故得到6+1=7。 答案:B,9由于常对象不能被更新,因此 。 A)通过常对象只能调用它的常成员函数 B)通过常对象只能调用静态成员函数 C)常对象的成员都是常成员 D)通过常对象可以调用任何不改变对象值的成员函数 解析:通过常对象只能调用类中的常成员函数,而不能调用类中的其他成员函数。 答案:A,10下列情况中,不会调用复制构造函数的是 。 A)用一个对象去初始化同一类的另一个新对象时 B)将类的一个对象赋予该类的另一个对象时 C)函数的形参是类的对象,调用函数进行形参和实参结合时 D)函数的返回值是类的对象的引用,函数执行返回调用时 解析:只要在程序的执行中,需要用一个对象来初始化另一个对象,都要调用复制构造函数,包括A、B、C三种情况。 答案:D,11以下关键字不能用来声明类的访问权限的是 。 A)public B)static C)protected D)private 解析:类的访问权限有三种:公有、私有、保护,关键字分别是public,private,protected,。static用于静态成员的声明。 答案:B,12有以下程序: class MyClass public: MyClass() cout “A“; / 无参构造函数 MyClass(char c) cout c; / 带参构造函数 MyClass() cout “B“; / 析构函数 ; int main() / 主函数main() MyClass a, *p; / 定义变量 p = new MyClass(X); / 分配动态空间 delete p; / 释放动态空间 cout endl; / 换行 return 0; / 返回值0, 返回操作系统 执行这个程序,屏幕上将显示输出 。 A)ABX B)ABXB C)ABXB D)AXBB 解析:定义对象a时,调用一次构造函数“MyClass() cout “A“; ”,但定义对象指针p时不调用构造函数;使用new动态创建对象时,根据参数情况调用“MyClass(char c) cout c; ”,输出X;执行“delete p;”时,需要调用一次析构函数,输出B;最后主函数结束时,对象a调用一次析构函数,输出B。 答案:D,13有以下程序: class Test public: static int a; / 静态成员 void Init() a = 1; / 初始化函数 Test(int a = 6) Init(); a+; / 构造函数 ; int Test:a = 0; / 初始化a Test obj; / 定义全局对象 int main() / 主函数main() cout obj.a endl; / 输出a return 0; / 返回值0, 返回操作系统 运行时输出的结果是 。 A)0 B)1 C)2 D)3 解析:首先初始化静态数据成员a为0,然后在定义全局对象obj时调用构造函数。这时有两个a,一个是“Test(int a = 6) Init(); a+;”函数中的局部变量a,另一个是静态数据成员a,需要靠作用域来区分。在执行Init()时,由于离开了构造函数“Test(int a = 6) Init(); a+;”的作用域,Init()里的a为静态数据成员,这时静态数据成员a赋值为1;之后回到构造函数执行a+,这个a为“Test(int a = 6) Init(); a+;”中的a,值变为7,但当构造函数执行完毕后,该局部变量a随之消失,与对象无关。obj.a调用的是静态数据成员,结果为1。 答案:B,14有以下程序: class Test private: long x; / 私有数据成员 public: Test(long a): x(a) / 构造函数 friend long Fun(Test s); / 友元 ; long Fun(Test s) if (s.x = 1 ) return 1; / 递归结束 else return s.x * Fun(Test(s.x - 1); / 递归调用 int main() / 主函数main() int sum = 0; / 定义变量 for (int i = 0; i 6; i+) sum += Fun(Test(i); / 累加求和 cout sum endl; / 输出sum return 0; / 返回值0, 返回操作系统 运行后的输出结果是 。 A)120 B)16 C)154 D)34 解析:友元函数Fun()参数表中的对象在初始化时需执行构造函数“Test:Test(long a)”,调用过程为:先调用构造函数Test(i),使Test中x的值为i,再通过友元函数直接访问Test.x,执行Fun()中的语句,可得到:Fun(Test(0)=1,Fun(Test(1)=1,Fun(Test(2)=2*1,Fun(Test3)=3*2*1=6,Fun(Test(4)=4*3*2*1=24,Fun(Test(5)=5*4*3*2*1=120,sum=1+1+2+6+24+120=154。 答案:C,15有以下程序: class Test private: int a; / 数据成员 public: Test() cout “无参构造函数“ endl; / 无参构造函数 Test(int a) cout a endl; / 带参构造函数 Test(const Test / 返回值0, 返回操作系统 运行时的输出结果是 。 A)3 B)无参构造函数 C)复制构造函数 D)3 析构函数 析构函数 析构函数 解析:创建对象a时带有参数3,故调用构造函数Test( int a),输出3并换行;程序结束时调用析构函数Test(),输出“析构函数”并换行。 答案:D,16有以下程序: class MyClass private: int n; / 数据成员 public: MyClass(int m): n(m) / 构造函数 void Print() const cout “const:n=“ n “ “; / 常成员函数 void Print() cout “n=“ n “ “; / 非常成员函数 ; int main() / 主函数main() const MyClass obj1(10); / 常对象 MyClass obj2(20); / 非常对象 obj1.Print(); / 输出信息 obj2.Print(); / 输出信息 cout endl; / 换行 return 0; / 返回值0, 返回操作系统 程序的输出结果是 。 A)n=10 const:n=20 B)const:n=10 const:n=20 C)const:n=10 n=20 D)n=10 n=20 解析:根据const修饰符选择对应的构造函数,objl为常对象,调用常成员函数,输出“const:n=10 ”,obj2为一般对象,调用优先调用非常成员函数,输出“n=20 ”。 答案:C,二、填空题,1在面向对象方法中, 描述的是具有相同属性与操作的一组对象。 解析:在面向对象设计中,一个对象是由一些属性和操作构成的。对象的属性描述了对象的内部细节。类是具有相同属性和操作的一组对象的集合,它为属于该类的所有对象提供统一的抽象描述。 答案:类,2非成员函数应声明为类的 函数才能访问这个类的private成员。 解析:类具有数据封装和隐藏的特性,通常只有类的成员函数才能访问类的私有成员,外部函数只能访问类的公有成员。但在某些情况下,需要在类的外部访问类的私有成员,这时必须依靠引入友元来实现。 答案:友元,3下列程序的输出结果为: 0 1 试将程序补充完整。 class Point private: int x, y; / 坐标 static int count; / 静态数据成员 public: Point(int m = 0, int n = 0): x(m), y(n) count+; / 构造函数 Point() count-; / 析构函数 int GetX() const return x; / 返回x int GetY() const return y; / 返回y static void ShowCount() cout count endl; / 输出count ; / 静态数据成员的初始化 int main() / 主函数main() Point:ShowCount(); / 输出count Point a(6, 8); / 定义对象 Point:ShowCount(); / 输出count system(“PAUSE”); / 调用库函数system( ),输出提示信息 return 0; / 返回值0, 返回操作系统 。 解析:由第一次调用GetCount()函数输出count的值为0可知,应将其初始化为0,再根据静态数据成员的初始化格式: 类型 类名:静态成员名字 = 值; 可得横线处填写的语句。 答案:int Point:count = 0;,4有以下类声明: class MyClass int i; private: int j; protected: int k; public: int m, n; ; 其中私有成员的数量是 。 解析:在用class声明类的成员声明中,如果没有标识成员的访问权限,则默认为私有的访问权限,故i为私有访问权限。 答案:2,5有以下程序: class Integer private: int n; / 数据成员 public: Integer(int n = 0) = n; / 构造函数 void Show() const cout n 或 Integer : n,6有以下程序: class A public: A() cout “A“; / 构造函数 A() cout “A“; / 析构函数 ; int main() / 主函数main() A *p = new A; / 定义指针 delete p; / 释放动态空间 cout endl; / 换行 system(“PAUSE“); / 调用库函数system( ),输出系统提示 return 0; / 返回值0, 返回操作系统 程序的输出结果是 。 解析:创建动态对象时需调用A的构造函数,输出“A”;释放动态对象时,调用A的析构函数,输出“A”。 答案:AA,三、编程题,1定义一个满足如下要求的Date类。 (1)用下面的格式输出日期: 年-月-日 (2)设置日期。 并编出应用程序,定义日期对象,设置日期,输出该对象提供的日期。 参考程序: #include / 编译预处理命令 using namespace std; / 使用命名空间std class Date private: / 数据成员 int year; / 年 int month; / 月 int day; / 日 ,1定义一个满足如下要求的Date类。 (1)用下面的格式输出日期: 年-月-日 (2)设置日期。 并编出应用程序,定义日期对象,设置日期,输出该对象提供的日期。 参考程序: public: / 公有函数 Date(int y = 2010, int m = 1, int d = 1): year(y), month(m), day(d) / 构造函数 void Set(int y, int m, int d) / 设置日期 year = y; month = m; day = d; void Show() const / 显示日期 cout year “-“ month “-“ day endl; ; int main() / 主函数main() Date d; / 定义对象 d.Show(); / 显示日期 d.Set(2016, 6, 18); / 设置日期 d.Show(); / 显示日期 system(“PAUSE“); / 调用库函数system( ),输出提示信息 return 0; / 返回值, 返回操作系统 ,2定义一个时间类Time,能提供和设置由时、分、秒组成的时间,并编出应用程序,定义时间对象,设置时间,输出该对象提供的时间。 参考程序: #include / 编译预处理命令 using namespace std; / 使用命名空间std class Time private: / 数据成员 int hour; / 时 int minute; / 分 int second; / 秒 public: / 公有函数 Time(int h = 0, int m = 0, int s = 0): / 构造函数 hour(h), minute(m), second(s) void Set(int h, int m, int s) / 设置日期 hour = h; minute = m; second = s; void Show() const / 显示日期 cout hour “:“ minute “:“ second endl; ; int main() / 主函数main() Time t; / 定义对象 t.Show(); / 显示时间 t.Set(8, 6, 18); / 设置时间 t.Show(); / 显示时间 system(“PAUSE“); / 调用库函数system( ),输出提示信息 return 0; / 返回值, 返回操作系统 ,*3编写设计一个People(人)类。该类的数据成员有姓名(name)、年龄(age)、身高(height)、体重(weight)和人数(num),其中人数为静态数据成员,成员函数有构造函数(People)、进食(Eatting)、运动(Sporting)、显示(Show)和显示人数(ShowNum)。其中构造函数由已知参数姓名(nm)、年龄(a)、身高(h)和体重(w)构造对象,进食函数使体重加1,运动函数使身高加1,显示函数用于显示人的姓名、年龄、身高、体重,显示人数函数为静态成员函数,用于显示人数。假设年龄的单位为岁,身高的单位为厘米,体重的单位为市斤,要求所有数据成员为private访问权限,所有成员函数为public访问权限,在主函数中定义若干个对象,通过对象直接访问类的所有非静态成员函数,通过类访问静态成员函数。 参考程序: #include / 编译预处理命令 using namespace std; / 使用命名空间std class People private: / 数据成员 char name9; / 姓名 int age; / 年龄 int height; / 身高 double weight; / 体重 static int num; / 人数 , public: / 公有函数 People(char nm = “无名氏“, int a = 16, int h = 168, int w = 118): age(a), height(h), weight(w) strcpy(name, nm); num+; void Eatting() weight+; / 进食 void Sporting() height+; / 运动 void Show() const / 显示信息 cout “个人信息:“ endl; cout “姓名:“ name endl; cout “年龄:“ age “岁“ endl; cout “身高:“ height “厘米“ endl; cout “体重:“ weight “市斤“ endl endl; static void ShowNum() / 显示人数 cout “人数:“ num endl; ; int People:num = 0; / 初始化静态数据成员num , int main() / 主函数main() People p1; / 定义对象 p1.Show(); / 显示信息 People p2(“李敏“, 18, 170, 108); / 定义对象 p2.Eatting(); / 进食 p2.Sporting(); / 运动 p2.Show(); / 显示信息 People:ShowNum(); / 显示人数 system(“PAUSE“); / 调用库函数system( ),输出提示信息 return 0; / 返回值, 返回操作系统 ,*4定义一个描述员工(Employee)基本情况的类,数据成员包括编号(num)、姓名(name)、性别(sex)、工资(wage)、人数(count)、总工资(totalWage)。其中姓名定义为长度为18的字符数组,性别为为长度为3的字符数组,其它数据成员类型为整型,总工资和人数为静态数据成员,函数成员包括构造函数、显示基本数据函数(ShowBase)和显示静态数据函数(ShowStatic),其中构造函数由已知参数编号(nu) 、姓名(nm) 、性别(sx)和工资(wg)构造对象,显示基本数据函数用于显示学生的编号、姓名、性别和工资,显示静态数据函数为静态成员函数,用于显示人数和总工资;要求所有数据成员为protected访问权限,所有成员函数为public访问权限,在主函数中定义若干个员工对象,分别显示员工基本信息,以及显示员工人数和总工资。 参考程序: #include / 编译预处理命令 using namespace std; / 使用命名空间std class Employee protected: / 数据成员 int num; / 编号 char name18; / 姓名 char sex3; / 姓名 int wage; / 工资 static int count; / 人数 static int totalWage; / 总工资 , public: / 公有函数 Employee(int nu, char nm, char sx, int wg): num(nu), wage(wg) strcpy(name, nm); strcpy(sex, sx); count+; totalWage += wg; ; void ShowBase() / 显示基本数据 cout “个人基本信息:“ endl; cout “学号:“ num endl; cout “姓名:“ name endl; cout “性别:“ sex endl; cout “工资:“ wage “元“ endl endl; static void ShowStatic() / 显示静态数据 cout “人数:“ count endl; cout “总工资:“ totalWage “元“ endl; ; int Employee:count = 0; / 初始化静态数据成员count int Employee:totalWage = 0; / 初始化静态数据成员totalWage , int main() / 主函数main() Employee e1(1008, “李杰“, “男“, 2680); / 定义对象 e1.ShowBase(); / 显示基本数据 Employee e2(1009, “李敏“, “女“, 2860); / 定义对象 e2.ShowBase(); / 显示基本数据 e2.ShowStatic(); / 显示静态数据 system(“PAUSE“); / 调用库函数system( ),输出系统提示信息 return 0; / 返回值, 返回操作系统 ,C+面向对象程序设计教程,第3章 模板 习题解答,.,一、选择题,1下列关于模板的叙述中,错误的是 。 A)模板声明中的第一个符号总是关键字template B)在模板声明中用“”和“”括起来的部分是模板的类型形参表 C)类模板不能有数据成员 D)在一定条件下函数模板的类型实参可以省略 解析:由模板声明的格式可知选项A、B正确。在调用模板函数时,如果编译系统从模板函数的类型实参表中得到的信息已经能够判断部分或全部虚拟类型参数所对应的实际类型,而且它们又正好是模板形参中最后的若干个参数,则在模板类型实参表中可以省略这几个参数,选项D正确。类模板中可以有数据成员,数据成员的类型可以是虚拟类型,也可以是具体类型,选项C错误。 答案:C,2有以下函数模板定义: template ElemType Fun(const ElemType 解析:当从模板函数类型实参表获得的信息有矛盾时,模板类型实参不能省略。例如选项C中,编译系统从第一个参数3获得的信息是ElemType对应于int,而从第二个参数5.5处获得的信息是ElemType对应于double,两者相互矛盾,因此,编译时将产生错误。解决的方法之一是显式给出虚拟类型参数ElemType对应的模板类型实参,强制ElemType对应于int。 答案:C,3关于关键字class和typename,下列表述中正确的是 。 A)程序中typename都可以替换为class B)程序中的class都可以替换为typename C)在模板类型形参表中只能用typename来声明参数的类型 D)在模板类型形参表中只能用class或typename来声明参数的类型 解析:程序中的typename都可以替换为class,但程序中的class不可以全部替换为typename。例如:在“模板类型形参表”中,关键字typename和class是可以互换的;但是在“类模板名”前的关键字class代表的含义是类,不可以用typename代替,选项B错误。在模板类型形参表中除了typename和class以外也可以用常规类型来声明参数的类型,选项C、D错误。 答案:A,4有以下函数模板: template ElemType Square(const ElemType 其中ElemType是 。 A)函数形参 B)函数实参 C)模板类型形参 D)模板类型实参 解析:由函数模板的定义可知ElemType为模板类型形参。 答案:C,5C+中的模板包括 。 A)对象模板和函数模板 B)对象模板和类模板 C)函数模板和类模板 D)变量模板和对象模板 解析:C+语言通过模板提供了一种将类型参数化的机制,其中包括函数模板和类模板。 答案:C,二、填空题,1已知一个函数模板的声明如下: template T1 Fun(T2 n) return n * 5.0; 若要求以int型数7为函数实参调用该模板函数,并返回一个double型数,则该调用应表示为 。 解析:当虚拟类型类型参数作为函数的返回值类型,而函数的返回值类型与函数参数的类型可以不同时,不管函数类型实参的类型是什么,均不能省略模板类型实参,此题的模板类型实参应为。 答案:Fun(7),2已知int dbl(int n ) return n + n; 和long dbl(long n) return n + n; 是一个函数模板的两个实例,则该函数模板的声明是 template 解析:将类型int和long参数化,用模板类型参数ElemType代替,可得该函数模板。 答案:ElemType Dbl(ElemType n ) return n + n; ,3下面程序的运行结果是 。 template ElemType Min(const ElemType / 返回值0, 返回操作系统 解析:模板函数Min()根据调用它的实参类型的不同,生成不同的函数版本,例如,返回两个int型数的最小值或返回两个double型数的最小值。 答案:最小整数=4,最小实型=0.35,三、编程题,1试使用函数模板实现输出一个数组各元素的值,要求编写测试程序。 参考程序: #include / 编译预处理命令 using namespace std; / 使用命名空间std template void Display(ElemType a, int n) / 输出数组a各元素之值 for (int i = 0; i n; i+) cout ai “ “; / 输出ai cout endl; / 换行 int main() / 主函数main() int a = 1, 2, 3, 4, 5, 6, 7, 8, 9; / 定义数组 Display(a, 9); / 输出a system(“PAUSE“); / 调用库函数system( ),输出系统信息 return 0; / 返回值, 返回操作系统 ,2编写一个复数类模板Complex,其数据成员real和image的类型未知,定义相应的成员函数,包括构造函数、输出复数值的函数、求复数和的函数和求复数差的函数,主函数中定义模板类对象,分别以int和double实例化类型参数。 参考程序: #include / 编译预处理命令 using namespace std; / 使用命名空间std / 声明复数类模板 template class Complex private: / 数据成员 ElemType real; / 实部 ElemType image; / 虚部 public: / 公有函数 Complex(ElemType r = 0, ElemType i = 0): real(r), image(i) void Show() const; / 输出复数 static Complex Add(const Complex , template void Complex:Show() const / 输出复数 if (image Complex Complex:Add(const Complex / 返回复数 , int main() / 主函数main() Complex z1(2, 3), z2(6, -5), z3; / 定义复数对象 z1.Show(); / 输出z1 z2.Show(); / 输出z2 z3 = Complex:Add(z1, z2); / z3=z1+z2 z3.Show(); / 输出z3 z3 = Complex:Sub(z1, z2); / z3=z1-z2 z3.Show(); / 输出z3 Complex z4(2.1, 3.8), z5(6.8, -5.1), z6;/ 定义复数对象 z4.Show(); / 输出z4 z5.Show(); / 输出z5 z6 = Complex:Add(z4, z5); / z6=z4+z5 z6.Show(); / 输出z3 z6 = Complex:Sub(z4, z5); / z6=z4-z5 z6.Show(); / 输出z6 system(“PAUSE“); / 调用库函数system( ),输出系统提示信息 return 0; / 返

温馨提示

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

评论

0/150

提交评论