资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,C+,面向对象程序设计教程,第,1,章,C+,程序设计基础,习题解答,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,是常量指针,已在声明时进行了初始化。,答案:,B,2,2,关于函数重载,下列叙述中错误的是,。,A,)重载函数的函数名必须相同,B,)重载函数必须在参数个数或类型上有所不同,C,)重载函数的返回值类型必须相同,D,)重载函数的函数体可以有所不同,解析:,函数重载是用同一个函数名字在不同的参数类型或参数个数上做类似的操作方作,它们的实现方法可以不同。所以说,重载函数的函数名必须相同,函数体可以有所不同。函数重载必须在参数类型或参数个数上不一样,不能依靠返回值不一样来区分重载函数。,答案:,C,3,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,4,二、编程题,1,编写一个,C+,程序,要求输出“欢迎学习,C+,语言,!”,。,参考程序,:,#include /,编译预处理命令,using namespace std;/,使用命名空间,std,int main()/,主函数,main(),cout ,欢迎学习,C+,语言,!endl;/,用,C+,的方法输出一行,system(PAUSE);/,调用库函数,system(),,输出提示信息,return 0;/,返回值,返回操作系统,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+),/依次比较求最小值,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)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;/返回值,返回操作系统,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);/调用库函数system(),输出系统提示信息,return 0;/返回值,返回操作系统,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,*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,*5,编一个程序,用同一个函数名对,n,个数据进行从小到大排序,数据类型可以是整型、单精度实型、双精度实型,用重载函数实现。,参考程序,:,void 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,*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;/换行,12,*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;/返回值,返回操作系统,13,C+,面向对象程序设计教程,第,2,章 类和对象,习题解答,14,一、选择题,1,下列选项中,不属于面向对象程序设计特征的是,。,A,)继承性,B,)多态性,C,)类比性,D,)封装性,解析:,封装性、继承性和多态性是面向对象思想的,3,个主要特征。封装性指将数据和算法捆绑成一个整体,这个整体就是对象,描述对象的数据被封装在其内部。继承性是指一种事物保留了另一种事物的全部特征,并且具有自身的独有特征。多态性主要指当多个事物继承自一种事物时,同一操作在它们之间表现出不同的行为。,答案:,C,15,2,在面向对象方法中,实现信息隐蔽是依靠,。,A,)对象的继承,B,)对象的多态,C,)对象的封装,D,)对象的分类,解析:,在面向对象方法中,封装性是指将数据和算法捆绑成一个整体,这个整体就是对象,描述对象的数据被封装在内部,只可以通过对象提供的算法来进行操作,从而实现信息隐蔽。,答案:,C,16,3,下列关于类和对象的叙述中,错误的是,。,A,)一个类只能有一个对象,B,)对象是类的具体实例,C,)类是某一类对象的抽象,D,)类和对象的关系就像数据类型和变量的关系,解析:,在面向对象设计中,类是同一种对象的抽象,而不只是对一个对象的抽象,一个类具有多个对象。对象是类的具体实例。就像数据类型和变量的关系,一种数据类型可以定义多个变量,一个变量却只能是一种数据类型。,答案:,A,17,4,有以下类声明:,class MyClass int num;,则,MyClass,类的成员,num,是,。,A,)公有数据成员,B,)公有成员函数,C,)私有数据成员,D,)私有成员函数,解析:,函数声明时,函数名后必须带“”,所以,num,是数据成员。在类中,当没有用访问权限标识符标识时,默认为私有权限。,答案:,C,18,5,在下列函数原型中,可以作为类,AA,构造函数的是,。,A,),void AA(int);B,),int AA();,C,),AA(int)const D,),AA(int);,解析:,构造函数用于初始纶对象的数据成员,没有返回类型,而且由于常成员函数不能更新对象的数据成员,所以常成员函数也不可能作为构造函数。,答案:,D,19,6,下列关于,this,指针的叙述中,正确的是,。,A,)任何与类相关的函数都有,this,指针,B,)类的成员函数都有,this,指针,C,)类的友元函数都有,this,指针,D,)类的非静态成员函数才有,this,指针,解析:,this,指针只能在类的成员函数中使用,它指向该成员函数被调用的对象。但是有两种与类相关的函数都没有,this,指针,即静态成员函数和友元函数。,答案:,D,20,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,21,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,22,9,由于常对象不能被更新,因此,。,A,)通过常对象只能调用它的常成员函数,B,)通过常对象只能调用静态成员函数,C,)常对象的成员都是常成员,D,)通过常对象可以调用任何不改变对象值的成员函数,解析:,通过常对象只能调用类中的常成员函数,而不能调用类中的其他成员函数。,答案:,A,23,10,下列情况中,不会调用复制构造函数的是,。,A,)用一个对象去初始化同一类的另一个新对象时,B,)将类的一个对象赋予该类的另一个对象时,C,)函数的形参是类的对象,调用函数进行形参和实参结合时,D,)函数的返回值是类的对象的引用,函数执行返回调用时,解析:,只要在程序的执行中,需要用一个对象来初始化另一个对象,都要调用复制构造函数,包括,A,、,B,、,C,三种情况。,答案:,D,24,11,以下关键字不能用来声明类的访问权限的是,。,A,),public B,),static,C,),protected D,),private,解析:,类的访问权限有三种:公有、私有、保护,关键字分别是,public,,,private,,,protected,。,static,用于静态成员的声明。,答案:,B,25,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,26,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,27,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,28,15,有以下程序:,class Test,private:,int a;/,数据成员,public:,Test()cout ,无参构造函数,endl;/,无参构造函数,Test(int a)cout a endl;/,带参构造函数,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,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=20B,),const:n=10 const:n=20,C,),const:n=10 n=20D,),n=10 n=20,解析:,根据,const,修饰符选择对应的构造函数,,objl,为常对象,调用常成员函数,输出“,const:n=10”,,,obj2,为一般对象,调用优先调用非常成员函数,输出“,n=20”,。,答案:,C,30,二、填空题,1,在面向对象方法中,,描述的是具有相同属性与操作的一组对象。,解析:,在面向对象设计中,一个对象是由一些属性和操作构成的。对象的属性描述了对象的内部细节。类是具有相同属性和操作的一组对象的集合,它为属于该类的所有对象提供统一的抽象描述。,答案:,类,31,2,非成员函数应声明为类的,函数才能访问这个类的,private,成员。,解析:,类具有数据封装和隐藏的特性,通常只有类的成员函数才能访问类的私有成员,外部函数只能访问类的公有成员。但在某些情况下,需要在类的外部访问类的私有成员,这时必须依靠引入友元来实现。,答案:,友元,32,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;,33,4,有以下类声明:,class MyClass,int i;,private:,int j;,protected:,int k;,public:,int m,n;,;,其中私有成员的数量是,。,解析:,在用,class,声明类的成员声明中,如果没有标识成员的访问权限,则默认为私有的访问权限,故,i,为私有访问权限。,答案:,2,34,5,有以下程序:,class Integer,private:,int n;/,数据成员,public:,Integer(int n=0),=n;/,构造函数,void Show()const cout n n,或,Integer:n,35,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,36,三、编程题,1,定义一个满足如下要求的,Date,类。,(,1,)用下面的格式输出日期:,年,-,月,-,日,(,2,)设置日期。,并编出应用程序,定义日期对象,设置日期,输出该对象提供的日期。,参考程序,:,#include,/,编译预处理命令,using namespace std;/,使用命名空间,std,class Date,private:,/,数据成员,int year;/,年,int month;/,月,int day;/,日,37,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;/,返回值,返回操作系统,38,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;/,返回值,返回操作系统,39,*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;/人数,40,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,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,*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;/总工资,43,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,44,int main()/主函数main(),Employee e1(1008,李杰,男,2680);/定义对象,e1.ShowBase();/显示基本数据,Employee e2(1009,李敏,女,2860);/定义对象,e2.ShowBase();/显示基本数据,e2.ShowStatic();/显示静态数据,system(PAUSE);/调用库函数system(),输出系统提示信息,return 0;/返回值,返回操作系统,45,C+,面向对象程序设计教程,第,3,章 模板,习题解答,46,一、选择题,1,下列关于模板的叙述中,错误的是,。,A,)模板声明中的第一个符号总是关键字,template,B,)在模板声明中用“”和“”括起来的部分是模板的类型形参表,C,)类模板不能有数据成员,D,)在一定条件下函数模板的类型实参可以省略,解析:,由模板声明的格式可知选项,A,、,B,正确。在调用模板函数时,如果编译系统从模板函数的类型实参表中得到的信息已经能够判断部分或全部虚拟类型参数所对应的实际类型,而且它们又正好是模板形参中最后的若干个参数,则在模板类型实参表中可以省略这几个参数,选项,D,正确。类模板中可以有数据成员,数据成员的类型可以是虚拟类型,也可以是具体类型,选项,C,错误。,答案,:,C,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,,两者相互矛盾,因此,编译时将产生错误。解决的方法之一是显式给出虚拟类型参数,ElemType,对应的模板类型实参,强制,ElemType,对应于,int,。,答案:,C,48,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,49,4,有以下函数模板:,template,ElemType Square(const ElemType ,其中,ElemType,是,。,A,)函数形参,B,)函数实参,C,)模板类型形参,D,)模板类型实参,解析:,由函数模板的定义可知,ElemType,为模板类型形参。,答案:,C,50,5,C+,中的模板包括,。,A,)对象模板和函数模板,B,)对象模板和类模板,C,)函数模板和类模板,D,)变量模板和对象模板,解析:,C+,语言通过模板提供了一种将类型参数化的机制,其中包括函数模板和类模板。,答案:,C,51,二、填空题,1,已知一个函数模板的声明如下:,template,T1 Fun(T2 n)return n*5.0;,若要求以,int,型数,7,为函数实参调用该模板函数,并返回一个,d
展开阅读全文