2016-2017年度面向对象程序设计试卷

  • 格式:doc
  • 大小:253.00 KB
  • 文档页数:14

华中科技大学研究生课程考试试卷□√公共课□√开卷面向对象程序设计课程名称:课程类别考核形式□专业课□闭卷学生类别______________考试日期______________ 院系_______________2017 年1 月9 日学号__________________姓名__________________任课教师___________________杨卫东、左峥嵘一、填空(共15 分,每空 1 分)1、编译时的多态性通过__重载__函数实现。

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

3、假定AB为一个类,则执行“AB a(10), *b=&a, &p=a; ”语句时调用该类构造函数的次数为 2 。

4、C++类成员访问属性public 、private 、protected 三种类型。

5、非成员函数应声明为类的__友元___函数才能访问这个类的private 成员。

6、。

要实现动态联编必须通过对象指针或引用来调用_虚函数_实现。

7、类B是由类A以保护方式派生的,则类A中私有访问属性的数据成员在类B中的访问属性为不可访问。

8、+、=、[] 、->等四种运算符中,可采用友元函数重载的运算符是+ 。

9、抽象类是指具有纯虚函数的类,它只能作为基类来使用。

1/ 8二、问答题(共30 分,每小题 6 分)1.简述运算符重载的实现方式有哪几种?给出对应的声明语法形式。

答案:(1)类外定义的运算符重载函数格式为:friend < 返回类型> operator <op>(< 类型> 参数1,<类型> 参数2){ < 函数体> }(2)成员运算符重载函数<返回类型> <类名>::operator <op> (< 类型> 参数){ < 函数体> }2.什么是多继承?多继承时,构造函数和析构函数执行顺序是怎样的?答案:多继承是指派生类具有多个基类,派生类与每个基类之间的关系仍可看作是一个单继承。

派生类构造函数的执行顺序是先执行所有基类的构造函数(顺序按照定义派生类时指定的各基类顺序),再执行派生类的构造函数,析构函数执行顺序,与构造函数完全相反。

3.写出下面程序的运行结果#include <iostream>#include <string>using namespace std;class Person{public:Person(char *nam,int ag){ strcpy(name,nam); age = ag;cout<<"Person 类构造函数---"<<name<<endl;}Person(char *nam){ strcpy(name,nam);cout<<"Person 类构造函数(char *nam)---"<<name<<endl;}~Person(){cout<<"Person 类析构函数---"<<name<<endl; }void display(){cout<<" 姓名:"<<name<<endl;}protected:char name[100];int age;};class Teacher: public Person // 声明Teacher( 教师) 类{public: // 公用部分Teacher(char *nam,int a,char *t):Person(nam,a) // 构造函数{ strcpy(title,t);cout<<"Teacher 类构造函数"<<endl;}~Teacher(){cout<<"Teacher 类析构函数"<<endl;}void display1() // 输出教师有关数据{cout<<" 姓名:"<<name<<endl;cout<<" 年龄"<<age<<endl;cout<<" 职称:"<<title<<endl;}protected: // 保护部分char title[10]; // 职称};3/ 8class Student: public Person{public:Student(char *nam,char s,float sco):Person(nam){ sex=s; score=sco;cout<<"Student 类构造函数---"<<name<<endl; }Student(char *nam, char s):Person(nam){ sex=s;cout<<"Student 类构造函数--- 班长:"<<name<<endl;}~Student(){cout<<"Student 类析构函数---"<<name<<endl;}void display2() // 输出学生有关数据{cout<<" 姓名:"<<name<<endl;cout<<" 性别:"<<sex<<endl;cout<<" 成绩:"<<score<<endl; }char *get_name(){return name;}protected: // 保护部分char sex;float score; // 成绩};class Graduate: public Teacher, public Student{public:Graduate(char *nam,int a,char s,char *t,float sco,floatw):Teacher(nam,a,t),Student(nam,s,sco),wage(w),monitor("Li Ming",'m') {4/ 8cout<<"Graduate 类构造函数"<<endl;}~Graduate(){cout<<"Graduate 类析构函数"<<endl; }void show( ) // 输出人员的有关数据{cout<<"name:"<<Student::name<<endl;cout<<"age:"<<Student::age<<endl;cout<<"sex:"<<sex<<endl;cout<<"score:"<<score<<endl;cout<<"title:"<<title<<endl;cout<<"wages:"<<wage<<endl;cout<<"monitor:"<<monitor.get_name()<<endl;}Student monitor;private:float wage; // 工资};class Doctor:public Graduate{public:Doctor(char *nam,int a,char s,char *t,float sco,float w,char *tutor):Graduate(nam,a,s,t,sco,w){ strcpy(tutor_name, tutor);cout<<tutor_name<<endl; }private:char tutor_name[20];};int main(){Doctor d("Wang-li",24,'f',"assistant",89.5,1234.5,"Wang-wu");return 0; }5/ 8答案:Person 类构造函数---Wang-liTeacher 类构造函数Person 类构造函数(char *nam)---Wang-li Student 类构造函数---Wang-liPerson 类构造函数(char *nam)---Li Ming Student 类构造函数--- 班长:Li Ming Graduate 类构造函数Wang-wuGraduate 类析构函数Student 类析构函数---Li MingPerson 类析构函数---Li MingStudent 类析构函数---Wang-liPerson 类析构函数---Wang-liTeacher 类析构函数Person 类析构函数---Wang-li4.写出下面程序的运行结果#include <iostream>#include <string.h>using namespace std;class A {char string[80];public :void show();A(char * st);~A( );};A::A(char * st){ strcpy(string, st);cout << string << "[ 构造]" << endl;}A::~A( ){ cout << string << "[ 析构]" << endl; } void A::show(){cout << string << endl;}void fun( ){cout << "1 fun 内" << endl;A fun_Obj("2 fun 内自动对象fun_Obj");static A fun_sta_Obj("3 fun 内静态对象fun_sta_Obj"); }void main( ){A *ptrA = new A("4 main 内动态分配对象m_all_Obj");if(ptrA==NULL) return;ptrA->show();cout<<"5 main 内调用fun 函数"<< endl;fun( );delete ptrA;}A g_glb_Obj("6 外部对象g_glb_Obj");static A g_sta_Obj("7 外部静态对象g_sta_Obj");答案:6 外部对象g_glb_Obj[ 构造]7 外部静态对象g_sta_Obj[ 构造]4 main 内动态分配对象m_all_Obj[ 构造]4 main 内动态分配对象m_all_Obj5 main 内调用fun 函数1 fun 内2 fun 内自动对象fun_Obj[ 构造]3 fun 内静态对象fun_sta_Obj[ 构造]2 fun 内自动对象fun_Obj[ 析构]4 main 内动态分配对象m_all_Obj[ 析构]3 fun 内静态对象fun_sta_Obj[ 析构]5.写出下面程序的输出结果#include <iostream>using namespace std;class A{public:virtual void Print(int a, int b=5){ cout << "a = " << a << " , b = " << b << endl; } };class B : public A {public:virtual void Print(int a){ cout << "a = " << a << endl; }virtual void Print(int a, double d){ cout << "a = " << a << " , d = " << d << endl; } };void Show(A * p){p -> Print( 2, 6.9 );p -> Print( 2 );}void main( ){A * pa = new A;B * pb = new B;Show(pa);Show(pb);delete pa;delete pb;}答案:a = 2 , b = 6a = 2 ,b = 5a = 2 ,b = 6a = 2 ,b = 56. 以下程序代码是否有错,如有请改正并写出运行结果#include <iostream.h>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<<mt.getx()<<endl; cout<<mt.gety()<<endl;}答案:int x,y=20; 在类内部不能对数据成员直接赋值。