一、选择题 5. 有如下程序
#include <iostream>
using namespace std;
class A{
public:
virtual void func1 (){ cout<<"A1"; }
void func2(){ cout<<"A2"; }
};
class B: public A{
public:
void func l(){ cout<<"B1"; }
void func2(){ cout<<"B2"; }
};
int main() {
A *p=new B;
p->func1();
p->func2();
return 0;
}
运行此程序,屏幕上将显示输出
。
A B C D
10. 有如下语句序列:
ifstream infile("DATA.DAT");
if(infile.good())cout<<"A";
else{
cout<<"B";
ofstream outfile("DATA.DAT");
if(outfile.fail())cout<<"C";
else cout<<"D";
}
执行这个语句序列显示的是BD,则说明文件DATA.DAT______。
A.以读方式打开成功 B.以读方式打开失败,但以写方式打开成功 C.以读方式打开失败,以写方式打开也失败 D.以读方式打开成功,以写方式打开也成功
A B C D
22. 下列程序段中包含4个函数。其中具有隐含this指针的是______。
int fun1();
class Test{
public:
int fun2();
friend int fun3();
static int fun4();
}
A B C D
B
[解析] this指针是成员函数所属对象的指针,它指向类对象的地址。成员函数通过这个指针知道自己属于哪一个对象。this指针是一个隐含的指针,它隐含于每个类的非静态成员函数中,它明确的地表示出了成员函数当前操作的数据所属的对象。
25. 有如下程序:
#include <iostream>
using namespace std;
class AA{
int n;
public:
AA(int k):n(k){}
int get(){ return n;}
int get()const{return n+1;}
};
int main()
{
AA a(5);
const AA b(6);
cout<<a.get()<<b.get();
return 0;
}
执行后的输出结果是
。
A B C D
28. 有如下类定义:
class B{
public:void funl(){}
private:void fun2(){}
protected:void fun3(){}
};
class D:public B{
protected:void fun4(){}
};
若obj是类D的对象,则下列语句中不违反访问控制权限的是______。
A.obj.fun1() B.obj.fun2() C.obj.fun3() D.obj.fun4()
A B C D
34. 若有以下程序:
#include<iostream>
using namespace std;
class Base
{public:
Base()
{x=0; }
int x;};
class Derived1:virtua1 public Base
{public:
Derived1()
{x=10;}};
class Derived2:virtuall public Base
{public:
Derived2()
{x=20;}};
class Derived: public Derivedl, protected Derived2{ };
int main()
{D erived obj;
cout<<obj.x<<endl;
return 0;}
该程序运行后的输出结果是______。
A B C D
A
[解析] 本题考查虚基类的应用。虽然Derived1和Derived2都是由共同的基类x派生而来的,但由于引入了虚基类,使得它们分别对应基类的不同副本。这时数据成员x只存在一份副本,不论在类Derived1中修改,还是在Derived2中修改,都是直接对这唯一副本进行操作。本题程序执行语句“Derived obj;”时,就会先调用虚基类Base的构造函数,使得x=0,然后执行类Derived1的构造函数使得x=10,再执行类Derived2的构造函数,使得x=20。最后输出x的值为20。
二、基本操作题 1.
考生文件夹 使用VC++2010打开考生文件夹下“proj1”文件夹中的工程proj1.sln,但该程序运行时有错,请改正程序中的错误,使程序输出的结果为:
100
37
32
注意:错误的语句在//********error********的下面,修改该语句即可。
#include<iostream.h>
//******error******
void main (
//******error******
int m = 0142;
//******error******
int n = 0X27;
int q = 32;
cout<<m<<endl;
cout<<n<<endl;
cout<<q<<endl;
return;
}
(1)void main() (2)int m=0144; (3)int n=0X25; 或int n=0x25;
[解析] 主函数main()中,定义了三个变量,分别赋初值为八进制、十六进制和十进制数,并利用cout输出。 (1)本题主要考察了主函数定义及不同进制之间的转换,包括十进制到八进制,十进制到十六进制。 主函数定义的定义形式为“main()”,函数名之后必须是一对括号,因此第1个标识下应改为“void main()”。 (2)cout输出默认是10进制方式输出的,根据题目要求输出的结果可发现变量的初值不正确,十进制的100对应八进制的144,十进制的37对应十六进制的25,因此2和3应分别改成“int m=0144;”,“int n=0X25;”或“int n=0x25;”。
三、简单应用题 1.
考生文件夹 使用VC++2010打开考生文件夹下“proj2”文件夹中的工程proj2.sln。其中定义的类并不完整,按要求完成下列操作,将类的定义补充完整。
(1)重载运算符int,请在注释//********1********后添加适当的语句。
(2)重载运算符“<<”,请在注释//********2********后添加适当的语句。
(3)在主函数main()中定义变量i,并调用对象obj的int运算符,给变量赋初值为10,请在注释//********3********后添加适当的语句。
(4)调用obi的“<<”运算符输出:
HelloTest
注意:增加代码,或者修改代码的位置已经用符号表示出来。请不要修改其他的程序代码。
#include<iostream>
using namespace std;
class TestClass
{
public:
//********1********
{
cout<<"int"<<endl;
return 10;
}
//********2********
{
cout<<str<<endl;
}
};
int main()
{
TestClass obj;
//********3********
//********4********
return 0;
}
(1)添加语句:operator int() (2)添加语句:operator<<(char* str) (3)添加语句:int i=int(obj); (4)添加语句:obj<<"Hello Test";
[解析] 本题的功能是通过重载运算符实现字符串输出。在VC环境下打开程序,根据题干给出的几条功能要求,对程序中给出注释下的内容逐个补全或修改。从已定源程序的main主函数开始入手,可以看出程序通过调用类TestClass的运算符重载函数实现各种输出操作。 (1)题目1要求“重载运算符int”的定义。运算符重载的方法是定义一个重载运算符的函数,其一般格式为:函数类型operator运算符名称(形参列表){对运算符的重载处理}。所以第1个标识下,重载运算符int的语句为“operator int()”。 (2)题目2要求“重载运算符'<<'”。同(1),第2个标识下“<<”的重载函数定义为“operator<<(char* str)”。 (3)题目3要求“在主函数main()中定义变量i,并调用对象obj的int运算符,给变量赋初值为10。”定义变量i,即int i。“operator int()”中的返回值为10,所以调用对象obj的int运算符,给变量赋初值为10,就是int(obj),即第三个标识下添加“int i=int(obj);”。 (4)题目4要求“调用obj的“<<”运算符输出"HelloTest"”。重载运算符“<<”后,不仅能输出标准类型数据,而且可以输出用户自己定义的类对象。所以直接添加要输出的字符串即可,即“obj<<"Hello Test";”。
四、综合应用题 1. 请使用VC6或使用【答题】菜单打开
考生文件夹 proj3下的工程文件proj3,此工程包含一个源程序文件proj3.cpp,其功能是从文本文件in.dat中读取全部整数,将整数序列存放到intArray类的对象myArray中,然后对整数序列按非递减排序,最后由函数writeToFile选择序列中的部分数据输出到文件out.dat中。文件in.dat中的整数个数不大于300个。
要求:
补充编制的内容写在“// **********333**********”与“// **********666**********”两行之间。实现对整数序列按非递减排序,并将排序结果在屏幕上输出。不得修改程序的其他部分。
注意:程序最后已将结果输出到文件out.dat中。输出函数writeToFile已经给出并且调用。
// proj3.cpp
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
class intArray
{
private:
int * array; //整数序列首地址
int length; //序列中的整数个数
public:
//构造函数,从文件中读取数据用于初始化新对象。参数是文件名
intArray(char * filename);
void sort(); //对整数序列按非递减排序
~intArray();
void writeToFile (char * filename);
};
intArray:: intArray (char * filename)
{
ifstream myFile(filename);
int len=300;
array = new int[len];
length = 0;
while(myFile >>array[length++]);
length--;
myFile.close();
}
void intArray::sort(){
// **********333**********
// **********666**********
}
intArray:: ~intArray()
{
delete [] array;
}
void intArray:: writeToFile
(char * filename)
{
int step=0;
ofstream outFile(filename);
for(int i=0; i<length; i=i+step)
{
outFile << array [i] << endl;
step ++;
}
outFile.close();
}
void main()
{
intArray myArray ("in.dat");
myArray.sort();
myArray, writeToFile ("out.dat");
}
for (int i = 0; i < length; ++i) //遍历整个数组
for (int j = i; j < length; ++j) //从i++遍历整数组
if (array[i] > array[j]) //如果array[i]>array[j],把array[i]与array[i]进行对换
{
int temp; //定义一个临时变量temp
temp = array[i]; //把array[i]值放到变量temp
array[i] = array[j]; //把array[j]值赋给array[i]
array[j] = temp; //把变量temp存放在值array[j]中
}
for (int a = 0; a < length; ++a) //遍历数组,把数组中的所有元素打印到控制台上
cout << array[a] << " ";
答案考生文件夹 [考点] 本题主要考查intArray类,其中涉及构造函数、排序函数和析构函数。常用的排序算法有冒泡排序、选择排序、插入排序、堆排序等。 [解析] 题目要求对整数序列按非递减排序,要排序就必须要有比较,因此定义两个下标i和j,按题目非递减排序要求,当array[i]比array[j]大时就交换其值,利用中间变量temp来实现。 排序算法有多种,其基本思想是相同的,即先遍历,后比较,再交换。不同之处在于它们遍历数列的顺序不同。考生可选择一至两种算法重点理解。