1.
在C++中,关于下列设置缺省参数值的描述中,(B)是正确的。
A、不允许设置缺省参数值;
B、在指定了缺省值的参数右边,不能出现没有指定缺省值的参数;
C、只能在函数的定义性声明中指定参数的缺省值;
D、设置缺省参数值时,必须全部都设置;
2.下列静态数据成员的特性中,(A)是错误的。
A、说明静态数据成员时前边要加修饰符static;
B、静态数据成员要在类体外进行初始化;
C、静态数据成员不是所有对象所共用的;
D、引用静态数据成员时,要在其名称前加<;类名>和作用域运算符;
9.关于new运算符的下列描述中,(D)是错误的。
A、它可以用来动态创建对象和对象数组;
B、使用它创建的对象或对象数组可以使用运算符delete删除;
C、使用它创建对象时要调用构造函数;
D、使用它创建对象数组时必须指定初始值;
11.const int *p说明不能修改(B)。
A、p指针;
B、p指针指向的变量;
C、p指针指向的数据类型;
D、上述A、B、C三者;
14.设置虚基类的目的是(B)。
A、简化程序;
B、消除二义性;
C、提高运行效率;
D、减少目标代码;
一、填空题(每空1分,共20分)。
1.对象是状态和操作/方法的封装体。
2.定义重载函数时,要从参数个数和参数类型上进行区分。
3.类定义中,缺省的成员是私有/private成员。
4.当一个成员函数被调用时,该成员函数的this指针指向调用它的对象。
5.设置虚基类的目的是解决二义性问题,虚基类子对象的初始化由最派生类完成。
6.对虚函数使用基类类型的指针或引用调用,系统使用动态联编;使用对象调用时,系统使用静态
联编。
7.一元运算符作为类成员函数重载时无/不需要形参;二元运算符作为类成员函数
重载时需声明其右操作数。
带有纯虚函数的类称为抽象类,它只能作为基类来使用。
1.在C++中,关于下列函数参数的描述中,(B)是正确的。
A、C++语言中,实参是按照自左至右的顺序求值的;
B、若一个参数设置了默认值,则其右边的所有参数都具有默认值;
C、函数参数的默认值不允许是表达式;
D、设置参数默认值时,应该全部参数都设置;
2.下列关于构造函数的描述中,(A)是正确的。
A、构造函数可以设置缺省参数;
B、构造函数可以被继承;
C、构造函数可以对静态数据成员进行初始化;
D、构造函数可以说明为虚函数
3.int * const p说明不能修改(A)。
A、p指针;
B、p指针指向的变量;
C、p指针指向的数据类型;
D、上述A、B、C三者;
4.关于堆运算符的下列描述中,(C)是错误的。
A、使用堆运算符可以动态建立或删除对象;
B、new运算符创建对象时要调用构造函数;
C、可以在使用new[]创建数组时,为每个数组元素指定初始值;
D、delete运算符可以作用于空指针;
三、改错题(程序的每一行前加上了行号,可以通过说明行号来指出错误位置)(共20分)。
1.指出下面程序中的错误并改正。
Line1: class MyClass
Line2: {
Line3: public:
Line4: MyClass(int i) {member=i;}
Line5: void SetMember(int m) {member=m;}
Line6: int GetMember() const {return member;}
Line7: private:
Line8: int member;
Line9: };
Line10: void main()
Line11: {
Line12: MyClass obj1;
Line13: MyClass obj2(3);
Line14: ber=5;
Line15: MyClass.SetMember(10);
Line16: }
1.错误改正
Line12 MyClass obj1(0); (实参可以为任意值)
Line14 obj1.SetMember(5);
Line15 obj2.SetMember(10);
中国计量学院200 ~200 学年第学期《》课程试卷第 3 页共 8 页
2.指出下面程序中的错误,并说明错误原因。
Line1: class A
Line2: {
Line3: public:
Line4: A() {f unc();}
Line5: virtual void f unc()=0;
Line6: };
2.Line4出错。
原因:构造函数中不能调用纯虚函数
(1)、什么是多继承中的支配原则?
支配规则:
类X中的名字N支配类Y中同名的名字N是指类X以类Y为它的一个基类。
如果一个名字支配另外一个名字,则二者之间不存在二义性。当选择该名字时,使用支配者的名字。
构造函数可以被重载四、根据给定的程序执行结果,将下列程序补充完整。(每空2分,共10分)。
#include <iostream.h>
class Base
{
public:
Base(int i) {b=i;}
(1) virtual void Print()=0;
protected:
int b;
};
class Derive1:public Base
{
public:
(2) Derive1(int i):Base(i) {}
void Print()
{
cout<<"Derive1's Print() called."<<endl;
}
};
class Derive2:public Base
{
(3) public:
Derive2(int i):Base(i) {}
void Print()
{
cout<<"Derive2's Print() called."<<endl;
}
};
void f un((4) Base *obj)
{
obj->Print();
}
void main()
{
(5) 输出结果:
Derive1 *d1=new Derive1(1);
Derive2 *d2=new Derive2(2);
f un(d1);
f un(d2);
}
程序的执行结果如下:
Derive1's Print() called.
Derive2's Print() called.
一、填空题(每空1分,共20分)。
1.所有的面向对象程序设计语言,都支持三个共同的本质特征类、对象、继承。
2.为了解决程序中函数调用的效率问题,引入了内联函数,定义时需在函数前面加上inline说明;为了提
高程序的运行效率,引入了友元,定义时需在函数前面加上friend说明。
3.在类的定义当中,缺省的成员是私有的(private)成员。
4.利用成员函数对二元运算符进行重载时,其左操作数为this指针,右操作数为成员函数形参。
5.设置虚基类的目的是解决二义性问题,可通过virtual标识虚基类。
动态联编是在虚函数的支持下实现的,它通过指针或引用来调用该函数操作
1.在C++中,关于下列设置参数默认值的描述中,(C)是正确的。
A、不允许设置参数的默认值;
B、设置参数默认值只能在定义函数时设置;
C、设置参数默认值时,应该是先设置右边的,再设置左边的;
D、设置参数默认值时,应该全部参数都设置。
2.下列描述中,(D)是抽象类的特性。
A、可以说明虚函数;
B、可以进行构造函数重载;
C、可以定义友元函数;
D、不能说明其对象
10、关于子类型的描述中,(A)是错误的。
A、子类型就是指派生类是基类的子类型;
B、一种类型当它至少提供了另一种类型的行为,则这种类型是另一种类型的子类型;
C、在公有继承下,派生类是基类的子类型;
D、子类型关系是不可逆的。
五、将下列程序补充完整(每空2分,共16分)。
1.输出所有pumpkin的总重量。
#include <iostream.h>
class pumkin
{
public:
(1) pumpkin(int w)
{
weight=w;
total_weight++;
}
~pumkin()
{
(2) total_weight-=weight;
}
static void total_display()
{
cout<<"Total weight is "<<total_weight<<" pounds."<<endl;
}
private:
int weight;
static int total_weight;
};
(3) int pumpkin::total_weight=0;
void main()
{
pumpkin p1(15),p2(20),p3(12);
(4) pumpkin::total_display();
}
3.下列带缺省值参数的函数说明中,正确的说明是(A)。
A.int Fun(int x,int y=2,int z=3);
B.int Fun(int x=1,int y,int z=3);
C.int Fun(int x,int y=2,int z);
D.int Fun(int x=1,int y,int z=3);
5.已知类A中的一个成员函数的说明如下:
void Set(A &a);
则该函数的参数“A &a”的含义是( C )。
A.指向A的指针为a
B.将变量a的地址赋给类A
C.类A对象引用a用作函数的形参
D.变量A与a按位与后作函数参数
8.拷贝(复制)构造函数的作用是( C )。
A.进行数据类型的转换
B.用对象调用成员函数
C.用对象初始化对象
D.用一般类型的数据初始化对象
10.下面对结构或类中成员的访问中,不正确的访问是(A)。
A.*pointer.salary; (其中pointer为指向类对象的指针)
B.pointer->salary;
C.x=worker.salary; (其中worker为具有类类型的对象)
D.Location &rA=A1;int x=rA.GetX(); (Location为已定义的类,A为对象)
二、填空题(每空2分,共20分)
1.面向对象程序设计中的多态性包括静态多态性和动态多态性,前者由___函数重载_________机制支持,而后者则由____虚函数_______机制支持。
2.由char const *str=”stucture”;所以定义的指针称为__指向常量的指针__________,关键字const 所修饰的是____指针所指的字符串________。
3.引入虚基类的目的是为了解决多重继承中的___二义性_________和_____多占用空间_______问题。
4.派生类中所定义的虚函数的____访问属性________不影响对它的动态联编,即基类中已定义的虚函数,其同名函数放在派生
类中的__任何地方________,都可以实现运行时多态性。
5.构造函数与析构函数所调用的虚函数是___所在类_________的函数,因此调用时实现的是______静态______联编。
6.C++的___作用域_________规则能保证编译器调用正确的成员函数。有时为更保险地保证编译器调用正确的成员函数,可以使用___作用域分辨符_________操作符。
7.说明一个const成员函数(又称常量成员函数)的方法是,将const写在_函数头与函数体_________之间,而且它修饰的是___ this指针_______。
8.除析构函数外,不能带有参数的函数还有___类型转换函数_________,而且它的返回数据类型不能随便指定,而由_____ return 语句中返回变量的类型_______来决定。
9.当使用new动态生成一个对象时,隐含着对__构造函数__________的一次调用;而当使用delete删除一个对象时,隐含着对___析构函数_________的一次调用。
10.对某个运算符的重载,实际上是用关键字____ operater ________与该运算符组成一个运算符函数,而且该运算符函数的返回类型不能是__ void __________的。
5.下列程序中声明了两个类AA和BB,其中函数“print”是类AA的成员函数,但是类BB的友元函数。请在①、②和③处各填入正确的内容,使程序能正常运行。
#include
_____①class BB;______;
class AA {
int t;
public:
AA(int x) { t=x; }
void print(BB &b);
};
class BB {
int s;
public:
BB(int y) { s=y; }
friend void ___②AA::___print(BB &);
};
void ____③AA::print(BB &w)_____
{ cout<<”AA:”<<T<<”;BB:”<<W.S<<ENDL;}< P>
void main()
{ AA m(6);
BB n(8);
m.print(n);
}
输出结果为:AA:6;BB:8
五、程序分析题,写出下面各程序的执行结果。(每题5分,共30分)
1.#include
int add(int x,int y) { return x+y; }
void main()
{ int m=2,n=3;
cout<<”1:”<<ADD(M++,M+N)<<ENDL;< P>
m=2,n=3;
cout<<”2:”<<ADD(++M,M+N)<<ENDL;< P>
m=2,n=3;
cout<<”3:”<<<endl;<>
m=2,n=3;
cout<<”4:”<<<endl;<>
}
1:7
2:8
3:8
4:9
1.说明函数原型时不需要指明每个函数参数的名字,只需要说明每个参数的类型和返回值类型就可以了。
2.所有的表达式都有值。
3.程序的编译是以文件为单位的,因此将程序分到多个文件中可以减少每次对程序修改所带来的编译工作量。
4.类的静态数据成员需要在定义每个类的对象时进行初始化。
5.基类中被说明为protected和private的成员只能被其派生类的成员函数访问,不能被其它的函数访问。
6.当将一个类S定义为另一个类A的友元类时,类S的所有成员函数都可以直接访问类A的所有成员。
7.当函数的返回值是数组类型的,传递的是数组第一个元素的地址。
8.如果派生类的成员函数的原型与基类中被定义为虚函数的成员函数原型相同,那么,这个函数自动继承基类中虚函数的特性。
9.字符串’hello,world”在内存中存放时,占用11个字节的空间。
10.用new动态申请的内存空间,必须用delete来释放。
4.在int a=3,int *p=&a;中,*p的值是(D )
A.变量a的地址值
B.无意义
C.变量p的地址值
D.3
6.重载函数在调用时选择的依据中,错误的是(A )
A.函数的参数
B.参数的类型
C.函数的名字
D.函数的类型
10.通常,拷贝构造函数的参数是(C )
A.某个对象名
B.某个对象的成员名
C.某个对象的引用名
D.某个对象的指针名
16.在类中声明转换函数时不能指定(C )
A.参数
B.访问权限
C.操作
D.标识符
17.在公有继承的情况下,基类成员在派生类中的访问权限( B)
A.受限制
B.保持不变
C.受保护
D.不受保护
18.C++类体系中,不能被派生类继承的有(C )
A.转换函数
B.构造函数
C.虚函数
D.静态成员函数
19.假定AB为一个类,则执行AB x;语句时将自动调用该类的(B )
A.有参构造函数
B.无参构造函数
C.拷贝构造函数
D.赋值构造函数
20.C++语言建立类族是通过( B)
A.类的嵌套
B.类的继承
C.虚函数
D.抽象类
二、填空题(每空2分,共20分)
1.对象的三大基本特性是多态性、__抽象_____、封装性。
2.C++语言的函数参数传递方式有传值和___传地址____。
3.重载赋值操作符时,应声明为___友元____函数。
4.用__ class virtual _____声明的基类称为虚基类。
5.用____ virtual ___声明函数称为虚函数。
6.派生类对基类继承控制访问有三种。派生类可以定义其基类中不具备的_数据和操作______。
7.静态成员是对象的成员,__友元_____函数不是类的成员。
8.在函数体之前加__ const _____关键字可以防止覆盖函数改变数据成员的值。
9.一个const对象只能访问_ const ______成员函数。
10.使用友元函数是为了提高程序效率,且节约了_.调用类的成员函数______开销。
6.关于成员函数特征的下列描述中,(A)是错误的。
A、成员函数一定是内联函数;
B、成员函数可以重载;
C、成员函数可以设置缺省参数值;
D、成员函数可以是静态的;
二、判断下列描述的正确性,正确填T,错误填F。(每题2分,共30分)
1.C++中标识符内的大小写字母是没有区别的。(F)
2.C++是一种以编译方式实现的高级语言。(T)
3.计算函数参数顺序引起的二义性是由不同的编译系统决定的。(T)
4.返回值类型、参数个数和类型都相同的函数也可以重载。(F)
5.使用关键字class定义的类中缺省的访问权限是私有(private)的。(T)
6.类的私有成员只能被类中的成员函数访问,任何类以外的函数对它们的访问都是非法的。(F)7.多继承情况下,派生类的构造函数的执行顺序取决于成员初始化列表中的顺序。(F)
8.在公有继承中,基类中的公有成员和私有成员在派生类中都是可见的。(F)
9.在私有继承中,基类中所有成员对派生类都是不可见的。(F)
10.在保护继承中,对于垂直访问等同于公有继承,对于水平访问等同于私有继承。(T)12.在析构函数中调用虚函数时,采用动态束定。(F)
13.在一个成员函数内调用一个虚函数时,对该虚函数的调用进行动态束定。(T)
14.公有继承可以实现子类型。(T)15.构造函数可以声明为纯虚函数。(F 1.#include <iostream.h>
class Test;
void f un1(Test t);
Test f un2();
class Test
{
public:
Test(int n=1) {val=n; cout<<"Con."<<endl; }
Test(const Test& t) {val=t.val; cout<<"Copy con."<<endl;}
Test& operator = (Test& t)
{
val=t.val;
cout<<"Assignment."<<endl;
return *this;
}
private:
int val;
};
void main()
{
Test t1(1);
Test t2=t1;
Test t3;
t3=t1;
f un1(t2);
t3=f un2();
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论