一、选择题 2. 有如下类定义:
class Date{
public:
Date(int y=2014, int m=9, int d=9):year(y), month(m), day(d){}
______(ostream&stream, Date&ddd); //运算符<<的声明
private:
int year, month, day;
};
若要使语句序列
Date GoodDay;
cout<<GoodDay<<endl;
能够正常运行,横线处的内容应为______。
A.istream& operator << B.ostream& operator << C.friend istream& operator << D.friend ostream& operator <<
A B C D
D
[解析] 本题考查的是输出运算符<<的重载首先函数的第一个形参类型为ostream&,所以返回值也应该是ostream&,以保证输出运算符可以链接使用,选项A、C错误;由于L/O操作符的第一个形参类型并不是Date类类型,所以不能作为成员函数,必须使用友元函数,声明前必须加关键字friend,选项B错误,选项D正确。
3. 有如下程序:
#include<iostream>
using namespace std;
class Power{
public:
Power(int x):val(x) {}
______
protected:
int val;
};
class Square:public Power{
public:
Square(int x):Power(x) {}
void Display() {cout<<val<<"的平方是"<<val*val<<endl; }
};
int main(){
Power*p=new Square(3);
p->Display();
delete p;
return 0;
}
若运行时的输出结果为“3的平方是9”,则划线处缺失的语句可能是______。
A.void Display(){} B.virtual void Display()=0 C.void virtual Display()=0; D.void Display()virtual {}
A B C D
B
[解析] 由题意可知,基类指针p指向的是派生类的对象,当p调用Display()时,输出的结果是派生类中的Display(),可知Display()必为虚函数,这样才能满足动态联编。虚函数的定义是在声明前加关键字virtual,选项A不是虚函数,错误;选项C、D定义虚函数的格式不对,错误;答案为B选项。
7. 有下列程序:
#include <stdio.h>
#include"string.h"
tyoedef struct{char name[9];char sex;float score[2];}STU;
void f(STU a)
{
STU b={"Zhao",'m',85.0,90.0};int i;strcpy(a.name,b.name);
a.sex=b.sex;
for(i=0;i<2;i++)a.score[i]=b.score[i];
}
void main()
{
STU c=("Qian",'f',g5.0,92.0);
f(c);
printf("%s,%c,%2.of,%2.of\n",c.name,c.sex,
c.score[0],c.score[1]);
}
程序的运行结果是______。
A.Qian,f,95,92 B.Qian,m,85,90 C.Zhao,f,95,92 D.Zhao,m,85,90
A B C D
A
[解析] 本题考查在结构体中函数的调用,主函数调用f(c)后,实参传向形参,但程序中没有返回语句,故形参不能将值传回实参,实参之间值的传递具有不可逆性,所以printf输出的还是c中实参的值。
9. 有如下程序:
#include<iostream>
using namespace std;
class TlestClass
{
int n;
public:
TestClass(int k):n(k){}
int get(){return n;}
int get()const{return n+1;}
};
int main()
{
TestClass p(5);
const TestClass q(6);
cout<<p.get()<<q.get();
return 0;
}
执行后的输出结果是______。
A B C D
B
[解析] C++中对常对象的成员函数调用,将自动调用其常成员函数,程序中调用原型为"int get()const;"的函数,对于非常对象将调用原型为"int get();"的函数。因为首先用5对对象p进行了初始化,所以执行p.get()时直接返回5,而对于常对象则以6对q进行初始化。在调用q.get()时,将调用原型为"int get()const;"的函数,该函数将返回n+1,第二个输出应为7,所以本题答案为57。
10. 有如下四个语句:
①cout<<'A'<<setfIll('*')<<left<<setw(7)<<'B'<<endl;
②cout<<setfill('*')<<left<<setw(7)<<'A'<<'B'<<endl;
③cout<<'A'<<serfill('*')<<right<<setw(7)<<'B'<<endl;
④cout<<setfill('*')<<right<<setw(7)<<'A'<<'B'<<endl;
其中能显示A******B的是______。
A B C D
C
[解析] 本题考查C++流的使用。setfill()的作用是设置填充字符;left的作用是使输出数据在指定宽度内左对齐;right的作用是使输出数据在指定宽度内右对齐。
13. 有如下程序:
#include<iostream>
using namespace std;
class Con
{
char ID;
public;
Con():ID('A){cout<<1;}
Con(char ID):ID(ID){cout<<2;}
Con(Con&c):ID(c.getID()){cout<<3;}
char getID()const{return ID;}
}
void show(Con c){cout<<c.getID();}
int main()
{
Con c1;
sllow(c1);
Con c2('B');
show(c2);
return 0;
}
执行上面程序的输出结果是______。
A.13A23A B.23A13B C.13A23B D.13823A
A B C D
C
[解析] Con c1定义c1对象,调用Con的无参数构造函数,输出1,ID值变为A,执行show(c1)时会调用拷贝构造函数,将c1对象的值复制给show函数的形参,此时输出3,然后在show()中输出c1的ID值A,Con c2('B')定义c2对象,调用Con(char ID)构造函数,输出2,c2的ID值为B,show(c2)执行时先调用拷贝构造函数输出3,然后输出B。因此程序输出结果为“13A23B”。
14. 有如下程序:
#include < iostream >
using namespaee std;
class Basel
{
public :
Basel(int d) { cout <<d; }
~Basel () {}
};
class Base2
{
public :
Base2 ( int d) { cout << d ; }
~Base2() {}
};
class Derived : public Base1 ,Base2
{
public :
Derived(int a, int b, int c, int d) :Base1(b), Base2(a), b1(d), b2(e) {}
private :
int b1 ;
int b2 ;
};
int main()
{
Derived d(1,2,3,4) ;
return 0 ;
}
执行这个程序的输出记过是
。
A B C D
D
[解析] 本题考查派生类的构造函数和析构函数,在定义一个派生类的对象时,先调用基类的构造函数,然后再执行派生类的构造函数,对象释放时,先执行派生类的析构函数,再执行基类的析构函数。本题中定义一个派生类对象时,分别调用基类的构造函数,所以分别输出21。
16. 有如下类定义:
class AA
{
int a;
public:
int getRef() const {return &a;}//①
int getValue() const {return a;}//②
void set(int n)const{a=n; }//③
friend void show(AA aa)const {cout<<a;}//④
};
其中四个函数的定义中正确的是______。
A B C D
B
[解析] 本题考查常成员函数,常成员函数只能引用本类中的数据成员,而不能修改它。所以本题答案为B。
23. 若有如下程序:
#include<iostream>
using namespace std;
int s=0;
class sample
{
static int n;
public:
sample(int i)
{
n=i;
}
static void add()
{
S+=n;
}
};
int sample::n=0;
int main()
{
sample a(2),b(5);
sample::add();
cout<<s<<endl;
return 0;
}
程序运行后的输出结果是
。
A B C D
B
[解析] 执行语句“sample a(2),b(5)”;的结果是使n的值最终变为5,sample::add()语句调用函数static void add(),使得s=s+n=5。
26. 若有如下程序:
#include<iostream>
using namespace std;
class TestClass
{
public:
void who() {cout<<"TestClass"<<endl;}
};
class TestClass1:public TestClass
{
public:
void who(){cout<<"TestClass1"<<endl;}
};
int main()
{
TestClass *p;
TcstClass1 obj1;
p=&obj1;
p->who();
return 0;
}
则该程序运行后的输出结果是
。
A.TestClass1 B.TestClass C.0 D.无输出
A B C D
A
[解析] 程序中的TestClas1为TestClass的派生类,主函数main中定义TestClass对象*p,TestClass1对象obj1,然后p引用obj1,执行p->who()则是调用基类中的who函数,输出TcstClass。
32. 有如下类声明:
class XA{
int x;
public:
XA(int n){x=n;}
};
class XB:public XA{
int y;
public:
XB(int a,int b);
};
在构造函数XB的下列定义中,正确的是
。
A.XB::XB(int a,int b):x(a),y(b){} B.XB::XB(int a,int b):XA(a),y(b){} C.XB::XB(int a,int b):x(a),XB(b){} D.XB::XB(int a,int b):XA(a),XB(b){}
A B C D
B
[解析] 此题考查的是派生类中构造函数的定义。派生类的构造首先要调用基类的构造函数,对基类成员初始化;然后对派生类中的新增成员初始化。格式:派生类名(构造函数形参表)基类构造函数(形参表)。
36. 有以下程序:
void fun(int a*a,int i,int i)
{int t;
if(i<j);
{t=a[i];a[i]=a[j];a[j]=t;
fun(a,++i,--j);
}
}
main()
{inta[]={1,2,3,4,5,6},i;
fun(a,0,5);
for(i=0;i(6;i++)
cout<(a[i];
}
执行后输出结果是
。
A.6 5 4 3 2 1 B.4 3 2 1 5 6 C.4 5 6 1 2 3 D.1 2 3 4 5 6
A B C D
A
[解析] 本题采用递归函数的方式将数组中的元素进行倒置,正确答案为A。
37. 有如下程序:
#inchlde<iostream>
using namespace std;
int main(){
char a;
cin>>a;
if(a=='*')cout<<"**"<<endl;
else cout<<"###"<<endl;
return 0;
}
输入字符+时,程序的运行结果是______。
A B C D
D
[解析] 函数在执行过程中,没有定义一个有效的返回值类型,所以程序运行结果为无输出。
39. 有如下程序:
#include<iostream>
using namespace std;
int main(){
int i,s=0;
for(i=1;s<20;i+=2)s+=i*i;
cout<<i<<endl;
return 0;
}
运行这个程序的输出结果是______。
A B C D
C
[解析] 在这段程序中for循环共执行3次,每次循环变量i的值增2,在执行第三次循环语句时,变量s的值等于25,大于20而退出循环,此时再执行循环变量i加2运算,所以最后变量i的值等于7。
二、基本操作题 (共18分) 1. 请使用VC6或使用【答题】菜单打开
考生文件夹 prog1下的工程prog1,该工程中包含程序文件main.cpp,其中有Salary(“工资”)类和主函数main的定义。程序中位于每个“// ERROR ****found****”之后的一行语句行有错误,请加以改正。改正后程序的输出结果应为:
应发合计:3500 应扣合计:67.5 实发工资:3432.5
注意:只修改每个“// ERROR ****found****”下的那一行,不要改动程序中的其他内容。
#include <iostream>
using namespace std;
class Salary{
public:
Salary(const char * id, double the_base, double the_bonus, double the_tax)
// ERROR *******found*******
: the_base (base), the_bonus (bonus), the_tax (tax)
{
staff_id = new char[strlen (id) +1];
strcpy (staff_id, id);
}
// ERROR *******found*******
~Salary() {delete * staff_id;}
double getGrossPay() const {return base + bonus;} //返回应发项合计
double getNetPay() const {return getGrossPay() - tax;} //返回实发工资额
private:
char * staff_id; //职工号
double base; //基本工资
double bonus; //奖金
double tax; //代扣个人所得税
};
int main() {
Salarypay("888888", 3000.0, 500.0, 67.50);
cout << "应发合计:" << pay.getGrossPay() << " ";
cout << "应扣合计:" << pay.getGrossPay() - pay.getNetPay() << " ";
// ERROR *******found*******
cout << "实发工资:" << pay::getNetPay() << endl;
return 0;
}
(1):base(the_base),bonus(the_bonus),tax(the_tax)
(2)~Salary() {delete[] staff_id;}
(3)cout << "实发工资:" << pay.getNetPay() << endl;
答案考生文件夹 [考点] 本题考查的是Salary类,其中涉及动态数组、构造函数、析构函数和const函数。构造函数一般使用成员列表初始化,括号内应该为形参。析构函数使用delete语句释放指针,格式为:delete[]指针。 [解析] (1)主要考查考生对构造函数的掌握情况,构造函数的成员初始列表要把形参放在括号内。 (2)主要考查考生对析构函数的掌握情况,析构函数使用delete释放指针,delete后要跟标识符“[]”。 (3)主要考查考生对成员函数调用的掌握情况,调用类的成员函数使用标识符“.”,而不是作用域符“::”。
三、简单应用题 (共24分) 1. 使用VC++6.0打开
考生文件夹 下的源程序文件2.cpp。阅读下列函数说明和代码。函数num(char *str)用于返回字符串中非数字的个数。
例如:abc123abc45
返回值为:6
将函数num补充完整。
注意:请勿改动主函数main。
试题程序: #include<iostream.h>
int num(char *str)
{
}
int main()
{
char str[1024];
cout<<"please input a string:"<<endl;
cin.getline(str,1024);
cout<<"char number is"<<num(str)<<endl;
return 0;
}
int number=0;
for(int i=0;str[i]! =0;i++)
if(str[i]>'9'||str[i]<'0') //非数字字符
number++;
return number;
答案考生文件夹 [解析] 利用循环搜索数组str中的元素,循环变量从0开始,直到str[i]=0(到了字符数组末端),不断从str中读取元素。每读到一个元素就判断是否是非数字字符,即满足条件“str[i]>'9'||str[i]<'0'”的字符为非数字字符,非数字字符个数加1,循环结束就得到了非数字字符的个数。
四、综合应用题 (共18分) 1.
考生文件夹 请使用【答题】菜单命令或直接用VC6打开考生文件夹下的工程proj3,其中声明的是一个人员信息类,补充编制程序,使其功能完整。在main函数中给出了一组测试数据,此种情况下程序的输出应该是:Zhang 20 Tsinghua。
注意:只能在函数address_change的“// ********333********”和“// ********666********”之间填入若干语句,不要改动程序中的其他内容。
程序最后将结果输出到文件out.dat中。输出函数writeToFile已经编译为obj文件,并且在本程序中调用。
//proj3.h
#include <iostream>
#include <string>
using namespace std;
class Person{
char name[20];
int age;
char * address;
public:
Person(){ age = 0;address = 0;}
void name_change (char *_name);
//名字修改函数
void age_change(int_age);
//年龄修改函数
void address_change (char *_add);
//地址修改函数
void info_display();
//人员信息显示
~Person();
//析构函数
};
void writeToFile(const char * path);
proj3.cpp
#include <iostream>
#include <string>
#include "proj3.h"
using namespace std;
void Person::name_change(char*_name)
{
strcpy(name, _name);
}
void Person::age_change(int _age)
{
age = _age;
}
void Person::address _change (char * add)
{
if (address!=NULL) delete[]address;
// ********333********
// ********666********
}
void Person::info_display(){
cout << name << '\t'
<< age << '\t';
if(address!=NULL)
cout << address << endl;
cout << endl;
}
Person::~Person(){
if(address!=NULL)
delete[] address;
}
void main()
{
Person p1;
p1.name_change("Zhang");
p1.age_change(20);
p1.address_change("Tsinghua University");
p1.address_change("Tsinghua");
p1.info_display();
writeToFile(" ");
}
address = new char[strlen(_add)+1]; //给类成员变量动态分配空间
strcpy(address, _add); //把字符串_add复制给address
答案考生文件夹 [考点] 主要考查的是Person类,其中涉及动态数组、析构函数、构造函数和成员函数。 [解析] 函数address_change(char*_add)的功能是地址修改,也就是说通过该函数把类的地址修改为add字符串。类的私有成员address是字符指针,因此首先要给address分配空间,通过new语句来实现:address=new char[strlen(_add)+1];。接下来就是要复制字符串,使用系统函数strcpy,其用法为strcpy(参数1,参数2),将参数2的内容复制到参数1中。