-> C++期末考试题(一)<-
一、 填空题(25 小题,共 50 分)
(以下每小题 1 分,共 10 分)
1. 在 C++中,函数的参数有两种传递方式,它们是值传递和地址或指针或引用传递。
2. 当一个成员函数被调用时,该成员函数的 this 指针指向调用它的对象。
3. 在基类和派生类中,派生类可以定义其基类中不具备的数据和操作。对两个有相同名字
的数据成员进行访问时,如果没有作用于分隔限定符::,对此数据成员的访问将出现歧义。
4. 拷贝构造函数使用引用作为参数初始化创建中的对象。
5. 在公有继承的情况下,基类数据成员在派生类中的访问权限保持不变。
6. 描述命题"A 小于 B 或小于 C"的表达式为 Ac&&b==c"的值是 0。
(以下每小题 2 分,共 20 分)
11. 面向对象的程序设计有四大特征,它们是抽象、封装、继承、多态。
12. 在 C++中,定义重载函数时,应至少使重载函数的参数个数或参数类型不同;在基类
和派生类中,成员函数的覆盖是指派生类成员函数与基类被覆盖的成员函数、参数个数、参
数类型和返回值均相同。
13. 构造函数与析构函数除功能不同外,在定义形式上,它们的区别还包括构造函数名与
类名相同,而析构函数名是在类名前加一个~、析构函数没有参数、可以为虚函数。
14. 动态联编要满足两个条件,它们是 被调用的成员函数是虚函数 、 用指针或引用调用虚函数 。
15. 在 C++类中,有一种不能定义对象的类,这样的类只能被继承,称之为抽象类,定义
该类至少具有一个纯虚函数。
16. 在 C++类中,const 关键字可以修饰对象和成员函数,const 对象不能被修改,const 成
员函数不能修改类数据成员 。
17. 举出 C++中两种用户自定义的数据类型:类、枚举。
18. C++中没有字符串类型,字符串是通过字符数组来表示的,每一个字符串都有一个结尾
字符\0。
19. C++中没有输入输出语句,输入输出是通过输入输出库实现的, 写出一条打印整型变
量 n 的输出语句:cout<
void main()
{
char a='a',b='j';
float x;
x=(b-a)/('F'-'A');
printf("%d\n",(int)(3.14*x));
}
22. 下面程序的运行结果是 2 5 8 11 14。
#include "iostream.h"
void main( )
{
int i=1;
while (i<=15){
i++;
if (i%3!=2) continue;
else cout <<"i="<
}
24. 下面程序的运行结果是 。
#include
class A
{
public:
A(){cout<<"A::A() called.\n";}
virtual ~A(){cout<<"A::~A() called.\n";}
};
class B:public A
{
public:
B(int i){
cout<<"B::B() called.\n";
buf=new char[i];
}
virtual ~B(){
delete []buf;
cout<<"B::~B() called.\n";
}
private:
char *buf;
};
void fun(A *a)
{
delete a;
}
void main()
{
A *a=new B(15);
fun(a);
}
A::A() called.
B::B() called.
B::~B() called.
A::~A() called.
25. 下面程序的运行结果是 。
#include
int a[ ]={1,3,5,7,9};
int *p[ ]={a,a+1,a+2,a+3,a+4};
void main( )
{
printf("%d\t%d\t%d\n",a[4],*(a+2),*p[1]);
printf("%d\t%d\t%d\n",**(p+1)+a[2],*(p+4)-*(p+0),*(a+3)%a[4]);
}
9 5 3
8 4 7
二、 问答题(每小题 5 分,共 20 分)
1. 若程序员没有定义拷贝构造函数,则编译器自动生成一个缺省的拷贝构造函数,它可能
会产生什么问题?
当对象含有指针数据成员,并用它初始化同类型的另一个对象时,缺省的拷贝构造函数只
能将该对象的数据成员复制给另一个对象,而不能将该对象中指针所指向的内存单元也复制
过去。这样,就可能出现同一内存单元释放两次,导致程序运行出错。
2. 简述成员函数、全局函数和友元函数的差别。
成员函数是在类内部定义的,作用域在类的内部,成员函数可以访问类的数据成员(公
有、保护和私有数据成员),可以调用该类的其它成员函数(公有、保护和私有成员函数),
可以调用全局函数。如果友元函数是另一个类的公有成员函数,则该类的成员函数也只能通
过那个类的对象调用,不能调用那个类的保护和私有成员函数。非本类成员函数(其它类成
员函数或全局函数)可以通过该类的对象访问该类的公有数据成员和调用该类的的公有成员
函数。
不是在类中定义的成员函数都是全局函数。
如果某一个函数(全局函数或类的成员函数)定义为另一个类的友元函数,需要在那个
类中用 friend 关键字声明,友元函数并不是类的成员,它的定义自然是在那个类的外面。
3. 简述结构化的程序设计、面向对象的程序设计的基本思想。
结构化的程序设计将数据和对数据的操作分离,程序是由一个个的函数组成的,面向对象
的程序设计将数据和操作封装在一起,程序是由一个个对象组成的,对象之间通过接口进行
通信,它能够较好地支持程序代码的复用。
4. 结构 struct 和类 class 有什么异同?
struct 和 class 都可以定义类,但是缺省访问权限说明时,struct 的成员是公有的,而 class
的成员是私有的。在 C++中,struct 可被 class 代替。
三、找出下面程序(或程序段)中的语法错误,并予以纠正(每小题 4 分,共 8 分)
(1)程序功能是倒序输出各给定的字符串。
#include
void main()
{
char str[5][ ]={"First","Second","Third","Forth","Fifth"};
char *cp[ ]={str[4],str[3],str[2],str[1],str[0]};
int i;
while(i<=5)
{
printf("%c ",*(cp+i));
i++;
}
}
①
"char str[5][ ]={"First","Second","Third","Forth","Fifth"};"应为
"char str[5][10 ]={"First","Second","Third","Forth","Fifth"};"
② "while(i<=5)"应为"while(i<5)"
③ "printf("%c ",*(cp+i));"应为"printf("%s",*(cp+i));"
④ "int i;"应为"int i=0;"
(2)程序功能是将各个平方根值放入数组中。
#include
void main()
{
int max,a,i;
scanf("%d%d",max,a);
double x[max];
for (i=0;i"
② "scanf("%d%d",max,a);"应为"scanf("%d%d",&max,&a);"
③ "double x[max];"改为:
"double *x=new double[max];"
…
"delete []x;"
四、(8 分)下列 shape 类是一个表示形状的抽象类,area( )为求图形面积的函数,total( )
则是一个通用的用以求不同形状的图形面积总和的函数。请从 shape 类派生三角形类
(triangle)、矩形类(rectangle),并给出具体的求面积函数。
class shape{
public:
virtual float area( )=0;
};
float total(shape *s[ ],int n)
{
float sum=0.0;
for(int i=0;iarea( );
return sum;
}
class Triangle:public Shape
{
public:
Triangle(double h,double w){H=h;W=w;}
double Area() const{return H*W*0.5;}
private:
double H,W;
};
class Rectangle:public Shape
{
public:
Rectangle(double h,double w){H=h;W=w;}
double Area()const{return H*W;}
private:
double H,W;
};
五、(6 分)完成顺序查找函数 f_seq( )。其过程是:从表头开始,根据给定的模式,逐项与
表中元素比较。如果找到所需元素,则查找成功,并打印出它在表中的顺序号。如果查找整
个表仍未找到所需对象,则查找失败
#include
void f_seq(char *list[],char *object,int len)
//list 指针数组,指向字符串
//object 模式串
//len 表的长度
{
char **p;
int strcmp(char *s,char *t);
p=list;
while (p {
int num;
struct node *next;
}
struct node* reverse(struct node *head)
//head 链表头结点
{
struct node *p,*temp1,*temp2;
if(head==NULL||head->next==NULL ) return head;
p=head->next;head->next=NULL;
while(p!=NULL 或 p )
{
temp1=head;
head=p;
temp2=p;
p=p->next;
temp2->next=temp1;或 head->next=temp1;
}//Match while statenment
return head; //返回逆置后的链表的头结点
}
-> C++期末考试题(二)<-
一、 填空题(25 小题,共 50 分)
(以下每小题 1 分,共 10 分)
1. 在 C++中,用数组、指针、和引用作为函数参数,能够将参数值带回。
2. 在 C++中,虽然友元提供了类之间数据进行访问的一种方式,但它破坏了面向对象程序
设计的封装特性。
3. 在 C++中,构造派生类对象时,总是先从基类的初始化开始的。
4. 拷贝构造函数是在用一个对象初始化另一个对象时被调用,系统缺省的拷贝构造函数的
工作方法是拷贝每一个数据成员。
5. 类是用户定义的类型,具有类类型的变量称作对象。
6. 在 5 个运算符"*(乘号)、<=、!=、!、&&"中,优先级由高到低的顺序是!、*(乘号)、<=、!
=、&&。
7. 在 C++中,类定义一般用 class 关键字,不过用 struct 关键字也可以定义类,它们定义
类的区别在于 在缺省访问权限时,struct 类成员是公有的,而 class 类成员是私有的 。
8. 静态的成员函数没有隐含的 this 指针,所以,它们只能访问静态的数据成员。
9. 与"(!a==0)"等价的 C++表达式是 (a>0||a<0)或(a) 。
10. 若 a=6,b=4,c=2,则表达式"!(a-b)+c-1&&b+c/2"的值是 1。
(以下每小题 2 分,共 20 分)
11. 在面向对象的程序设计中,通过封装实现数据隐藏;通过继承实现代码的复用。
12. 在下面的程序段中,语句"const int* c=&a;"和语句"int* const d=&b;"的含义分别是 变量
指针 c 指向整型常量 a 、 常量指针 d 指向整型变量 b 。
const int a=78;
int b=28;
const int* c=&a;
int* const d=&b;
13. 用 new 申请有 10 个元素的指针数组 str,假定数组元素是指向字符型数据的指针,该
C++语句为 char **str=new char*[10]; 。
14. 在 C++中构造一个对象时,其数据成员在构造函数中初始化。对于内嵌的对象、常量、
引用 数据成员需要在构造函数的成员初始化列表中初始化。
15. 在类的定义中,说明为 protected 的数据成员称为保护成员。保护数据成员具有双重作
用:对于其派生类而言是公有的;而对于其外部的程序而言是私有的。
16. C++中有两种数据类型:整型和字符型可以使用 signed 修饰符。
17. 举出 C++中两种流程控制语句 if 语句、for 循环语句。
18. 预编译指令由三种,它们是:文件包含、宏定义和条件编译。
19. C++中,对象保存在内存中,栈内存是自动分配和释放的,而堆内存需要用户自己申请
和释放。
20. 在 C++函数中,可用 return 语句带回一个值。如果有多个返回值,可用指针、引用 等
带回。
(以下每小题 4 分,共 20 分)
21. 下面程序的运行结果是 6 。
#include
void main( )
{
char a='0',b='9';
float x;
x=(b-a)/('F'-'B');
printf("%d\n",(int)(3.14*x));
}
22. 以下程序的输出结果是**#**#**#$。
#include
void main()
{
int i;
for (i=0;i<=5;i++){
if (i%2) printf("**");
else continue;
printf("#");
}
printf("$\n");
}
23. 下面程序的运行结果是 Hello 50 OK!。
#include
#define N 100
class CStack
{
public:
CStack() {top=0;cout<<"Hello ";}