姓名: __________ 时间: _ _ _ _ _ _ _ _ _ _ _
DCCBBAADAD
一、选择题(1*10=10)
1 .如果派生类以proctected方式继承基类,则原基类的protected和public成员在派生类的访问性分别是:D
A. public 和public
B. public 和protected
C. protected和public
D. protected和protected
解析:通过protected方式继承基类后,原基类的私有成员不可访问,而protected
和public成员均变成protected成员。
答案:D
2.有如下头文件:
intF1();
staticintF2();
classsCA
{
public:
intF3();
staticintF4();
};
在所描述的函数中,具有隐含this 指针的是:C
A .F1
B .F2
C .F3
D .F4
本题考查的是this 指针。
this 指针式一个隐含的指针,它隐含于每个类的非静态成员函数中,它明确地表示出了成员函数当前操作的数据所属的对象。当对一个对象调用成员函数时,编译程序先将对象的地址赋值给this 指针,然后调用成员函数,每次成员函数存取数据成员时,则隐含使用this 指针。
this指针是指向对象本身的指针,它只存在于类的非静态成员中。fl,f2不是成
员函数,不存在隐含指针;f4为静态成员函数,也不含有this指针;含有this 指针的函数在调用时按thiscall 调用约定调用。
故本题答案为C。
3. 派生类的成员函数不能访问基类的:C
A .共有成员和保护成员
B .共有成员
C.私有成员 D .保护成员
本题考查的是继承的类型。
类的继承方式有公有继承、保护继承和私有继承三种方式。对于公有继承基类中的成员访问属性不变,对于保护和私有继承基类中的成员转换为相应的访问类型。但是如果基类成员的访问属性为private 的,则不能被继承。
故本题答案为C。
4. 按照“后进先出”原则组织数据的数据结构是B
A .队列
B .栈
C.双向链表 D .二叉树
答案为B
5.下列关于虚函数的说明中,正确的是: B
A .从虚基类继承的函数都是虚函数B.虚函数不得是静态成员函数
D .抽象类中的中的成员函数都是虚函C.只能通过指针或者引用调用虚函数
数。
答案为B。
6.已知Value是个类,value是Value的一个对象。下列以非成员函数形式重载的运算符函数原型中,正确的是:A
A. Valueoperator+(Valuev,inti);
B.Valueoperator+(Valuev=value,i nti);
D. Valueoperator+(Valuev=value,inti=O)
C. Valueoperator+(Valuev,int=O);
7.有如下类的定义:
ClassMyClass
{
in tvalue;
public:
MyClass(i ntn ):value( n){}
in tgetValue()co nst{returnvalue;}
};
则类Myclass的构造函数的个数是:A
A. 1个
B. 2个
C. 3个
D. 4个
还有默认拷贝构造函数,应该选B
8 ?有如下类的定义:
classC on sta nts
{
public:
staticdoubleGetPI(void){return3.14159;}
};
Con sta ntsc on sta nts;
下列各组语句中,能输出3.14159的是:B
A. cout?constants->GetPI()和cout< B. cout?constants.GetPI()和cout< C. cout?constants->GetPI()和cout< D. cout?constants.GetPI()和cout< 9. 有如下程序: #in clude usingn amespacestd; classVAC { public: in tf()co nst{return3;} in tf(){return5;} }; in tmai n() VACvl; con stVACv2; cout< return。; } 运行时的输出结果是:A A. 53 B. 35 C. 55 D. 33 10. 有如下类声明: classBase { protected: in tam ount; public: Base(i ntn=0):am oun t( n){} in tgetAmou nt()co nst{returnamou nt;} }; classDerived:publicBase { protected: in tvalue; public: Derived(i ntm,i ntn ):value(m),Base( n){} in tgetData()c on st{returnv alue+amou nt;} }; 已知x是一个Derived对象,则下列表达式中正确的是:B A. x.value+x.getAmount(); B. x.getData()+x.getAmount(); C. x.getData()xamount; D. x.value+x.amount; 二、填空题(8*2=16) 400_64444return*this_DogspeakVoice 1. 下列中a的值是_400_ #defin eAAA200 #defin eBBBAAA+100 in ta=BBB*2 2. 以下为WindowsNT下的32位C++程序,请计算sizeof的值' charstr[]= “ Hello ”;char*p=str; intn=10; 请计算 sizeof(str)= ___ 5____ sizeof(p)= __ 4 ___ sizeof(n)= __ 4 ____ voidFu nc(charstr[100]) //请计算 sizeof(str)= __ 4 _____ } void*p=malloc(100); 〃请计算 sizeof(p)= ____ 4___ 3. 补充完整下面的类定义: classXCH{ char*a; public: XCH(char*aa){// 构造函数 a=n ewchar[strle n( aa)+1]; strcpy(a,aa); } XCH&operator=(constXCH&x){〃重载赋值函数delete[]a; a=n ewchar[strle n( x.a)+1]; strcpy(a,x.a); } ~XCH(){delete[]a;} }; ___ return*this _____________ 4. 请写出下面程序的输出结果 #in clude usingn amespacestd; classA ni mal{ public: virtualchar*getType()co nst{return"A ni mal";} virtualchar*getVoice ()con st{return"Voice";} }; classDog:publicA ni mal{ public: char*getType()co nst{return"Dog";} char*getVoice ()con st{return"Woof";} }; voidtype(A ni mal&a){cout< Dogd;type(d);cout<<"speak";speak(d);cout< } ogspeakVoice 、问答题(5*10+9+15=74) 1. 编写类String 的拷贝构造函数和赋值函数(可以调用C++/C 的字符串库函 数)(15) o 已知类String 的原型为: classStri ng { public: Stri ng(co nstchar*str=NULL); Stri ng(c on stStri ng&o ther); ~Stri ng(void); String&operate=(constString&other); 〃赋值函数 private: char*m_data; }; 请编写String 的上述4个函数。 //String 的析构函数 String::~String(void)//3 分 { delete[]m_data; 〃由于m_data 是内部数据类型,也可以写成 deletem_data; } 一 一 //String 的普通构造函数 String::String(constchar*str)//6 分 { if(str==NULL) { m_data=newchar[1];/若能加NULL 判断则更好 *m_data= 0'; } else { in tle ngth=strle n( str); m_data=newchar[length+1];/若能加 NULL 判断则更好 strcpy(m_data,str); } } 〃拷贝构造函数 String::String(constString&other)//3 分 { in tle ngth=strle n( other.m_data);〃普通构造函数 〃拷贝构造函 〃用于保存字符串