admin 管理员组

文章数量: 1087139


2024年4月22日发(作者:nosql数据库的特点)

D. 对象之间的信息传递是通过消息进行的

答案:A

解析: A对象在C++中才有,包括数据和操作两项,而C中的变量只有数据,

没有操作。所

以A项错误。

18. 派生类的构造函数的成员初始化列表中,不能包含()

A. 基类的构造函数

B. 基类的对象初始化

C. 派生类对象的初始化

D. 派生类中一般数据成员的初始化

答案:C

解析:派生类的构造函数的成员初始化,包括基类成员、基类对象成员和派生

类成员。因

为本身就是初始化定义的对象,在构造函数中再进行该类对象的初始化产生了

循环定义,或者类

中不能包括本身类的成员对象。所以选择C项。

19. 关于new运算符的下列描述中,错误的是()

A. 它可以用来动态创建对象和对象数组

B. 使用它创建的对象或对象数组可以使用运算符delete删除

C. 使用它创建对象时要调用构造函数

D. 使用它创建对象数组时必须指定初始值

答案:D

解析: new创建的对象数组不能指定初始值,所以调用无参的构造函数,选择

D项。

20. 假定一个类的构造函数为A(int aa,int bb){a=aa++;b=a*++bb;},则执

行A x(4,5);语句

后,x.a和x.b的值分别为()

A. 4和5

B. 4和20

C. 4和24

D. 20和5

答案:C

解析:执行构造函数将数据成员进行赋值,aa++是后加,先赋值a=4,++bb,bb

变量值先自

加为6,再与a相乘,所以b=24。

二、填空题(本大题共20小题,每小题1分,共20分)请在每小题的空格中填

上正确答

案。错填、不填均无分。

1. 在C++中,编译指令都是以___(符号)开始。

答案:#

C++的源程序可包括各种编译指令,以指示编译器对源代码进行编译之前先对

其进行预处理。所

有的编译指令都以#开始,每条指令单独占用一行,同一行不能有其他编译指

令和C++语句(注释

例外)

2. 在函数前面用___保留字修饰时,则表示该函数表为内联函数。

答案: inline

[解析]内联函数,用来提高程序运行速度。在类内部定义的函数也是内联函

数。

3. 执行下列程序

int a=21,j=16;

(ios::hex);

cout<

(ios::hex);

cout<

程序的输出结果是___。

答案: 1516

[解析]a=21以十六进制输出,j=16以十进制输出。

4. 在单继承和多继承方式中,面向对象的程序设计应尽量使用___继承。

答案:单

[解析]多继承是单继承的扩展,且多继承易产生二义性等问题。

5. 函数模板中紧随template之后尖括号内的类型参数都要冠以保留字___。

答案: class

[解析]类模板的使用。template ,也可以引入多参数的如:template

T1,class T2,...,class Tn>

6. 在C++中,访问指针所指向的对象的成员使用___运算符。

答案:->或.

[解析]使用指针访问成员有两种方法:成员运算符“.”或指向运算符“.”。

7. 定义类的动态对象数组时,系统只能够自动调用该类的___构造函数对其

进行初始化。

答案:无参

[解析]使用new创建对象数组,调用无参构造函数。

8. 局部对象和全局对象中,在同一程序中___生存期最长。

答案:全局对象

变量或对象的生命期或者作用域的不同,全局对象生命期长。

9. this指针始终指向调用成员函数的___。

答案:对象

this指针是隐藏的指针,它指向调用函数的对象。

10. 派生类的主要用途是可以定义其基类中___。

答案:不具有的成员

[解析]继承的特点,扩充基类,即在派生类中增加基类不具有的成员。

11. 在用class定义一个类时,数据成员和成员函数的默认访问权限是___。

答案: private

[解析]定义类时的成员默认为私有,而结构体则是公有。

12. 使用new为int数组动态分配10个存储空间是___。

答案: new int[10];

[解析]new delete动态开辟空间和删除空间。new int[10],注意不要写

成new

int(10),使用小括号只能开辟一个空间,使用10来初始化该值。

13. 类模板用来表达具有___的模板类对象集。

答案:相同处理方法

[解析]模板特点是不同的数据具有相同的处理方法的抽象。

14. 如果通过同一个基类派生一系列的类,则将这些类总称为___。

答案:类族

[解析]单继承方式派生的众多的类。

15. 面向对象的四个基本特性是多态性、继承性、和封装性___。

答案:抽象

[解析]考察面向对象的四个特征。程序由一组抽象的对象组成,一组对象的

共同特征抽象出类

的概念,类是对象的抽象,对象是类的实例。封装即将数据和操作紧密结合提

供访问的接口,外

部通过接口实现访问数据,提供安全性。继承继承解决了类的扩展性。多态性

不同对象调用相同

的函数名,但调用不同的函数,实现不同的功能,解决了接口统一的问题。

16. 所有模板都是以___关键字和一个形参表开头的。

答案: template

[解析]类模板,函数模板都要使用template这一关键字。

17. 在C++语言中,访问一个对象的成员所用的成员运算符是___。

答案:.

[解析]成员运算符“.”,如果是指针可以使用“->”。

18. 开发一个C++语言程序的步骤通常包括编辑、___、连接、运行和调试。

答案:编译

[解析]vc开发过程,要经过编辑、编译、连接和运行四个步骤,与其它高级

语言相同。

19. 执行下列代码

string str("HelloC++");

cout<<(5,3);

程序的输出结果是___。

答案: C++

[解析]substr取子字符串,第1个参数表示要截取子串在字符串中的位置,

第2个表示取多少个

字符。

20. 定义___函数时,应在参数个数或参数类型上有所不同。

答案:重载

[解析]重载函数要求同名函数具有相同的功能,而只能是函数类型、参数个

数或参数顺序不同

。系统将根据同名函数的这些不同之处来选择其对应的实现。

三、改错题(本大题共5小题,每小题4分,共20分)

1. #include

#include

#include

using namespace std;

class A

{public:

A(const char *na){strcpy(name,na);}

private:

char name[80];

};

class B:public A

{ public:

B(const char *nm):A(nm){}

void show();

};

void B::show()

{ cout<<"name:"<

}

void main()

{ B b1("B");

();

}

答案:private:因为name如果是私有的,在派生类中无法访问,而基类没有提

供成员函数来访问

name,所以更改name访问权限为公有或保护,这样对于派生类来说是透明的。

[修改]public:或protected:

2. 下面的程序有错误,请修改。

#include

class A

{private:

int a;

public:

void func(B &);

A(int i){a=i;}

};

class B

{private:

int b;

friend void A::func(B &);

public:

B(int i){b=i;}

};

void A::func(B& r)

{a=r.b;

cout<

}

void main()

{ B bt(3);

A at(10);

(bt);

}

答案:[修改]class B;

class A

[解析]class A类A中使用B类中的成员增加对B声明。

3. #include

class Test

{private:

int x,y=20;

public:

Test(int i,int j){x=i,y=j;}

int getx(){return x;}

int gety(){return y;}

};

void main()

{Test mt(10,20);

cout<<()<

cout<<()<

}

答案:int x,y=20;在类内部不能对数据成员直接赋值。

[修改]int x,y;

4. #include

class A

{private:

int x,y;

public:

void fun(int i,int j)

{x=i;y=j;}

void show()

{cout<

};

void main()

{A a1;

(2);

();

}

答案:void fun(int i,int j)调用时有一个参数,形参有两个,可以使第二

个带默认值。

[修改]void fun(int i,int j=0)

5. #include

class A

{private:

int x;

protected:

int y;

public:

A(int i,int j){x=i;y=j;}

};

class B:public A

{public:

B(int a,int b):A(a,b){}

void show(){cout<

};

void main()

{B b(8,9);

();

}

答案:private:在基类中是私有成员,即使采用公有派生,但在派生类无法访

问。

[修改]public:或protected:

四、完成程序题(本大题共5小题,每小题4分,共20分)

1. 完成下面类中成员函数的定义。

#include

class vehicle

{protected:

int size;

int speed;

public:

void set(int s){speed=s;}

_____get(){return speed/10;}

};

class car:public vehicle

{ public:

int get(){return speed;}

};

class truck:public vehicle

{ public:

int get(){return speed/2;}

};

int max(______)

{ if(()>())

return 1;

else

return 2;

}

void main()

{ truck t;

car c;

(160);

(80);

cout<

}

答案:virtual int,vehicle &v1,vehicle &v2

[解析]在基类和派生类都有get函数,输出结果是2,只有当这两个不同类型

的对象,调用

不同类的get函数,才能使结果为2,这就是多态性。所以将基类get定义为虚

函数。max函数使用

基类对象的引用的方法来实现。

2. 完成下面类中成员函数的定义。

#include

#include

using namespace std;

class str

{private:

char *st;

public:

str(char *a)

{set(a);

}

str & operator=(____)

{delete st;

set();

return *this;

}

void show(){cout<

~str(){delete st;}

void set(char *s)//初始化st

{_____

strcpy(st,s);

}

};

void main()

{str s1("he"),s2("she");

(),();

s2=s1;

(),();}

答案:str &a,st=new char[strlen(s)+1];

[解析]对“=”运算符进行重载,调用时s2=s1,都是对象,所以形参使用对

象的引用,不

要使用对象作为形参(产生临时对象)。使用strcpy进行字符的复制,st必须

有一定的空间,空

间是strlen(s)+1(‘\0’作为结束符,strlen得到的长度不包括结束符)。

3. 下面程序段用来求三角形的面积,首先判断三边不符合组成三角形时,返

回-1,符合时输

出三角形面积。

#include

#include

double area(double a,double b,double c)

{if(____)

return -1;

else

{

double ar,l;

l=(a+b+c)/2;

ar=sqrt(l*(l-a)*(l-b)*(l-c));

return ar;

}

}

void main()

{double i=0,j=0,k=0;

cout<<"输入三角形三边:";

cin>>i>>j>>k;

double s=area(i,j,k);

if(s<0)

cout<<"不是三角形"<

else

______

}

答案:a+b>c||a+c>b||b+c>a,cout<

[解析]三角形组成规则:两边之和大于第三边。s<0不是三角形,是则输出s。

4. 在下面程序横线处填上适当内容,使程序执行结果为:

S=2

S=5

S=9

#include

void sum(int i)

{static int s;

_________;

cout<<"s="<

}

void main (void)

{int i;

for (i=0;________)

sum(i);

}

答案:s=s+i+2;,i<3,i++

[解析]根据结果和调用形式,得出规律。注意静态成员能保留上次运行的结

果。循环了3次

,退出循环的条件。

5. 下面是一个三角形三边,输出其面积C++程序,在下划线处填上正确的语

句。

#include

#include

void area()

{double a,b,c;

cout<<"Input a b c:";

________

if(a+b>c&&a+c>b&&c+b>a)

{double l=(a+b+c)/2;

_______

cout<<"The area is:"<

}

else

cout<<"Error"<

}

void main()

{area();}

答案:cin>>a>>b>>c;,double s=sqrt(l*(l-a)*(l-b)*(l-c));

[解析]输入三个边的长度,由公式得出三角形的面积double

s=sqrt(l*(l-a)*(l-b)*(l-c));

五、程序分析题(本大题共2小题,每小题5分,共10分)

1. 给出下面程序输出结果。

#include

class example

{int a;

public:

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

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

void print()const

{cout<

};

void main()

{example x;

const example y(2);

();

();

}

答案:62

[解析]x是普通对象,调用普通的print函数;而y常对象,调用常成员函数。

2. 给出下面程序输出结果。

#include

class A

{public:

A()

{cout<<"A 构造函数\n";fun();}

virtual void fun()

{cout<<"A::fun() 函数\n";}

};

class B:public A

{public:

B()

{cout<<"B构造函数\n";fun();}

void fun() {cout<<"B::fun() calle函数\n";}

};

void main()

{B d;}

答案:A构造函数

A::fun()函数

B构造函数

B::fun()calle函数

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

用B类的构造函数

,在调用B的fun函数。

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

1. 写一个程序,定义一个抽象类Shape,由它派生3个类:Square(正方形)、

Trapezoid(梯形

)和Triangle三角形。用虚函数分别计算几种图形面积、并求它们的和。要求

用基类指针数组

,使它每一个元素指向一个派生类对象。

#include

class Shape

{public:

virtual double area()const=0;

};

答案:class Square:public Shape

{public:

Square(double s):side(s){}

double area() const{return side*side;}

private:

double side;

};

class Trapezoid:public Shape

{public:

Trapezoid(double i,double j,double k):a(i),b(j),h(k)

{}

double area() const{return ((a+b)*h/2);}

private:

double a,b,h;

};

class Triangle:public Shape

{public:

Triangle(double i,double j):w(i),h(j)

{}

double area() const{return(w*h/2);}

private:

double w,h;

};

void main()

{Shape *p[5];

Square se(5);

Trapezoid td(2,5,4);

Triangle te(5,8);

p[0]=&se;

p[1]=&td;

p[2]=&te;

double da=0;

for(int i=0;i<3;i++)

{da+=p[i]->area();}

cout<<"总面积是:"<

}__


本文标签: 对象 成员 函数 解析