C++试题及答案 下载本文

Base * p=&b1; fun(p); p=&b2; fun(p); }

答案:virtual void display()=0;,Base *p

[解析]抽象类有纯虚函数,派生类为display。结果fun函数用指针做参数。

5. 下面程序中用来求数组和。请在下面程序的横线处填上适当内容,以使程序完整,并使程序 的输出为:s=150。 #include class Arr {int *a,n; public:

Arr():a(0),n(0){} Arr(int *aa, int nn) {n=nn;

a=new int[n];

for(int i=0;i

~Arr(){delete a;} _____________; {return *(a+i);} };

void main()

{int b[5]={10,20,30,40,50}; Arr a1(b,5); int i=0,s=0; _____________

s+=a1.GetValue(i); cout<<\}

答案:int GetValue(int i),for(;i<5;i++)

[解析]函数调用GetValue,由此可知要定义该函数,循环求和,循环5次。 五、程序分析题(本大题共4小题,每小题5分,共20分) 1. 给出下面程序输出结果。 #include class example {int a; public:

example(int b=5){a=b++;}

void print(){a=a+1;cout <

void main() {example x;

const example y(2); x.print(); y.print(); }

答案:62

[解析]x是普通对象,调用普通的print函数;而y常对象,调用常成员函数。 2. 给出下面程序输出结果。 #include void main() { int *p1; int **p2=&p1; int b=20; p1=&b;

cout<<**p2<

答案:20

[解析]p1指向b,而p指向p1的地址。*p2表示p1的地址,p1的地址就是&b,即*p2是&b,所以 **p2就是b变量的值。

3. 给出下面程序输出结果。 #include

class Base {private: int Y; public:

Base(int y=0) {Y=y;cout<<\\n\~Base() {cout<<\\n\void print() {cout <

class Derived:public Base {private: int Z; public:

Derived (int y, int z):Base(y) {Z=z;

cout<<\\n\}

~Derived() {cout<<\~Derived()\n\void print() {Base::print(); cout<

void main()

{Derived d(10,20); d.print(); }

答案:Base(10) Derived(10,20) 10 20

~Derived() ~Base()

[解析]派生类对象,先调用基类构造函数输出Base(10),后调用派生类构造函数输出

Derived(10,20),后执行d.print(),调用派生类的print,再调用Base::print()输出10,后返回 输出z的值20。后派生类析构,再基类析构。 4. 给出下面程序输出结果。 #include class A {public: A()

{cout<<\构造函数\n\virtual void fun()

{cout<<\函数\n\};

class B:public A {public: B()

{cout<<\构造函数\n\

void fun() {cout<<\函数\n\};

void main() {B d;}

答案:A构造函数 A::fun()函数 B构造函数

B::fun()calle函数

[解析]定义派生类对象,首先调用基类构造函数,调用A类中fun(),然后调用B类的构造函数 ,在调用B的fun函数。

六、程序设计题(本大题共1小题,共10分)

1. 编写类String的构造函数、析构函数和赋值函数和测试程序。 已知类String的原型为: #include #include class String {public:

String(const char *str=NULL); // 普通构造函数 String(const String &other); // 拷贝构造函数 ~String(); // 析构函数

String & operator=(const String &other); // 赋值函数 void show()

{cout<

private:

char *m_data; // 用于保存字符串 };

答案:String::~String()

{delete[]m_data;//由于m_data是内部数据类型,也可以写成delete m_data; }

String::String(const char *str) {if(str==NULL)

{m_data=new char[1];//若能加NULL判断则更好 *m_data=\0; } else

{int length=strlen(str);

m_data=new char[length+1]; //若能加NULL判断则更好 strcpy(m_data, str); } }

String::String(const String &other) {int length=strlen(other.m_data);

m_data=new char[length+1];//若能加NULL判断则更好 strcpy(m_data, other.m_data); }

String & String::operator=(const String &other) {if(this==&other) return *this; delete[]m_data;

int length=strlen(other.m_data);

m_data=new char[length+1];//若能加NULL判断则更好 strcpy(m_data, other.m_data); return *this; }

void main()

{String str1(\str1.show(); str2=str1; str2.show();

String str3(str2); str3.show(); }__

C++程序设计模拟试卷(三)

一、单项选择题(本大题共20小题,每小题1分,共20分)在每小题列出的四个备选项中 只有一个是符合题目要求的,请将其代码填写在题后的括号内。错选、多选或未选均无 分。

1. 设有定义int i;double j=5;,则10+i+j值的数据类型是() A. int B. double C. float D. 不确定 答案:B

解析:考察数据的转换,j是double类型,运算只能作同类型的运算,所以要转换,而int能自动 转换为double类型,所以结果是double类型。

2. 要禁止修改指针p本身,又要禁止修改p所指向的数据,这样的指针应定义为() A. const char *p=“ABCD”; B. char *const p=“ABCD”; C. char const *p=“ABCD”;

D. const char * const p=“ABCD”; 答案:D

解析:const char *p说明禁止通过p修改所指向的数据。char * const p则说明不能修改

指针p的地址。因此const char * const p=“ABCD”;它禁止修改指针p本身,又禁止修改p所指 向的数据。

3. 类的构造函数被自动调用执行的情况是在定义该类的()

A. 成员函数时 B. 数据成员时 C. 对象时 D. 友元函数时 答案:C

解析:建立对象时,自动构造函数的初始化对象,是系统自动调用的。而成员函数、友元 函数,需要用户直接调用,因此选择C项。

4. 已知类A是类B的友元,类B是类C的友元,则() A. 类A一定是类C的友元 B. 类C一定是类A的友元

C. 类C的成员函数可以访问类B的对象的任何成员 D. 类A的成员函数可以访问类B的对象的任何成员 答案:C

解析:友元说明方法如下: friend?<类名>;//友元类类名 使用友元可以访问所有成员: (1)友元关系不能被继承。

(2)友元关系是单向的,不具有交换性。所以,B项和D项错误。 (3)友元关系不具有传递性。所以,A项错误。

5. 假定一个类的构造函数为“A(int i=4, int j=0) {a=i;b=j;}”, 则执行“A x (1);”语 句后,x.a和x.b的值分别为() A. 1和0 B. 1和4 C. 4和0 D. 4和1 答案:A

解析:带默认的构造函数,对应实参没有值时就采用形参值。调用构造函数时,i=1,不采 用默认值,而只有一个参数,j采用默认值0即j=0,因此a=1,b=0,选择A项。 6. 关于this指针使用说法正确的是()

A. 保证每个对象拥有自己的数据成员,但共享处理这些数据的代码 B. 保证基类私有成员在子类中可以被访问。 C. 保证基类保护成员在子类中可以被访问。 D. 保证基类公有成员在子类中可以被访问。 答案:A

解析:this指针是隐藏的,可以使用该指针来访问调用对象中的数据。基类的成员在派生 类中能否访问,与继承方式有关,与this没有关系。所以选择A项。 7. 所谓多态性是指 ()

A. 不同的对象调用不同名称的函数 B. 不同的对象调用相同名称的函数 C. 一个对象调用不同名称的函数 D. 一个对象调用不同名称的对象 答案:B

解析:多态性有两种静态多态性和动态多态性,静态多态性是指调用同名函数,由于参数

的不同调用不同的同名函数;动态多态性是指不同对象调用同名函数时,由于对象不同调用不同 的同名函数。 多态性肯定具有相同的函数名,所以选择B项。 8. 友元关系不能() A. 提高程序的运行效率 B. 是类与类的关系

C. 是一个类的成员函数与另一个类的关系 D. 继承 答案:D

解析:友元可以是函数与类的关系即友元函数,也可以类与类的关系即友元类,但友元不

能继承,是单向性,且不具有传递性。友元可以访问类中所有成员,提高了访问的方便性。因此 选择D项。

9. 语句ofstream f(“TEMP.DAT”,ios::app|ios::binary)?的功能是建立流对象f,试图打 开文件TEMP.DAT 并与之连接,并且()

A. 若文件存在,将文件写指针定位于文件尾;若文件不存在,建立一个新文件 B. 若文件存在,将其置为空文件;若文件不存在,打开失败

C. 若文件存在,将文件写指针定位于文件首;若文件不存在,建立一个新文件 D. 若文件存在,打开失败;若文件不存在,建立一个新文件 答案:A

解析:ios::binary,采用二进制形式,ios::app定位到文件尾部。 10. 构造函数不具备的特征是() A. 构造函数的函数名与类名相同 B. 构造函数可以重载

C. 构造函数可以设置默认参数