2013年春季学期《C++程序设计》作业题目及答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2013年春季学期《C++程序设计》作业
作业提交格式要求:请同学们把答案集中单独写在一个.doc文档中,作为附件上传(不要把答案直接填写在题目的空中)。
特规定格式如下:
一、ABCDD AAAAA
二、
三、
(1) BeiJing
ShangHai
(2) x=8,y=7
(3) r=k:i+j=90
……
以上只是举例,不是正确的输出结果。
请按上述规定书写和提交作业结果,不符合以上规定的作业将作为0分处理。
鼓励独立完成作业,严惩抄袭。
第一部分(C++第1-7、8、9章)
一、单选题BDBCD DCDCB
1、C++是从早期的C语言逐渐发展演变来的,与C语言相比,它在求解问题方法上最大的改进是()。
A.面向过程 B. 面向对象 C. 安全性 D. 复用性
2、下列关于this指针的叙述中,正确的是( )
A.任何与类相关的函数都有this指针
B.类的成员函数都有this指针
C.类的友元函数都有this指针
D.类的非静态成员函数才有this指针
3、若有以下类Z声明,函数fStatic的正确定义是( )。
class Z
{ int a;
public:
void fStatic(Z&)static;
};
A.void Z::fStatic(Z &objZ){ objZ.a=0; }
B.void Z::fStatic(Z &objZ){ a= objZ.a; }
C.void Z::fStatic(Z &objZ){ a=0; }
D.void Z::fStatic(Z &objZ){ Z::a=0; }
4、在C++中,关于下列设置缺省参数值的描述中,()是正确的。
A.不允许设置缺省参数值;
B.只能在函数的定义中指定参数的缺省值;
C.在指定了缺省值的参数右边,不能出现没有指定缺省值的参数;
D.设置缺省参数值时,必须全部都设置;
5、关于友元函数的描述中,错误的是()。
A.友元函数说明在类体内B.友元函数不是成员函数
C.友元函数必须用对象来引用D.友元函数可以直接访问类中的私有成员
6、对于类,下面哪个是不正确的( )。
A. 类是对象的设计蓝图
B. 使用关键字Class创建类结构
C. 类被声明后,类名成为类型名并且可以用来声明变量
D. 类与结构体相同,它们之间没有区别
7、下列是构造函数的特点,( )是错误的。
A.构造函数是一种成员函数,它具有一般成员函数的特点。
B.构造函数的名称与其类名相同。
C.构造函数必须指明其类型。
D.一个类中可以定义一个或多个构造函数。
8、已知:p是一个指向类A数据成员m的指针,a是类A的一个对象。
在给m赋值为5的下列表达式中,( )是正确的。
A. a.p=5
B. a->p=5
C. a.*p=5
D. *a.p=5
9、下面对静态数据成员的描述中,正确的选项是( )。
A.静态成员可以在类体内进行初始化
B.静态数据成员不可以被类的对象调用
C.静态数据成员可以直接用类名调用
D.静态数据成员不可以直接用类名调用
10、下列关于new运算符的描述中,错误的是( )。
A. new运算符组成的表达式的值是地址值
B. 创建对象时不调用构造函数
C.用它创建的对象须用delete来删除
D.可用它来创建动态的对象和对象数组
二、判断题TFFTT FFTFF
1.子对象的初始化可以不放在该类的构造函数中。
T
2.如果一个类中没有定义任何构造函数,则该类的对象便无法初始化。
F
3.构造函数和析构函数都不能重载。
F
4.如果一个成员函数只存取一个类的静态数据成员,则可将该成员函数说明为静态成
员函数。
T
5.构造函数和析构函数都是系统自动调用的。
T
6.可以在类的构造函数中对静态数据成员进行初始化。
F
7.友元函数是成员函数,它可以访问类中私有成员。
F
8.对象数组的元素必须是同一个类的对象。
T
9.用class定义的类中,默认的访问权限是公有的。
F
10.运算符new可以创建变量或对象,也可以创建数组。
F
三、写出下列程序的输出结果:
1、
#include <iostream.h>
using namespace std;
class Test
{
public:
Test()
{
cout<<”constructor of Test”<<endl;
}
};
Test a;
int main()
{
cout<<”main() start”<<endl;
Test b;
return 0;
}
输出结果:construction of Test
main()start
constructor of Test
2、
#include <iostream.h>
class Student
{
public:
Student(int i=0,double j=0)
{ num=i;score=j; }
void print()
{ cout<<num<<’,’<<score<<endl; }
friend void fun(Student &rs);
private:
int num;
double score;
};
void fun(Student &rs)
{ rs.num=1100;
rs.score=80;
rs.print();
}
void main()
{ Student s1(1002,50),s2;
s1.print();
fun(s2);
}
输出结果:1002,50
1100,80
3、
#include <iostream.h>
class A
{
private:
int a;
public:
A(int aa){a=aa;};
~A(){cout<<”Destructor A!”<<a<<endl;};
};
class B:public A
{
private:
int b;
public:
B(int aa = 0, int bb = 0):A(aa) {b = bb;};
~B(){cout<<”Destructor B!”<<b<<endl;};
};
void main()
{
B obj1(5), obj2(6,7);
return;
};
输出结果:Destrutor B!7
Destrutor A!6
Destrutor B!0
Destrutor A!5
4、
#include <iostream.h>
class A
{
public:
A(int i=0)
{m=i; cout<<”Constructor called.”<<m<<endl;} void Set(int i)
{m=i;}
void Print() const
{cout<<m<<endl;}
~A()
{cout<<”Destructor called.”<<m<<endl;}
private:
int m;
};
void main()
{
const int N=5;
A my;
my=N;
my.Print();
}
输出结果:Construtor called.0
Construtor called.5
5
Destrutor called.5
Destrutor called.5
第二部分(C++第10、11章)
一、单选题CAADD ADA
1、在C++中,类与类之间的继承关系具有( )。
A. 自反性
B. 对称性
C. 传递性
D. 反对称性
2、int Func(int,int);不可与下列哪个函数构成重载()。
A.INT FUNC(INT,INT,INT)
B.D OUBLE FUNC(INT,INT)
C.D OUBLE FUNC(DOUBLE,DOUBLE)
D.DOUBLE FUNC(INT,DOUBLE);
3、关于基类和派生类的描述中,错误的是()。
A.基类和派生类间是包含关系
B.派生类中可以定义自己的成员
C.基类成员在派生类中的访问权限与继承方式有关
D.一个派生类可以从一个基类派生,也可以从多个基类派生。
4、下列对运算符重载的描述中,正确的是( )。
A. 运算符重载可以改变结合性
B.运算符重载可以改变优先级
C.运算符重载可以改变操作数的个数
D.运算符重载不改变优先级和结合性
5、下列函数中,( )不能重载。
A. 成员函数
B. 非成员函数
C. 构造函数
D. 析构函数
6、当一个类某个函数被说明为virtual时,该函数在该类的所有派生类中( )。
A.都是虚函数
B.只有被重新说明时才识虚函数
C.只有被重新说明为virtual时才是虚函数
D.都不是虚函数
7、实现运行时的多态性采用( )
A. 重载函数
B. 构造函数
C. 析构函数
D. 虚函数
8、关于动态联编的下列描述中,( )是错误的。
A.动态联编是在编译时确定操作函数的
B.动态联编是以虚函数为基础的
C.动态联编是在继承的前提下的一种多态性
D.动态联编时要求类的继承是公有的
二、判断题FFTTF FFTTF
1.C++支持运算符重载,所有运算符都可以重载。
F
2.在公有继承中,基类中的公有成员和私有成员在派生类中都是可见的。
F
3.基类中的保护成员在其派生类中可以访问,而派生类对象不可访问。
T
4.运算符重载不能改变运算符的运算优先级、结合方向。
T
5.派生类的对象不可以给基类对象赋值。
F
6.静态联编是在运行时进行的,动态联编是在编译时进行的。
F
7. 派生类的构造函数中应包含直接基类的构造函数。
F
8.私有继承方式下,基类中公有成员和保护成员在派生类中都是私有的。
T
9.抽象类不能定义对象,可以定义对象引用和对象指针。
T
10.一个对象在创建时,总是要被初始化的。
F
三、写出下面程序的输出结果。
1、
#include <iostream.h>
class BASE
{ public:
void get( int i,int j,int k,int l )
{ a = i; b = j; x = k; y = l; }
void print()
{ cout << "a = "<< a << '\t' << "b = " << b << '\t'<< "x = " << x << '\t' << "y = " << y << endl;
}
int a,b;
protected:
int x, y;
};
class A: public BASE
{ public:
void get( int i, int j, int k, int l )
{ BASE obj3;
obj3.get( 50, 60, 70, 80 );
obj3.print();
a = i;
b = j; x = k; y = l;
u = a + b + obj3.a ; v = y - x + obj3.b;
}
void print()
{ cout << "a = " << a << '\t' << "b = " << b << '\t'<< "x = " << x << '\t' << "y = " << y << endl;
cout << "u = " << u << '\t' << "v = " << v << endl;
}
private:
int u, v ;
};
void main()
{ BASE obj1;
A obj2;
obj1.get( 10, 20, 30, 40 );
obj2.get( 30, 40, 50, 60 );
obj1.print();
obj2.print();
}
输出结果:a=50 b=60 x=70 y=80
a=10 b=20 x=30 y=40
a=30 b=40 x=50 y=60
u=120 v=70
2、
#include <iostream.h>
class A
{
public:
A(int i,int j)
{ a1=i; a2=j; }
virtual void Print()
{ cout<<a1+a2<<endl; }
protected:
int a1,a2;
};
class B:public A
{
public:
B(int i,int j):A(i,j)
{ }
void Print()
{ cout<<a1*a2<<endl; }
};
void fun(A &a)
{ a.Print(); }
void main()
{
int m=10,n=2;
B b(m,n);
fun(b);
}
输出结果:20
3、
#include <iostream.h>
class B
{
public:
B()
{}
B(int i)
{b=i;}
virtual void virfun()
{cout<<”B::virfun() called.\n”;} private:
int b;
};
class D:public B
{
public:
D()
{}
D(int i,int j):B(i)
{d=j;}
private:
int d;
void virfun()
{cout<<”D::virfun() called.\n”;} };
void fun(B *obj)
{
obj->virfun();
}
void main()
{
B *pb=new B;
fun(pb);
D *pd=new D;
fun(pd);
}
输出结果:D::virfun() called.
第三部分(VC++)
一、单选题CDBDB BADDC
1.下面关于API的描述错误的是()
A.API是用来控制Windows各个元素的外观和行为的一套预定义的Windows函数。
B .创建应用程序,打开窗口、描绘图形都要调用API函数。
C .Windows操作系统构建在API函数上
D.早期,windows程序员编写程序只能使用API函数
2.下面关于API的描述错误的是()
A.API函数构建在Windows操作系统上
B.创建应用程序,打开窗口、描绘图形都要调用API函数。
C.API是用来控制Windows各个元素的外观和行为的一套预定义的Windows函数D Windows应用程序构建在API函数上。
D.现在,Windows程序员编写程序只能使用API函数。
3.下面描述句柄的语句,错误的是()
A 句柄是WINDOWS用来标识被应用程序所建立或使用的对象的唯一整数
B 句柄中存放了Windows对象的数据
C 句柄能区分不同的应用程序对象
D.句柄具有多种类型
4.在Windows中,窗口句柄的类型是()
A.HINSTANCE
B. HFONT
C.HDC
D.HWND
5.在Windows中,字体句柄的类型是()
A.HINSTANCE
B. HFONT
C.HDC
D.HWND
6.对消息循环描述错误的是()
A.GetMessage函数在消息队列非空时,取得消息并返回。
B.若GetMessage取得的是WM_CLOSE消息则返回0,否则返回非0.
C.GetMessage函数在消息队列为空时,将一直空闲。
D.DispatchMessage 将当前消息发送到对应的窗口过程中去。
7.下面四个MFC类中哪一个是管理MFC应用程序的()
A. CWinApp
B. CMainFrame
C. CDocument
D. CView
8.下列类中不属于MFC框架基本类的是 ( )
A. CWinApp
B. CFrameWnd
C. CView
D. CObject
9.关于GDI的描述错误的是()
A.GDI指图像设备接口。
B.GDI 负责用户和绘图程序之间的信息交换
C.GDI控制在输出设备上显示图形或文字。
D.采用了GDI,编程时还需关心显示卡或打印机的驱动程序。
10.关于设备上下文的描述错误的是()
A.设备上下文是一种包含有关某个设备的绘制属性的Windows数据结构。
B.设备上下文允许在Windows中进行与设备无关的绘制。
C.设备上下文可以用于绘制到屏幕,打印机但不能绘制到图元文件。
D.设备上下文对象封装了绘制线条、形状和文本等的Windows API.
二、填空题
1.SendMessage 和PostMessage 都会向窗体发送一个消息,但SendMessage 将一条消息发送到指定窗口,立即处理而PostMessage 将一条消息投递到指定窗口的消息队列,不需要立即处理。
2.使用MFC AppWizard产生的应用程序的类型主要包括单文档应用程序、多文档应用程序、基于对话框的应用程序.
3、VC++的工作区窗口包含3个视图,分别是类视图,资源视图,文件视图。
4. 封装画刷的GDI类是CBrush ,封装画笔的GDI类是CPen ,封装字体的GDI 类是CFont ,封装位图的GDI类是CBitmap 。
5. Windows应用程序的消息来源主要包括系统消息和自定义消息
6.Windows应用程序的消息按处理方式主要包括命令消息、标准消息和通告消息。
7. 在V isual C++中,创建控件有两种方法:一种是静态创建,另一种是动态创建。
8、按钮控件对应CButton 类,静态文本控件对应CStatic 类,单选和复选按钮对应CCheckListBox 类。
9、在MFC的众多类中,CObject 是所有MFC类的原始基类。
10、消息处理函数OnLButtonDown响应左键按下消息。
三、简答题
1.什么是句柄?它在Windows程序中的作用是什么?
答:句柄,是整个windows编程的基础。
一个句柄是指使用的一个唯一的整数值,即一个四字节长的数值,来标志应用程序中的不同对象和同类对象中的不同的实例,诸如,一个窗口,按钮,图标,滚动条,输出设备,控件或者文件等。
应用程序能够通过句柄访问相应的对象的信息,但是句柄不是一个指针,程序不能利用它句柄来直接阅读文件中的信息。
如果句柄不用在I/O文件中,它是毫无用处的。
句柄是windows用来标志应用程序中建立的或是使用的唯一整数,windows使用了大量的句柄来标志很多对象。
2. CPaintDC,CClientDC,CWindowDC的区别?
答:CClientDC:
(1)(客户区设备上下文)用于客户区的输出,与特定窗口关联,可以让开发者访问目标窗口中客户区,其构造函数中包含了GetDC,析构函数中包含了ReleaseDC
CPaintDC:
(1)用于响应窗口重绘消息(WM_PAINT)是的绘图输出。
(2)CPaintDC在构造函数中调用BeginPaint()取得设备上下文,在析构函数中调用EndPaint()释放设备上下文。
EndPaint()除了释放设备上下文外,还负责从消息队列中清除WM_PAINT 消息。
因此,在处理窗口重画时,必须使用CPaintDC,否则WM_PAINT消息无法从消息队列中清除,将引起不断的窗口重画。
(3)CPaintDC也只能用在WM_PAINT消息处理之中。
CWindowDC:
(1)可在非客户区绘制图形,而CClientDC,CPaintDC只能在客户区绘制图形。
(2)坐标原点是在屏幕的左上角,CClientDC,CPaintDC下坐标原点是在客户区的左上角。
(3)关联一特定窗口,允许开发者在目标窗口的任何一部分进行绘图,包含边界与标题,这种DC同WM_NCPAINT消息一起发送。