




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C+面向对象程序设计教程第1章 C+程序设计基础习题解答 第1页第1页一、选择题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是常量指针,已在申明时进行了初始化。
2、答案:B第2页第2页2关于函数重载,以下叙述中错误是 。A)重载函数函数名必须相同B)重载函数必须在参数个数或类型上有所不同C)重载函数返回值类型必须相同D)重载函数函数体能够有所不同解析:函数重载是用同一个函数名字在不同参数类型或参数个数上做类似操作方作,它们实现方法能够不同。因此说,重载函数函数名必须相同,函数体能够有所不同。函数重载必须在参数类型或参数个数上不同,不能依靠返回值不同来区分重载函数。答案:C第3页第3页3有下列程序:void Fun(int i, int j)cout i + j endl;/ 输出i+jvoid Fun(int i)cout i+ endl;/ 输出i+i
3、nt main()/ 主函数main()int a = 1;/ 定义变量iFun(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第4页第4页二、编程题 1编写一个C+程序,要求输出“欢迎学习C+语言!”。参考程序:#include / 编译预处理命令using namespace std;/ 使用命名空间std int ma
4、in()/ 主函数main() cout 欢迎学习C+语言! endl;/ 用C+办法输出一行system(PAUSE);/ 调用库函数system( ),输出提醒信息return 0; / 返回值, 返回操作系统第5页第5页*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+)/ 依次比
5、较求最小值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; / 返回值, 返回操作系统第6页第6页3求2个数或3个整数中最大数,用两个同名函数实现,要求编写测试程序。 参考程序:#include / 编译预处理命令using namespace std
6、;/ 使用命名空间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( ),输出
7、提醒信息return 0; / 返回值, 返回操作系统第7页第7页4用变量引用作函数形参,实现互换两个整型变量,要求编写测试程序。 参考程序:#include / 编译预处理命令using namespace std;/ 使用命名空间std void Swap(int &x, int &y)/ 互换x,y值int t = x; x = y; y = t;/ 循环赋值互换x,y值int main()/ 主函数main()int x = 1, y = 6;cout 互换前: x , y endl;Swap(x, y);cout 互换后: x , y endl;system(PAUSE);/ 调用库
8、函数system( ),输出系统提醒信息return 0; / 返回值, 返回操作系统第8页第8页*5编一个程序,用同一个函数名对n个数据进行从小到大排序,数据类型能够是整型、单精度实型、双精度实型,用重载函数实现。参考程序:#include / 编译预处理命令using namespace std;/ 使用命名空间std void Sort(int a, int n)/ 对a0.an-1进行排序int tem, i, j;/ 定义变量for (i = 0; i n- 1; i+)for (j = i + 1; j aj)/ ai比aj更大tem = ai; ai = aj; aj = tem
9、; 第9页第9页*5编一个程序,用同一个函数名对n个数据进行从小到大排序,数据类型能够是整型、单精度实型、双精度实型,用重载函数实现。参考程序:void Sort(float a, int n)/ 对a0.an-1进行排序float tem;/ 暂时变量int i, j;/ 定义变量for (i = 0; i n- 1; i+)for (j = i + 1; j aj)/ ai比aj更大tem = ai; ai = aj; aj = tem;第10页第10页*5编一个程序,用同一个函数名对n个数据进行从小到大排序,数据类型能够是整型、单精度实型、双精度实型,用重载函数实现。参考程序:void
10、Sort(double a, int n)/ 对a0.an-1进行排序double tem;/ 暂时变量int i, j;/ 定义变量for (i = 0; i n- 1; i+)for (j = i + 1; j aj)/ ai比aj更大tem = ai; ai = aj; aj = tem;第11页第11页*5编一个程序,用同一个函数名对n个数据进行从小到大排序,数据类型能够是整型、单精度实型、双精度实型,用重载函数实现。参考程序:int main()/ 主函数main()int a = 1, 3, 2, 5, 6, 9, 0, 6;/ 定义afloat b = 1.6, 3.3, 2.8
11、, 5.6, 6.8, 9.6, 0.6, 6.8;/ 定义bdouble c = 1.2, 3.1, 2.6, 5.8, 6.8, 9.8, 0.8, 6.2;/ 定义cint i, n = 8;/ 定义变量Sort(a, n);/ 对a排序cout a:;/ 输出提醒for (i = 0; i n; i+)cout ai ;/ 输出aicout endl;/ 换行第12页第12页*5编一个程序,用同一个函数名对n个数据进行从小到大排序,数据类型能够是整型、单精度实型、双精度实型,用重载函数实现。参考程序:Sort(b, n);/ 对b排序cout b:;/ 输出提醒for (i = 0;
12、i n; i+)cout bi ;/ 输出bicout endl;/ 换行Sort(c, n);/ 对c排序cout c:;/ 输出提醒for (i = 0; i n; i+)cout ci ;/ 输出cicout endl;/ 换行system(PAUSE);/ 调用库函数system( ),输出系统提醒信息return 0; / 返回值, 返回操作系统第13页第13页C+面向对象程序设计教程第2章 类和对象习题解答 第14页第14页一、选择题1以下选项中,不属于面向对象程序设计特性是 。A)继承性B)多态性C)类比性D)封装性解析:封装性、继承性和多态性是面向对象思想3个主要特性。封装性指
13、将数据和算法捆绑成一个整体,这个整体就是对象,描述对象数据被封装在其内部。继承性是指一个事物保留了另一个事物全部特性,而且含有本身独有特性。多态性主要指当多个事物继承自一个事物时,同一操作在它们之间表现出不同行为。答案:C第15页第15页2在面向对象办法中,实现信息隐蔽是依托 。A)对象继承B)对象多态C)对象封装D)对象分类解析:在面向对象办法中,封装性是指将数据和算法捆绑成一个整体,这个整体就是对象,描述对象数据被封装在内部,只能够通过对象提供算法来进行操作,从而实现信息隐蔽。答案:C第16页第16页3下列关于类和对象叙述中,错误是 。A)一个类只能有一个对象B)对象是类详细实例C)类是某
14、一类对象抽象D)类和对象关系就像数据类型和变量关系解析:在面向对象设计中,类是同一个对象抽象,而不只是对一个对象抽象,一个类含有多个对象。对象是类详细实例。就像数据类型和变量关系,一个数据类型能够定义多个变量,一个变量却只能是一个数据类型。答案:A第17页第17页4有下列类申明:class MyClass int num; ;则MyClass类组员num是 。A)公有数据组员B)公有组员函数C)私有数据组员D)私有组员函数解析:函数申明时,函数名后必须带“”,因此num是数据组员。在类中,当没有用访问权限标识符标识时,默认为私有权限。答案:C第18页第18页5在下列函数原型中,能够作为类AA结
15、构函数是 。A)void AA(int);B)int AA();C)AA(int) const D)AA(int);解析:结构函数用于初始纶对象数据组员,没有返回类型,并且由于常组员函数不能更新对象数据组员,因此常组员函数也不也许作为结构函数。答案:D第19页第19页6下列关于this指针叙述中,正确是 。A)任何与类相关函数都有this指针B)类组员函数都有this指针C)类友元函数都有this指针D)类非静态组员函数才有this指针解析:this指针只能在类组员函数中使用,它指向该组员函数被调用对象。但是有两种与类相关函数都没有this指针,即静态组员函数和友元函数。答案:D第20页第20
16、页7有下列程序:class Testprivate:static int n;/ 静态组员public:Test() n += 2; / 结构函数Test() n -= 3; / 析构函数static int GetNum() return n; / 返回n; int Test:n = 1;/ 初始化nint main()/ 主函数main()Test *p = new Test;/ 定义指针pdelete p;/ 释放p指向动太对象cout n= Test:GetNum() endl;/ 输出nreturn 0; / 返回值0, 返回操作系统执行后输出结果是 。A)n=0 B)n=1 C)n
17、=2 D)n=3解析:静态数据组员初始化值为1,执行“Test *p = new Test”将调用结构函数,执行“n += 2;”,n值变为3,执行“delete p;”时将调用析构函数,执行“n -= 3;”,n值减3,变为0。答案:A第21页第21页8有下列程序:class MyClassprivate:int n;/ 数据组员public:MyClass(int k): n(k)/ 结构函数int Get() return n; / 返回nint Get() const return n + 1; / 返回n+1;int main()/ 主函数main()MyClass a(5);/ 定
18、义对象aconst MyClass b(6);/ 定义对象bcout 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第22页第22页9由于常对象不能被更新,因此 。A)通过常对象只能调用它常组员函数B)通过常对象只能调用静态组员函数C)常对象
19、组员都是常组员D)通过常对象能够调用任何不改变对象值组员函数解析:通过常对象只能调用类中常组员函数,而不能调用类中其它组员函数。答案:A第23页第23页10下列情况中,不会调用复制结构函数是 。A)用一个对象去初始化同一类另一个新对象时B)将类一个对象赋予该类另一个对象时C)函数形参是类对象,调用函数进行形参和实参结合时D)函数返回值是类对象引用,函数执行返回调用时解析:只要在程序执行中,需要用一个对象来初始化另一个对象,都要调用复制结构函数,包括A、B、C三种情况。答案:D第24页第24页11下列关键字不能用来申明类访问权限是 。A)public B)static C)protected D
20、)private解析:类访问权限有三种:公有、私有、保护,关键字分别是public,private,protected,。static用于静态组员申明。答案:B第25页第25页12有下列程序:class MyClasspublic: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;/ 换行re
21、turn 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第26页第26页13有下列程序:class Testpublic:static int a;/ 静态组员void Init() a =
22、1; / 初始化函数Test(int a = 6) Init(); a+;/ 结构函数;int Test:a = 0;/ 初始化aTest obj;/ 定义全局对象int main()/ 主函数main()cout obj.a endl;/ 输出areturn 0; / 返回值0, 返回操作系统运营时输出结果是 。A)0 B)1 C)2 D)3解析:首先初始化静态数据组员a为0,然后在定义全局对象obj时调用结构函数。这时有两个a,一个是“Test(int a = 6) Init(); a+;”函数中局部变量a,另一个是静态数据组员a,需要靠作用域来区别。在执行Init()时,由于离开了结构函
23、数“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第27页第27页14有下列程序:class Testprivate:long x;/ 私有数据组员public:Test(long a): x(a) / 结构函数friend long Fun(Test s);/ 友元;long Fun(Test s)if
24、(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;/ 输出sumreturn 0; / 返回值0, 返回操作系统运营后输出结果是 。A)120 B)16 C)154 D)34解析:友元函数Fun()参数表中对象在初始化时需执行结构函数“Test:Test(long a)”,调用过程为:先调用结构函数Test(
25、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第28页第28页15有下列程序:class Testprivate:int a;/ 数据组员public:Test() cout 无参结构函数 endl; / 无参结构函数Test(int a) cout a endl; / 带
26、参结构函数Test(const Test ©): a(copy.a) / 复制结构函数 cout 复制结构函数 endl; Test() cout 析构函数 endl; / 析构函数;int main()/ 主函数main()Test a(3);/ 定义对象return 0; / 返回值0, 返回操作系统运营时输出结果是 。A)3 B)无参结构函数C)复制结构函数D)3 析构函数 析构函数 析构函数解析:创建对象a时带有参数3,故调用结构函数Test( int a),输出3并换行;程序结束时调用析构函数Test(),输出“析构函数”并换行。答案:D 第29页第29页16有下列程序:cl
27、ass MyClassprivate: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, 返回操作系统程序输出结果是 。
28、A)n=10 const:n=20B)const:n=10 const:n=20C)const:n=10 n=20D)n=10 n=20解析:依据const修饰符选择相应结构函数,objl为常对象,调用常组员函数,输出“const:n=10 ”,obj2为普通对象,调用优先调用非常组员函数,输出“n=20 ”。答案:C第30页第30页二、填空题 1在面向对象办法中, 描述是含有相同属性与操作一组对象。 解析:在面向对象设计中,一个对象是由一些属性和操作构成。对象属性描述了对象内部细节。类是含有相同属性和操作一组对象集合,它为属于该类所有对象提供统一抽象描述。答案:类 第31页第31页2非组员函
29、数应申明为类 函数才干访问这个类private组员。 解析:类含有数据封装和隐藏特性,通常只有类组员函数才干访问类私有组员,外部函数只能访问类公有组员。但在一些情况下,需要在类外部访问类私有组员,这时必须依托引入友元来实现。答案:友元 第32页第32页3下列程序输出结果为:01试将程序补充完整。class Pointprivate:int x, y;/ 坐标static int count;/ 静态数据组员public:Point(int m = 0, int n = 0): x(m), y(n) count+; / 结构函数Point() count-; / 析构函数int GetX() c
30、onst return x; / 返回xint GetY() const return y; / 返回ystatic void ShowCount() cout count endl; / 输出count; / 静态数据组员初始化int main()/ 主函数main()Point:ShowCount();/ 输出countPoint a(6, 8);/ 定义对象Point:ShowCount();/ 输出countsystem(“PAUSE”); / 调用库函数system( ),输出提醒信息return 0; / 返回值0, 返回操作系统。 解析:由第一次调用GetCount()函数输出c
31、ount值为0可知,应将其初始化为0,再依据静态数据组员初始化格式:类型 类名:静态组员名字 = 值; 可得横线处填写语句。答案:int Point:count = 0;第33页第33页4有下列类申明:class MyClassint i;private:int j;protected:int k;public:int m, n;其中私有组员数量是 。解析:在用class申明类组员申明中,假如没有标识组员访问权限,则默认为私有访问权限,故i为私有访问权限。答案:2 第34页第34页5有下列程序:class Integerprivate:int n;/ 数据组员public:Integer(in
32、t n = 0) = n; / 结构函数void Show() const cout n n 或 Integer : n 第35页第35页6有下列程序:class Apublic: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”;释放动态对象时
33、,调用A析构函数,输出“A”。答案:AA 第36页第36页三、编程题1定义一个满足下列要求Date类。(1)用下面格式输出日期:年-月-日(2)设置日期。并编出应用程序,定义日期对象,设置日期,输出该对象提供日期。参考程序:#include / 编译预处理命令using namespace std;/ 使用命名空间std class Dateprivate:/ 数据组员int year;/ 年int month;/ 月int day;/ 日第37页第37页1定义一个满足下列要求Date类。(1)用下面格式输出日期:年-月-日(2)设置日期。并编出应用程序,定义日期对象,设置日期,输出该对象提供
34、日期。参考程序:public:/ 公有函数Date(int y = , 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(, 6, 18);/ 设置日期d.Show();/ 显示日期syste
35、m(PAUSE);/ 调用库函数system( ),输出提醒信息return 0; / 返回值, 返回操作系统第38页第38页2定义一个时间类Time,能提供和设置由时、分、秒构成时间,并编出应用程序,定义时间对象,设置时间,输出该对象提供时间。 参考程序:#include / 编译预处理命令using namespace std;/ 使用命名空间std class Timeprivate:/ 数据组员int hour;/ 时int minute;/ 分int second;/ 秒public:/ 公有函数Time(int h = 0, int m = 0, int s = 0):/ 结构函数
36、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; / 返回值, 返回
37、操作系统第39页第39页*3编写设计一个People(人)类。该类数据组员有姓名(name)、年龄(age)、身高(height)、体重(weight)和人数(num),其中人数为静态数据组员,组员函数有结构函数(People)、进食(Eatting)、运动(Sporting)、显示(Show)和显示人数(ShowNum)。其中结构函数由已知参数姓名(nm)、年龄(a)、身高(h)和体重(w)结构对象,进食函数使体重加1,运动函数使身高加1,显示函数用于显示人姓名、年龄、身高、体重,显示人数函数为静态组员函数,用于显示人数。假设年龄单位为岁,身高单位为厘米,体重单位为市斤,要求所有数据组员为p
38、rivate访问权限,所有组员函数为public访问权限,在主函数中定义若干个对象,通过对象直接访问类所有非静态组员函数,通过类访问静态组员函数。参考程序:#include / 编译预处理命令using namespace std;/ 使用命名空间std class Peopleprivate:/ 数据组员char name9;/ 姓名int age;/ 年龄int height;/ 身高double weight;/ 体重static int num;/ 人数第40页第40页public:/ 公有函数People(char nm = 无名氏, int a = 16, int h = 168,
39、 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
40、; ;int People:num = 0;/ 初始化静态数据组员num 第41页第41页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; / 返回值, 返回操作系统第42页第42页*4定义一个描述员工(Employee)基本情况类,
41、数据组员包括编号(num)、姓名(name)、性别(sex)、工资(wage)、人数(count)、总工资(totalWage)。其中姓名定义为长度为18字符数组,性别为为长度为3字符数组,其它数据组员类型为整型,总工资和人数为静态数据组员,函数组员包括结构函数、显示基本数据函数(ShowBase)和显示静态数据函数(ShowStatic),其中结构函数由已知参数编号(nu) 、姓名(nm) 、性别(sx)和工资(wg)结构对象,显示基本数据函数用于显示学生编号、姓名、性别和工资,显示静态数据函数为静态组员函数,用于显示人数和总工资;要求所有数据组员为protected访问权限,所有组员函数为
42、public访问权限,在主函数中定义若干个员工对象,分别显示员工基本信息,以及显示员工人数和总工资。 参考程序:#include / 编译预处理命令using namespace std;/ 使用命名空间std class Employeeprotected:/ 数据组员int num;/ 编号char name18;/ 姓名char sex3;/ 姓名int wage;/ 工资static int count;/ 人数static int totalWage;/ 总工资第43页第43页public:/ 公有函数Employee(int nu, char nm, char sx, int wg
43、): 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:c
44、ount = 0;/ 初始化静态数据组员count int Employee:totalWage = 0;/ 初始化静态数据组员totalWage第44页第44页int main()/ 主函数main()Employee e1(1008, 李杰, 男, 2680);/ 定义对象e1.ShowBase();/ 显示基本数据Employee e2(1009, 李敏, 女, 2860);/ 定义对象e2.ShowBase();/ 显示基本数据e2.ShowStatic();/ 显示静态数据system(PAUSE);/ 调用库函数system( ),输出系统提醒信息return 0; / 返回值,
45、返回操作系统第45页第45页C+面向对象程序设计教程第3章 模板习题解答第46页第46页一、选择题 1下列关于模板叙述中,错误是 。A)模板申明中第一个符号总是关键字templateB)在模板申明中用“”和“”括起来部分是模板类型形参表C)类模板不能有数据组员D)在一定条件下函数模板类型实参能够省略解析:由模板申明格式可知选项A、B正确。在调用模板函数时,假如编译系统从模板函数类型实参表中得到信息已经能够判断部分或所有虚拟类型参数所相应实际类型,并且它们又正好是模板形参中最后若干个参数,则在模板类型实参表中能够省略这几种参数,选项D正确。类模板中能够有数据组员,数据组员类型能够是虚拟类型,也能
46、够是详细类型,选项C错误。答案:C第47页第47页2有下列函数模板定义:template ElemType Fun(const ElemType &x, const ElemType &y) return x * x + y * y; 在下列对Fun()调用中,错误是 。A)Fun(3, 5);B)Fun(3.0, 5.5);C)Fun(3, 5.5);D)Fun(3, 5.5);解析:当从模板函数类型实参表取得信息有矛盾时,模板类型实参不能省略。比如选项C中,编译系统从第一个参数3取得信息是ElemType相应于int,而从第二个参数5.5处取得信息是ElemType相应于double,两者
47、互相矛盾,因此,编译时将产生错误。处理办法之一是显式给出虚拟类型参数ElemType相应模板类型实参,强制ElemType相应于int。答案:C第48页第48页3关于关键字class和typename,下列表述中正确是 。A)程序中typename都能够替换为classB)程序中class都能够替换为typenameC)在模板类型形参表中只能用typename来申明参数类型D)在模板类型形参表中只能用class或typename来申明参数类型解析:程序中typename都能够替换为class,但程序中class不能够所有替换为typename。比如:在“模板类型形参表”中,关键字typenam
48、e和class是能够互换;但是在“类模板名”前关键字class代表含义是类,不能够用typename代替,选项B错误。在模板类型形参表中除了typename和class以外也能够用常规类型来申明参数类型,选项C、D错误。答案:A 第49页第49页4有下列函数模板:template ElemType Square(const ElemType &x) return x * x; 其中ElemType是 。A)函数形参B)函数实参C)模板类型形参D)模板类型实参解析:由函数模板定义可知ElemType为模板类型形参。答案:C 第50页第50页5C+中模板包括 。A)对象模板和函数模板B)对象模板和
49、类模板C)函数模板和类模板D)变量模板和对象模板解析:C+语言通过模板提供了一个将类型参数化机制,其中包括函数模板和类模板。答案:C 第51页第51页二、填空题 1已知一个函数模板申明以下:template T1 Fun(T2 n) return n * 5.0; 若要求以int型数7为函数实参调用该模板函数,并返回一个double型数,则该调用应表示为 。 解析:当虚拟类型类型参数作为函数返回值类型,而函数返回值类型与函数参数类型能够不同时,不论函数类型实参类型是什么,均不能省略模板类型实参,此题模板类型实参应为。答案:Fun(7)第52页第52页2已知int dbl(int n ) ret
50、urn n + n; 和long dbl(long n) return n + n; 是一个函数模板两个实例,则该函数模板申明是template 解析:将类型int和long参数化,用模板类型参数ElemType代替,可得该函数模板。答案:ElemType Dbl(ElemType n ) return n + n; 第53页第53页3下面程序运行结果是 。template ElemType Min(const ElemType &a, const ElemType &b)/ 求a,b最小值if (a b) return a;/ a更小else return b;/ b更小int main()
51、/ 主函数main()int n1 = 4, n2 = 5;/ 定义整型变量double d1 = 0.35, d2 = 4.4;/ 定义实型变量cout 最小整数= Min(n1, n2) , 最小实型= Min(d1, d2) endl;/ 输出信息system(PAUSE); / 调用库函数system( ),输出系统提醒return 0; / 返回值0, 返回操作系统 解析:模板函数Min()依据调用它实参类型不同,生成不同函数版本,比如,返回两个int型数最小值或返回两个double型数最小值。答案:最小整数=4,最小实型=0.35第54页第54页三、编程题 1试使用函数模板实现输出
52、一个数组各元素值,要求编写测试程序。 参考程序:#include / 编译预处理命令using namespace std;/ 使用命名空间std template void Display(ElemType a, int n)/ 输出数组a各元素之值for (int i = 0; i n; i+)cout ai ;/ 输出aicout endl;/ 换行int main()/ 主函数main()int a = 1, 2, 3, 4, 5, 6, 7, 8, 9;/ 定义数组Display(a, 9);/ 输出asystem(PAUSE);/ 调用库函数system( ),输出系统信息retu
53、rn 0; / 返回值, 返回操作系统第55页第55页2编写一个复数类模板Complex,其数据组员real和image类型未知,定义相应组员函数,包括结构函数、输出复数值函数、求复数和函数和求复数差函数,主函数中定义模板类对象,分别以int和double实例化类型参数。 参考程序:#include / 编译预处理命令using namespace std;/ 使用命名空间std / 申明复数类模板template class Complexprivate:/ 数据组员ElemType real;/ 实部ElemType image;/ 虚部public:/ 公有函数Complex(ElemT
54、ype r = 0, ElemType i = 0): real(r), image(i) void Show() const;/ 输出复数static Complex Add(const Complex &z1, const Complex &z2); static Complex Sub(const Complex &z1, const Complex &z2);第56页第56页template void Complex:Show() const/ 输出复数if (image 0) cout real image i endl;/虚部为负,比如-5ielse if (image = 0)
55、cout real endl;/ 虚部为0,比如3else cout real “+” image “i” endl;/ 虚部为正,比如+5itemplate Complex Complex:Add(const Complex &z1,const Complex &z2)/ 复数加法 Complex z(z1.real + z2.real, z1.image + z2.image);/ 定义复数对象return z;/ 返回复数template Complex Complex:Sub(const Complex &z1,const Complex &z2)/ 复数减法 Complex z(z1
56、.real - z2.real, z1.image - z2.image);/ 定义复数对象return z;/ 返回复数第57页第57页int main()/ 主函数main()Complex z1(2, 3), z2(6, -5), z3;/ 定义复数对象z1.Show();/ 输出z1z2.Show();/ 输出z2z3 = Complex:Add(z1, z2);/ z3=z1+z2z3.Show();/ 输出z3z3 = Complex:Sub(z1, z2);/ z3=z1-z2z3.Show();/ 输出z3Complex z4(2.1, 3.8), z5(6.8, -5.1),
57、 z6;/ 定义复数对象z4.Show();/ 输出z4z5.Show();/ 输出z5z6 = Complex:Add(z4, z5);/ z6=z4+z5z6.Show();/ 输出z3z6 = Complex:Sub(z4, z5);/ z6=z4-z5z6.Show();/ 输出z6system(PAUSE);/ 调用库函数system( ),输出系统提醒信息return 0; / 返回值, 返回操作系统第58页第58页*3编写一个使用数组类模板Array对数组求最大值和求元素和程序,要求编写出测试程序。 参考程序:#include / 编译预处理命令using namespace s
58、td;/ 使用命名空间std / 申明数组类模板template class Arrayprivate:/ 数据组员ElemType *elem;/ 存储数据元素值int size;/ 数组元素个数public:/ 公有函数Array(int sz): size(sz) elem = new ElemTypesize; / 结构函数Array() delete elem; / 析构函数void SetElem(ElemType e, int i);/ 设置元素值ElemType GetElem(int i) const;/ 求元素值ElemType Max() const;/ 求最大值Elem
59、Type Sum() const;/ 求元素之和;第59页第59页template void Array:SetElem(ElemType e, int i)/ 设置元素值 if (i = size)cout 元素位置错! endl;exit(1);/ 退出程序运营,返回到操作系统elemi = e;/ 设置元素值为etemplate ElemType Array:GetElem(int i) const/ 求元素值 if (i = size)cout 元素位置错! endl;exit(2);/ 退出程序运营,返回到操作系统return elemi;/ 返回元素值elemi第60页第60页te
60、mplate ElemType Array:Max() const/ 求最大值ElemType m = elem0;/ 设elem0最大for (int i = 1; i m) m = elemi;/ 依次比较求最大值return m;/ 返回最大值template ElemType Array:Sum() const/ 求元素之和ElemType s = 0;/ 定义变量for (int i = 1; i size; i+)s = s + elemi;/ 依次求和return s;/ 返回和第61页第61页int main()/ 主函数main()int a = 1, 9, 7, 5, 6,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- VB调试技巧试题及答案解析
- 气象电力服务合作协议
- 灯饰照明行业新年个人工作计划
- 提升员工忠诚度的策略计划
- 【通辽】2025年内蒙古通辽市扎鲁特旗教体系统事业单位招聘工作人员30人笔试历年典型考题及考点剖析附带答案详解
- 2025市区办公室租赁合同范本
- 网络管理员基础知识试题及答案资源
- 企业管理中的风险评估实践与应用试题及答案
- 2025年软件设计师行业发展趋势试题及答案
- 行政法学重要实例分析试题及答案
- 行政审批电子监察系统简介
- 东芝空调用户使用手册
- 全国卷高考标准语文答题卡作文纸3栏800字版
- DB32T 4284-2022 居民住宅二次供水工程技术规程
- 放射性物品道路运输申请表样表
- 110kV变电站高压试验报告完整版
- 山东大学《概率论与数理统计》期末试题及答案
- TSG Z7001-2004 特种设备检验检测机构核准规则
- 入学、幼儿园等健康卫生教育洗手知识教育ppt课件
- JJF(鄂) 82-2021 全自动混凝土抗渗仪校准规范(高清版)
- 流动注射分析仪常见问题解决方案.
评论
0/150
提交评论