第九章关于类和对象的进一步讨论复习题1.关于new运算符的描述,错误的是()A.它可以用来动态创建对象和对象数组B.使用它创建的对象和对象数组可以使用运算符delete删除C.使用它创建对象时要调用构造函数D.使用它创建对象数组时必须指定初始值2.对类的构造函数和析构函数,描述正确的是()A.构造函数可以重载,析构函数不能重载B.构造函数不能重载,析构函数可以重载C.构造函数可以重载,析构函数也可以重载D.构造函数不能重载,析构函数也不能重载3.关于析构函数的描述,错误的是()A.析构函数声明和定义中都不能有形参B.析构函数可以定义为内联函数C.析构函数可以重载D.析构函数可以定义为虚函数4.不是构造函数特征的是()A.构造函数的函数名与类名相同B.构造函数可以重载C.构造函数可以设置缺省参数D.构造函数必须指定类型说明5.有关析构函数的错误的说法是()A.一个类的析构函数有且只有一个B.析构函数无函数类型C.析构函数和构造函数一样,可以有形参D.析构函数的作用是在对象生命期结束时,收回分配给对象的内存空间6.关于友元,说法错误的是()A.友元的关系不能传递B.友元却可以访问其他类中的私有成员C.友元的关系是单向的D.友元的关系是双向的7.类的析构函数的作用是()A.一般成员函数B.类的初始化C.对象的初始化D.删除对象8.关于析构函数的说法,错误的是()A.析构函数是与构造函数作用相反的函数B.析构函数不返回任何值C.析构函数没有函数类型,也没有函数参数D.析构函数可以被重载9.关于构造函数的说法,错误的是()A.在类对象进入其作用域时调用构造函数B.构造函数没有返回值C.不需要在定义构造函数时声明类型D.构造函数可以被用户调用10.引入内联函数的主要目的是()A.缩短程序代码,少占用内存空间B.既可以保证程序的可读性,又能提高程序的运行效率C.占用内存空间少,执行速度快D.使程序的结构比较清晰11.一个类的静态数据成员所表示的属性确切地说()A.是类的或对象的属性B.只是对象的属性C.只是类的属性D.是类和友元的属性12.有如下对象数组定义语句:MyClass*p[10];当对象指针数组p离开它的作用域时,系统自动调用该类析构函数次。013.已知:类A中一个成员函数说明如下:voidSet(A&a);其中,A&的含义是()A.指向类A的指针为aB.将a的地址值赋给变量SetC.a是类A对象的引用,用来作函数Set()的参数D.变量A与a按位与作为函数Set()的参数14.重载函数是()A.以函数参数来区分,而不用函数的返回值来区分不同的函数B.以函数的返回值来区分,而不用函数参数来区分不同的函数C.参数表完全相同而返回值类型不同的两个或多个同名函数D.参数表和返回值类型都必须是不同的两个或多个同名函数15.关于构造函数的说法,错误的是()A.构造函数的函数体中可以对数据成员赋初值B.构造函数的函数体中可以包含赋值语句之外的其他语句C.如果用户没有定义构造函数,则C++系统会自动生成一个构造函数D.只能在类内对构造函数进行声明,不能在类外定义构造函数16.关于模板的描述,错误的是()A.函数模板是模板的定义,在编译时生成函数模板的代码B.模板类是实实在在的类的定义,可以定义模板类的对象C.模板类是是类模板的实例化D.模板函数可以进行重载17.在C++中,数据封装要解决的问题是()A.数据的规范化B.便于数据转换C.避免数据丢失D.防止不同模块之间数据的非法访问18.有如下定义语句:MyClass*p;,则执行p=newMyClass;语句时,将自动调用该类的构造函数。执行deletep;语句时,将自动调用该类的。若要把类FriendClass定义为类MyClass的友元类,则应在类MyClass的定义中加入语句_。析构函数friendclassFriendClass19.有如下对象数组定义语句:MyClassp[10];当对象数组p离开它的作用域时,系统自动调用该类析构函数次。1020.有如下定义语句:MyClassp[10],*q;则系统自动调用该类构造函数10次。21.假定用户没有给一个名为MyClass的类定义析构函数,则系统为其定义的默认析构函数形式为。~MyClass()22.类中的构造函数是一个特殊的成员函数,它由类的对象自动调用,它的作用是。进行初始化23.假定用户没有给一个名为MyClass的类定义析构函数,则系统为其定义的默认析构函数形式为。24.~MyClass()24.在定义类的对象时,C++程序将自动调用该对象的函数初始化对象自身。25.构造26.在C++语言中,每个类都有一个隐含的指针叫做指针。该指针指向正在调用成员函数的对象。26.this27.非成员函数应声明为类的才能访问这个类的private成员。友元函数28.类中的构造函数是一个特殊的成员函数,它由类的对象调用,它的作用是进行初始化。自动29假定用户没有给一个名为MyClass的类定义析构函数,则系统为其定义的默认析构函数形式为。~Myclass()30.非成员函数应声明为类的才能访问这个类的protected成员。友元函数31.在面向对象的程序设计中,通过实现数据隐藏;通过继承实现代码的复用。函数名重载是指同一作用域内的多个函数使用相同的函数名,这些同名函数通过它们的进行区分。.封装不同的参数表32.在定义类的对象时,C++程序将自动调用该对象的函数。类中构造函数可以有一个或多个,析构函数最多有个。构造一个33.下列程序在构造函数和析构函数中申请和释放类的私有成员指向的堆空间,请完成该类的实现。ClassMyClass{public:~MyClass();private:int*X;};MyClass::MyClass(inta){;}MyClass::~Myclass(){;}34.MyClass(inta);X=newint(a)deleteX34.下面的类定义了拷贝初始化构造函数,请完成该类的定义和实现。ClassMyClass{public:MyClass(intxx=0,intyy=0){X=xx;Y=yy;}_______________;//拷贝初始化构造函数身明private:intX,Y;};MyClass::MyClass(MyClass&p){//拷贝初始化构造函数的实现X=_______________;_______________;}MyClass(MyClass&p)p.XY=p.Y35.在下面程序的横线处填上适当的语句,使运行该程序执行结果为10。classMyClass{pub1ic://为x置值//取x值private:intx;};voidmain(){Myclassmy(10);coutmy.GetNum()endl;}33.#includeiostream.hMyClass(inta){x=a;}intGetNum(){returnx;}36.仔细阅读程序,在题后写出其运行结果。#includeiostream.hclassB{public:B(){coutB::B()called.\n;}B(inti){b=i;coutB::B(i)called.\n;}virtualvoidvirfun(){coutB::virfun()called.\n;}private:intb;};classD:publicB{public:D(){coutD::D()called.\n;}D(inti,intj):B(i){d=j;coutD::D(i,j)called.\n;}private:intd;voidvirfun(){coutD::virfun()called.\n;}};voidfun(B*obj){obj-virfun();}voidmain(){D*pd=newD;fun(pd);deletepd;}运行结果:B::B()called.(1分)D::D()called.(2分)D::virfun()called.(2分)37.仔细阅读程序,在题后写出其运行结果。#includeiostream#includestringusingnamespacestd;classStudent{public:Student(intn){num=n;}~Student(){coutDCendl;}voiddisplay(){coutnum:numendl;}private:intnum;};intmain(){Studentstud1(100);stud1.display();Studentstud2(101);stud2.display();return0;}运行结果:38.num:100(2分)num:101(1分)DC(1分)DC(1分)38.定义一个由y=ax+b确定的直线类Line。该类的构造函数初始化直线,成员函数Print显示该直线方程。友元函数SetPoint()求解两条直线的交点。#includeiostream.hstructPoint{floatx;floaty;}(2分)classLine{public:Line(floatm,f1oatn){a=m;b=n;}(2分)voidPrint(){couty=a*X+”bendl;(2分)}friendPointSetPoint(Line&p,Line&q);(2分)private:f1oata,b;}PointSetPoint(Line&p,Line&q){PointDian;Dian.x=(q.b-p.b)/(p.a-q.a);Dian.y=(p.a*q.b-q.a*p.b)/(p.a-q.a);returnDian;(2分)}39.分析下列程序,写出其运行结果。#includeiostream.h#includestring.htemplateclassTTmax(Ta,Tb){returnab?a:b;}char*max(char*a,char*b){return(strcmp(a,b)?a:b);}voidmain(){coutMax(\Hello\,\Gold\)ismax(Hello,Gold)endl;coutmax(‘a’,’d’)endl;coutmax(97,100)endl;}运行结果:37.Max(“Hello”,”Gold”)isHello(3分)d(1分)100(1分)40.仔细阅读程序,在题后写出其运行结果。#includeiostream.hclassA{public:A(){coutA::A()called.\n;}virtual~A(){coutA::~A()called.\n;}};classB:publicA{public:B(inti){coutB::B()called.\n;buf=newchar[i];}virtual~B(){delete[]buf;coutB::~B()called.\n;}private:char*buf;};voidfun(A*a){deletea;}voidmain(){A*a=newB(15);fun(a);}运行结果:38.A::A()called.(1分)B::B()called.(1分)B::~B()called.(2分)A::~A()called.(1分)41.下面是一个求数组元素之和的程序。主程序中定义并初始化了一个数组,然后计算该数组各元素之和,并输出结果。函数TotalSum计算数组元素之和。请完成下列程序。#includeiostream.h;voidmain(){inta[5]={2,3,6,8,10};;Total=Totalsum(a,5);coutSumofarray:Totalendl;}intTotalsum(intarray[],intlen){;for(