一、选择题6. 有如下类定义:
class Foo
{
public:
Foo(int v):value(v){} //①
~Foo(){} //②
private:
Foo(){} //③
int value=0; //④
};
其中存在语法错误的行是______。
A B C D
D
[解析] 本题考查类的定义。C++语言规定,在类体内不允许对所定义的数据成员进行初始化。
8. 有如下程序:
#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选项。
9. 下列枚举类型的定义中,包含枚举值3的是______。
- A.enum test{RED,YELLOW,BLUE,BLACK};
- B.enum test{RED,YELLOW=4,BLUE,BLACK};
- C.enum test{RED=-1,YELLOW,BLUE,BLACK};
- D.enum test{RED,YELLOW=6,BLUE,BLACK};
A B C D
A
[解析] 声明枚举类型的语法格式为:enum<类型名>{<枚举值表>};<枚举值表>包含多个枚举值,它们用逗号隔开,每个枚举值就是一个枚举常量。枚举值有两种定义形式:一是<值名>;二是<值名>=<整型常量>。关于枚举类型有以下4点说明:
①一个enum类型实际上是int类型的一个子集,其每一个枚举值代表一个整数。
②n个枚举值全部未赋常量值时,它们自左至右分别与整数0,1,…n-1对应。
③若第i个枚举值赋常量值为m,则其未赋常量值的后续枚举值分别与整数m+1,m+2…对应,直到下一个赋了值的枚举值或结束。因此,为枚举值赋的整型常量值应从左到右递增。
④枚举类型的声明也可作为组声明若干整型符号常量的方法。也就是说,把每个要声明的符号常量作为一个枚举值,将各个枚举值合在一起定义成一个枚举类型。
对于本题来说,在选项A中,对4个枚举值没有赋常量值,所以它们从左到右与整数0,1,2,3相对应。因而选项A为正确选项。
21. 有如下程序:
#include<iostream>
using namespace std;
class MyClass{
public:
MyClass(){++count;}
~MyClass(){--count;}
static int getCount(){return count;)
private:
static int count;
};
int MyClass::count=0;
int main(){
MyClass obj;
cout<<obj.getCount();
MyClass*ptr=new MyClass;
cout<<MyClass::getCount();
delete ptr;
cout<<MyClass::getCount();
return 0;
}
程序的输出结果是______。
A B C D
A
[解析] 此题考查的是静态成员。静态成员的特性是不管这个类创建了多少对象,它的静态成员都只有一个拷贝副本,这个副本被所有属于这个类的对象共享。题目中,首先定义了obj对象,其构造函数使静态数据成员count增1,故输出“1”;然后通过指针动态创建了MyClass类的对象,构造函数被再次调用,count变为2,输出“2”;接着删除创建的MyClass类的对象,调用析构函数,count减1变为1,输出“1”。故最终输出结果是121。
22. 有如下程序:
#include<iostream.h>
using namespace std;
class Demo
{
public:
Demo(){ cout<<"default constructor\n";}
Demo (const Demo &x){ cont<<"copy construc};
Demo userCode (Demo b){Demo c(b);return c;}
int main()
{
Demo a;d;
cout<<"calling userCode()\n";
d=userCode(a);
return 0;
}
执行上面程序的过程中,构造函数Demo()和Demo(const Demo &x)被调用的次数分别是______。
A B C D
C
[解析] 函数Demo()为构造函数,而Demo(const Demo&x)为复制构造函数。C++在创建一个对象时,会自动调用类的构造函数,所以语句”Demo a.d;”将调用函数Demo()2次。当一个对象作为实参传递给函数时为初始化形参,要调用拷贝构造函数;在函数返回一个对象时调用拷贝构造函数。由此可知语句d=userCode(a);调用拷贝构造函数3次。
23. 下面程序的运行结果是
。
#include<iostream.h>
void main()
{
int i=1;
while(i<=8)
if(++i%3!=2)continue;
else cout<<i;
}
A B C D
C
[解析] 应镇先做++运算,然后进行%运算,最后比较不等式,实际上最后输出的结果就是被3除,余数为2的不大于8的数。
25. 下列程序的运行结果为
#include<iostream.h>
void main( )
{
int a=2;
int b=a+1;
cout < < a/b < < endl;
}
- A.0.66667
- B.0
- C.0.7
- D.0.66666666…
A B C D
B
[解析] 表达式值的类型是由操作数的类型决定的,因为本题的两个数都是int型的,所以得出的结果也为int型,即去掉小数点后的部分,只取商的整数部分。
33. 以下程序的运行结是______。
#include<iostream>
using namespace std ;
class Base {
char c;
public :
Base( char c0):c( c0) { }
~Base( ){cout<<c;}
};
class Derived:public Base{
char c:
public:
Derived( char c0): Base(c0+1) ,c(c0){}
~Derived(){cout<<e;}
};
int main(){
Derived obj('x');
return 0:
}
A) xy B) yx c)x D) y
A B C D
A
[解析] 主函数结束时,派生类对象obj将被销毁,先调用派生类的析构函数输出x,然后调用基类的析构函数输出y。
二、基本操作题1. 请使用VC6或使用[答题]菜单打开考生文件夹proj3下的工程proj3,其中声明的CDeepCopy是一个用于表示矩阵的类。请编写这个类的赋值运算符成员函数operator=,以实现深层复制。
要求:
补充编制的内容写在“//**********333**********”与“//**********666**********”之间。不得修改程序的其他部分。
注意:程序最后将结果输出到文件out.dat中。输出函数writeToFile已经编译为obj文件,并且在本程序中调用。
//CDeepCopy.h
#include<iostream>
#include<string>
using namespace std;
class CDeepCopy
{
public:
int n; //动态数组的元素个数
int*p; //动态数组首地址
CDeepCopy(int);
~CDeepCopy();
CDeepCopy& operator=(const CDeepCopy&r);//赋值运算符函数
};
void writeToFile (char*);
//main.cpp
#include"CDeepCopy.h"
CDeepCopy::~CDeepCopy(){delete[]p;}
CDeepCopy::CDeepCopy(int k){n=k;p=new int[n];)//构造函数实现
CDeepCopy& CDeepCopy::operator=(const CDeepCopy&r)
//赋值运算符函数实现
{
//**********333**********
//**********666**********
}
int main()
{
CDeepCopy a(2),d(3);
a.p[0]=1;d.p[0]=666;//对象a,d数组元素的赋值
{
CDeepCopy b(3);
a.p[0]=88;b=a;//调用赋值运算符函数
cout<<b.p[0];//显示内层局部对象的数组元素
}
cout<<d.p[0];//显示d数组元素a.p[0]的值
cout<<"d fade away;\n";
cout<<a.p[0];//显示a数组元素a.p[0]的值
writeToFile(" ");
return 0;
}
n=r.n; //把对象r字符长度赋值给n
delete[]p; //删除动态数组p
p=new int[n];
//给动态数组p分配空间为n
for(int i=0;i<n;i++)
//遍历对象r中的数组p
p[i]=r.p[i];
//把r.[i]赋值给p[i]
return*this; //返回被赋值的对象
[解析] 本题考查CDeepCopy类,其中涉及动态数组、构造函数、析构函数和运算符重载。运算符重载要先把类的定义弄清,其次要理解被重载的运算符的含义。
主要考查考生对运算符重载的掌握,由注释可知此处要实现赋值运算符函数。要重载的运算符是“=”,该类的成员是动态数组p,数组元素个数为n,因此先释放原来的动态数组,再分配空间,然后逐个复制元素即可。
三、简单应用题1.
考生文件夹 使用VC++2010打开考生文件夹下“proj2”文件夹中的工程proj2.sln。其中定义的类并不完整,按要求完成下列操作,将类的定义补充完整。完成以下功能:
(1)定义复数类CComplex的私有成员变量real和imaginary,分别用来表示复数的实部和虚部,都是double类型的变量。请在注释//********1********后添加适当的语句。
(2)添加复数类CComplex的带一个参数的构造函数,分别将real和imaginary赋值为参数r和0。请在注释//********2********后添加适当的语句。
(3)完成对运算符“+”的重载,分别对复数的实部和虚部相加。请在注释//********3********后添加适当的语句。
(4)完成复数的友元函数Equal(CComplex& c1,CComplex & c2)的定义,如果两个数的实部和虚部都相等,则返回1,否则返回0,请在注释//********4********后添加适当的语句。
注意:除在指定位置添加语句之外,请不要改动程序中的其他内容。
#include<iostream.h>
class CComplex
{
private:
//********1********
public:
CComplex()
{
real = imaginary = 0;
}
CComplex(double r) {
//********2********
}
CComplex operator+(CComplex& c1) {
//********3********
temp.real= real+c1.real;
temp.imaginary=
imaginary+c1.imaginary;
return temp;
}
void Set(int re,int imag)
{
real = re;
imaginary = imag;
}
friend bool Equal(CComplex& c1,CComplex& c2);
};
bool Equal(CComplex& c1, CComplex& c2)
{
//********4********
}
int main()
{
CComplex complex1(5);
CComplex complex2;
cout<<Equal(complex1,comp lex2)<<endl;
complex2.Set(5,0);
cout<<Equal(complex1,comp lex2)<<endl;
return 0;
}
(1)添加语句:double real,imaginary;
(2)添加语句:real=r; imaginary=0;
(3)添加语句:CComplex temp;
(4)添加语句:return (c1.real==c2.real) && (c1.imaginary==c2.imaginary);
[解析] 程序中定义了类CComplex,含有私有成员变量real和imaginary,分别用来表示复数的实部和虚部,CComplex类有两个构造函数、对运算符“+”的重载、Set(int re,int imag)可改变实部和虚部的值、友元Equal(CComplex& c1,CComplex& c2)函数可判断两个CComplex对象是否相等。
(1)第1个标识下完成定义复数类CComplex的私有成员变量real和imaginary,均为double类型的变量,因此第1个标识下应添加“double real,imaginary;”。
(2)构造函数CComplex(double r)完成类的初始化,该构造函数有一个参数,分别将real和imaginary赋值为参数r和0,因此第2个标识下应添加“real=r; imaginary=0;”。
(3)编译程序可知,变量temp没有定义,由operator+(CComplex& c1)函数体的语句可知,temp为函数的返回值,而operator+(CComplex& c1)函数体函数返回CComplex类对象,故在第3个标识下补充temp定义,即“CComplex temp;”。
(4)即判断两个对象c1和c2的实部和虚部是否均相等,两个逻辑结果相与即可,因此第4个标识下应添加“return (c1.real==c2.real)&&(c1.imaginary==c2.imaginary);”。
四、综合应用题1.
考生文件夹 使用VC++2010打开考生文件夹下“proj3”文件夹中的工程proj3.sln。阅读下列函数说明和代码。函数sort(int &m,int &n,int &l)实现将三个整数m、n、l由大到小输出。m最大,l最小。
程序分析:程序实现时,可以把最大的数放到m上,先将m与n进行比较,如果m<n则将m与n的值进行交换,然后再用m与l进行比较,如果m<l则将m与l的值进行交换,这样能使m最大。然后再将n与l进行比较,若n<l则将n与l的值互换,互换后则l最小。
将函数sort(int &m,int &n,int &l)补充完整,实现三个数的排序。
注意:请勿改动主函数。
#include <iostream.h>
void sort(int& m, int& n, int& l)
{
}
int main()
{
int x=9;
int y=13;
int z=-3;
sort(x,y,z);
cout<<x<<','<<y<<','<<z<<endl;
return 0;
}
int t;
if (m<n)
{t=m;m=n;n=t;)/*交换x,y的值*/
if (m<1)
{t=m;m=l;l=t;}/*交换x,z的值*/
if (n<1)
(t=n;n=1;1=t;)/*交换z,y的值*/
[解析] sort函数实现3个参数的从大到小的排序,可以采用很多方法来排序,比如选择法排序、冒泡法排序等,这里要求采用比较的方法来实现排序,由于需要排序的数据较少,只有3个,逐个比较就可以找到最大最值小进行排序。
(1)由审题分析可知,三次比较便可将m、n、l排序。
(2)在实现时,先将m与n进行比较,如果m<n则将m与n的值进行交换,然后再用m与l进行比较,如果m<l则将m与l的值进行交换,这样能使m最大。然后再将n与l进行比较,若n<l则将n与l的值互换,互换后则l最小,这样就得到m最大,l最小的排序结果。
(3)在sort函数内用三个if比较即可,条件成立则进行交换。