资源描述
一、 填空题(20分)
1、 __构造函数___是特殊的成员函数,在创建和初始化对象时调用。
2、 _静态成员____是局部于类的成员,它提供一种同类对象的__共享____机制。
3、 运算符重载的作用是使运算符可以操作自定义的_类对象___,但重载后运算符原有的 _基本语义__不变。
4、 派生类不能访问基类的_私有__成员,但可以访问基类的公有成员和__保护___成员。
5、 具有__纯虚函数___的类称为抽象类。
6、 Windows应用程序是靠_消息_来驱动的,其主函数的重要任务是对窗口进行初始化工作和_消息循环__。
7、 MFC是用消息映射表来实现消息与__消息响应函数__之间的映射的,MFC通过__4____个宏来声明和实现消息映射表。
8、 在文档/视图结构的框架中,视图类_CView__类的对象用来显示数据并接受用户操作。文档类_CDocument__对象的作用是存储和管理数据。
9、 CPaintDC是_CDC__类中最常用的派生类,它只能使用在CView类的_OnDraw__函数中。
10、 消息WM_MOUSEMOVE的消息响应函数的函数名为_OnMouseMove___。
11、 资源是供Windows应用程序使用的特殊数据,它们驻留在硬盘上的_可执行文献__中。常用的资源有菜单、快捷键、__图标___、位图等。
12、 内存中的对象可以以文献的形式存储在永久性存储介质中,而当应用程序再把它从永久性存储介质读入后,该对象能恢复为本来的状态,则该对象称之为__永(持)久性对象___。
二、简述题(20分,每题5分)
(1)简述构成文档/视图结构应用程序框架的4个MFC派生类,并说出它们的功能。
答:假如工程名称为MyPrj,则MFC AppWizard会自动创建以下4个派生类来构成
应用程序的框架:CFrame类的派生类CMmainFrame、CWinApp类的派生类CMyPrjApp、CDocument类的派生类CMyPrjDoc和CMyPrjView。 其中,CMyPrjDoc类对象用来存储和管理应用程序中的数据;CMainFrame对象与CMyPrjView对象构成了应用程序的界面,CMainFrame对象只是CMyPrjView对象的容器,而CMyPrjView类的对象是用来显示文档与接受用户事件的;CMyPrjApp类的对象是应用程序的全局对象;它是应用程序中对象的容器;负责创建应用程序界面和消息循环。
(2)为什么拆分窗口的显示更新必须要同步?文档类的成员函数Update All Views的作用是什么?
答:由于应用程序的所有拆分窗口显示的应当是同一个文档,所以当文档发生变化时,该文档所相应的窗口当然要同时更新显示以对的地反映文档的内容。
文档类的成员函数Update All Views的作用是告知文档所相应的所有窗口同时进行重绘。
(3)如何才干使控件成为窗口的子窗口并且在窗口中可见?按钮控件能发明哪三种不同的形式?
答:为了使控件成为窗口的 子窗口并且在窗口中可见,两个控制样式的常数使所有控件都必须使用的,一个是WS_CHILD,另一个是WS_VISIBLE,前者使控件成为应用程序的 子窗口,后者使控件可见。在使用多个常数制定控件样式时,应当用符号"|"将其进行连接。
按钮控件能发明以下三种不同的形式:下压按钮、复选框、和单选按钮。
(4)如何把绘图工具载入设备描述环境进行绘画?请以画笔为例写出执行环节。
答:(1)创建画笔:CPen newPen(style,width,color);
(2) 把画笔载入DC: CPen *oldPen=pDC->SelectObject(&newPen);
(3)按规定进行绘画
(4)恢复旧画笔pDC->SelectObject(oldPen);
三、阅读下列程序,写出执行结果。(40分,每题5分)
1、#include<iostream.h>
class Abc
{public:
Abc( ){a=0; b=0; c=0;}
Abc(int i,int j,int k){a=i; b=j; c=k;}
void get(int&i,int&j,int&k){i=a; j=b; k=c;}
Abc operator * (Abc obj);
private:
int a,b,c;
};
Abc Abc::operator * (Abc obj)
{Abc tempobj;
tempobj.a=a*obj.a;
tempobj.b=b*obj.b;
tempobj.c=c*obj.c;
return tempobj;
}
void main()
{ Abc obj1(1,2,3),obj2(5,5,5),obj3;
int a,b,c;
obj3=obj1*obj2;
obj3.get(a,b,c);
cout<<”(obj1*obj2):\t”<<”a=”<<a<<’\t’<<”b=”<<b<<’\t’<<”c=”<<c<<’\t’<<endl;
(obj2 * obj3).get(a,b,c);
cout<<”(obj2*obj3):\t”<<”a=”<<a<<’\t’<<”b=”<<b<<’\t’<<”c=”<<c<<’\t’<<endl;
}
运营结果:
(obj1*obj2): a=5 b=10 c=15
(obj2*obj3): a=25 b=50 c=75
2、#include <iostream.h>
class BASE1
{public:
BASE1(int i){cout<<”调用基类BASE1的构造函数:”<<i<<endl;}
};
class BASE2
{public:
BASE2(int j){cout<<”调用基类BASE2的构造函数:”<<j<<endl;}
};
class A: public BASE1, public BASE2
{public:
A(int a,int b,int c,int d): BASE2(b), BASE1(c), b2(a),b1(d)
{cout<<”调用派生类A的构造函数;”<<a+b+c+d<<endl;}
private:
BASE1 b1;
BASE2 b2;
};
void main( )
{A ojb(11,22,33,44);}
运营结果:
调用基类Base1的构造函数:33
调用基类Base2的构造函数:22
调用基类Base1的构造函数:44
调用基类Base1的构造函数:11
调用派生类A的构造函数:110
3、#include <iostream.h>
template <typename T>
void fun(T&x,T&y)
{T temp;
temp=x; x=y; y=temp;
}
void fun(double x, int y)
{double temp;
temp=x; x=y; y=temp;
}
void main( )
{int i,j;
i=30; j=10;
fun(i,j);
cout<<”i=”<<i<<’\t’<<”j=”<<j<<endl;
double a,b;
a=1.23; b=3.21;
fun(a,b);
cout<<”a=”<<a<<’\t’<<”b=”<<b<<endl;
double m=10; int n=30;
fun(m,n);
cout<<”m=”<<m<<’\t’<<”n=”<<n<<endl;
}
运营结果:
i=10 j=30
a=3.21 b=1.23
m=10 n=30
4、#include <iostream.h>
void main( )
{double x=123.456;
cout.width(10);
cout.setf(ios::dec,ios::basefield);
cout<<x<<endl;
cout.setf(ios::left);
cout<<x<<endl;
cout.width(15);
cout.setf(ios::right,ios::left);
cout<<x<<endl;
cout.setf(ios::showpos);
cout<<x<<endl;
cout<<-x<<endl;
cout.setf(ios::scientific);
cout<<x<<endl;
}运营结果:
123.456 123.456 123.456
+123.456 -123.456 +1.234560e+002
5、#include <iostream.h>
enum BREED { GOLDEN, CAIRN, DANDIE, SHETLAND, DOBERMAN, LAB };
class Mammal
{public:
// constructors
Mammal():itsAge(2), itsWeight(5){}
~Mammal(){}
//accessors
int GetAge() const { return itsAge; }
void SetAge(int age) { itsAge = age; }
int GetWeight() const { return itsWeight; }
void SetWeight(int weight) { itsWeight = weight; }
//Other methods
void Speak()const { cout << "Mammal sound!\n"; }
void Sleep()const { cout << "shhh. I'm sleeping.\n"; }
protected:
int itsAge;
int itsWeight;
};
class Dog : public Mammal
{public:
// Constructors
Dog():itsBreed(GOLDEN){}
~Dog(){}
// Accessors
BREED GetBreed() const { return itsBreed; }
void SetBreed(BREED breed) { itsBreed = breed; }
// Other methods
void WagTail() const { cout << "Tail wagging...\n"; }
void BegForFood() const { cout << "Begging for food...\n"; }
private:
BREED itsBreed;
};
int main()
{Dog fido;
fido.Speak();
fido.WagTail();
cout << "Fido is " << fido.GetAge() << " years old\n";
return 0;
}
运营结果:Mammal sound!
Tail wagging …
Fido is 2 years old
6、#include<iostream.h>
class Base
{public: void who(){cout<<”Base class”<<endl;};
class Derived1: public Base
{public: void who(){cout<<”Derived1 class”<<endl;};
class derived2: public Base
{public: void who(){cout<<”Derived2 class”<<endl;
Void main()
{base obj1, *p; derived1 obj2; derived2 obj3;
P=&obj1; p->who();
P=&obj2; p->who();
P=&obj3; p->who();
Obj1.who(); Obj2.who(); Obj3.who();
}
结果:base class
Base class
Base class
Base class
Derived1 class
Derived2 class
7、#include<iostream.h>
class example
{ private:
int date; static int count;
public:
example(int y=10):date(y)
{ cout<<”date=”<<date<<endl;
Count++;}
static int display() {return count;}
};
int example::count=0;
void main()
{example e1; example e2(20);
cout<<e1.Display()<<endl;
cout<<e2.Display()<<endl;
cout<<example::Display()<<endl;
}
运营结果:Date=10 Date=20 2 2 2
8、指出下列程序中的错误,并说明理由
#include<iostream.h>
class Student
{ public:
void Student(){};//构造函数有返回类型错,函数后面多分号void Display()
{cin>>name>>number;cout<<姓名<<name<<学号<<number<<endl;} //字符串缺少双引号
private: char *name=noname; //数据成员不能赋值
int number=0; //数据成员不能赋值
};
四、编程题:(20分,每题10分)
1、 编写一个程序,实现小型公司的工资管理。该公司重要有4类人员:经理、兼职技术人员、销售员和销售经理。规定存储这些人员的编号、姓名和月工资,计算月工资并显示所有信息。月工资计算办法是:经理拿固定月薪8000元,兼职技术人员按每小时100元领取月薪,销售员按当月销售额的4%提成,销售经理既拿固定月工资又拿销售提成,固定月工资为5000元,销售提成为所管部门当月销售总额的0.5%。规定补充未完毕的代码,使其成为一个完整的程序。
#include <iostream.h>
class Employee
{public:
employee(){cout<<”职工编号、姓名”; cin>>no>>name; salary=0;}
void Pay(){} void Display(){}
Protected: Int no; char name[10]; float salary;};
Class technician: public Employee //派生技术人员
{ public:Technician() {hourlyrate=100.0;}
void Pay(){cout<<name<<”本月工作时数:” cin>>workhours;
salary=hourlyrate*workhours; }
void Display(){cout<<”兼职技术人员”<<name<<”(编号为”<<no<<”)”本月工资:”<<salary<<endl; }
private: //补充下面内容
float hourlyrate int workhours;};
Class Saleman: public Employee //派生销售员类
{ public: Salesman(){ commrate=0.04f;} //销售提成比例
void Pay() {cout<<name<<”本月销售额:”; //补充下面内容
cin>>sales; salary=sales*commrate;} void Display()
{cout<<”销售员”<<name<<”(编号为”<<no<<”)”本月工资:”<<salary<<endl; }
Protected: Float commrate; sales;};
Class Manager: virtual public Employee
{ public: Manager(){ monthlypay=8000; } //补充函数体内容
Void Pay(){ salary=monthlypay; } //补充函数体内容
void Display()
{cout<<”经理”<<name<<”(编号为”<<no<<”)”本月工资:”<<salary<<endl; }
Protected: float monthlypay;};
Class SalesManager: public Manager, public Salesman //补充此处类的内容
{ public:
SalesManager(){ monthlypay=5000; Commrate=0.005f; }
void Pay(){cout<<name<<”所管部门月销售额:”;
cin>>sales; salary=monthlypay+sales*commrate;}
void Display(){cout<<”销售经理”<<name<<”(编号为”<<no<<”)”本月工资:”<<salary<<endl; }void main()
{ manager m1; Technician t1; Salesman s1; Salesmanager sm1;
m1.pay(); m1.display(); t1.pay(); t1.display();
s1.pay(); s1.display(); sm1.pay(); sm1.display();}
2、定义一个时间类Time,能提供和设立由时、分、秒组成的时间,并编出应用程序,规定涉及定义时间对象,设立时间,运营时间上加1秒的操作,输出该对象的时间,输出格式为××:××:××AM(例如:11:20:15AM,上午11时20分15秒)(答案略)
展开阅读全文