面向对象程序设计(附答案)
东莞理工学院(本科)试卷(B卷)
2012 --2013学年第二学期
没有参考答案,答案纯手打,错了勿喷
《面向对象程序设计》试卷
开课单位: 计算机学院,考试形式:闭卷,允许带 入场
题序 一 二 三 四 五 六 总 分 得分 评卷人 一.单项选择题 (15小题,每小题2分,共30分,请将正确答案填写在以下对应的答题表格中) 题号 1 2 3 4 5 6 7 8 9 10 答案 题号 11 12 13 14 15 答案
1、关于C++与C语言关系的描述中,( )是错误的。
A.C语言是C++语言的一个子集 B.C语言与C++语言是兼容的 C.C++语言对C语言进行了一些改进 D.C++语言和C语言都是面向对象的 2、已知:int m=10; 下列表示引用的方法中,( )是正确的。
A.int &x=m; B.int &y=10; C.int &z; D.float &t=&m; 3、考虑下面的函数原型声明:void testDefaulParam(int a,int b=7,char z='*'); 下面函数调用中,不合法的是( )。
A.testDefaulParam(5); B.testDefaulParam(5,8); C.testDefaulParam(5,'#'); D.testDefaulParam(0,0,'*');
4、系统在调用重载函数时往往根据一些条件确定哪个重载函数被调用,在下列选项中,不能作为依据的是( )。[答案改过]
A.函数的返回值类型 B.参数的类型 C.函数名称 D.参数个数 5、下列有关C++类的说法中,不正确的是( )。【答案修改】
《面向对象程序设计》试卷 第1页 共9页
A.类是一种用户自定义的数据类型
B.只有类中的成员函数或类的友元函数才能存取类中的私有成员 C.在类中,如果不做特别说明,所有成员的访问权限均为私有的 D.在类中,如果不做特别说明,所有成员的访问权限均为公用的
6、已知X类,则当程序执行到语句X array[3];时,调用了( )次构造函数。 A.0 B.1 C.2 D.3 7、有关析构函数的说法,不正确的是( )。 A.析构函数有且仅有一个
B.析构函数和构造函数一样可以有形参
C.析构函数的功能是在系统释放对象之前作一些内存清理工作 D.析构函数无任何函数类型
8、类定义的内容允许被其对象无限制地存取的是( )。
A.private 部分 B. protected 部分 C.public 部分 D.以上都不对 9、关于常数据成员的说法,不正确的是( )。
A.常数据成员的定义形式与一般常变量的定义形式相同,只不过常数据成员的定义必须出现在类体中
B.常数据成员必须进行初始化,并且不能被更新 C.常数据成员通过构造函数的成员初始化列表进行初始化 D.常数据成员可以在定义时直接初始化
10、运用运算符delete删除一个动态对象时( )。
A.系统首先为该动态对象调用构造函数,再释放其占用的内存 B.系统首先释放该动态对象占用的内存,再为其调用构造函数 C.系统首先为该动态对象调用析构函数,再释放其占用的内存 D.系统首先释放动态对象占用的内存,再为其调用析构函数
11、可以在类外用p.a的形式访问派生类对象p的基类成员a,其中a是( )。 A.私有继承的公用成员 B.公用继承的私有成员 C.公用继承的保护成员 D.公用继承的公用成员
12、在公用继承方式下,有关派生类对象和基类对象的关系,不正确的叙述是( )。 A.派生类的对象可以赋给基类的对象 B.派生类的对象可以初始化基类的引用
《面向对象程序设计》试卷 第2页 共9页
………………………… … … … … 线 :…业…专…级…年… … … … … … … … :…别…系… 封 … … … … … … … … … … :…号…学… … … … … … 密 … …:名…姓………………………………………
C.派生类的对象可以直接访问基类中的成员 D.派生类的对象的地址可以赋给指向基类的指针 13、设置虚基类的目的是( )。
A.简化程序 B.消除二义性 C.提高运行效率 D.减少目标代码 14、在C++中,用于实现动态多态性的是( )。
A.内联函数 B.重载函数 C.模板函数 D.虚函数 15、下列运算符中,( )运算符在C++中不能被重载。
A.&& B.[] C.:: D.new
二.填空题(每题2分,共20分)
1、对象的核心概念就是通常所说的 继承 、封装和多态性 。
2、在C++中,三种继承方式的说明符号为public、private和protected,如果不加说明,则默认的继承方式为 private 。
3、如果只想保留公共基类的一个复制,就必须使用关键字 virtual 把这个公共基类声明为虚基类。
4、若要把void fun()定义为类A的友元函数,则应在类A的定义中加入语句 friend void fun(); 。
5、类的静态成员分为静态数据成员和 静态成员函数 。 6、运算符重载要求保持其原来的操作数个数、结合性、 优先级 和语法结构。 7、列出C++中的两种代码复用方式: 继承 和组合或模板。 8、列出C++中两种用户自定义的数据类型: 类 、结构体。
9、构造函数的作用是 创建对象时初始化对象的数据成员 。
10、后置自增运算符“++”重载为类的成员函数(设类名为A)的形式为 A operator++(int); 。
三.判断题,对的打T错的打F。(5小题,每小题2分,共10分)
1.在public继承方式下,基类中被说明为protected和private的成员只能被其派生类的成员函数访问,不能被其它的函数访问。(×)友元函数
《面向对象程序设计》试卷 第3页 共9页
…………………………………
2. 一个类中的成员函数重载(overload)可以用const修饰符、函数原型的参数个数、对应位置的参数的类型和返回值类型为依据。( × )
3. 在任何形式的继承方式(public、protected和private)下,基类类型的指针都可以指向其派生类对象。( × )只有public继承
4. 在静态成员函数的实现代码体内不能使用this指针,在非静态的成员函数实现代码体内可以使用this指针。(√)
5. 构造函数的初始化列表中的内容,不会影响构造对象中成员数据的初始化顺序。( √)。
四.程序填空(每题6分,共18分)
根据程序的功能描述,将程序下划线空白处内容补充完整(每空白3分) 1、将程序下划线空白处内容补充完整,使类定义完整(每空白3分) class line; class box{ private:
int color; int upx,upy; int lowx,lowy; public:
friend int same_color(line l, box b ); void set_color(int c){color =c;}
void define_box(int x1,int y1,int x2,int y2) {upx=x1;upy=y1;lowx=x2;lowy=y2;} };
class line{ private:
int color;
int startx,starty; int endx,endy; public:
friend int same_color(line l,box b); void set_color(int C){color=c;}
void define_line(int x1,int y1,int x2,int y2) {startx=x1;starty=y1;endx=x2;endy=y2;} };
《面向对象程序设计》试卷 第4页 共9页
……………………………………………密………………………………………………封………………………………………线……………………………………………………………………
int same_color(line l,box b){ if (l.color==b.color) return l; return 0; }
2、A为抽象类,输出为: this is class B printing this is class C printing
根据程序的功能描述,将程序下划线空白处内容补充完整。(每空白3分) #include virtual void printMe(){cout<<\"this is class A printing\"< void printMe(){cout<<\"this is class C printing\"< void main(){ B b; C c; print(b); print(c); } 3、将程序下划线空白处内容补充完整,使类完整。(每空白3分) class base{ protected: int a; public: base(){a=0;} base(int i){a=i} base(base&b){a=b.a}}; class derived:public base{ private: int d; public: derived(){d=0;} derived(int i,int j): base(i) {d=j;} 《面向对象程序设计》试卷 第5页 共9页 姓名: 学号: 系别: 年级专业: derived(derived&b): base(b) {d=b.d;} }; 五、程序执行(每题5分,共10分) 阅读下面的程序,并分别写出程序执行的完整输出结果。 1. #include Date(int,int,int); Date(int,int); Date(int); Date(); void display(); private: int month, day, year; }; Date::Date(int m,int d,int y):month(m),day(d),year(y) { } Date::Date(int m,int d):month(m),day(d) {year=2009;} Date::Date(int m):month(m){day=1; year=2010; } Date::Date() {month=1; day=1; year=2010; } void Date::display(){cout< 《面向对象程序设计》试卷 第6页 共9页 ………… ……… d4.display(); …… return 0; } …输出结果: … …12/31/2009 … 线12/31/2009 :…业…1/1/2010 专…级…1/1/2010 年… … … …2. #include 别…系… A(){cout<<\"constructing A \"< …………………《面向对象程序设计》试卷……………………第7页 共9页 destructing C destructing B destructing A 六、程序设计(12分) 已知复数类Complex的声明如下: class Complex {public: Complex(); //无参构造函数 Complex(double ); //转换构造函数 Complex(double, double);//有两个形参的构造函数 friend Complex operator+(Complex&, Complex&); //对“+”运算符进行重载 friend ostream& operator<<(ostream&, Complex&); //对“<<”运算符进行重载 friend istream& operator>>(istream&, Complex&); //对“>>”运算符进行重载 private: double real,imag; }; 要求:(1)写出该类的所有构造函数的类外定义代码。 (2)写出对运算符“+”、“<<”、“>>”进行重载的运算符重载函数的定义。 解: (1) 该类的所有构造函数的类外定义代码如下: Complex::Complex() { ………线…………………………………… real=0; imag=0; } Complex::Complex(double i) { real=i; 《面向对象程序设计》试卷 第8页 共9页 专业: imag=i; } Complex::Complex(double i, double j) { real=i; imag=j; } (2)运算符“+”、“<<”、“>>”进行重载的运算符重载函数的定义如下: Complex operator +(Complex &a, Complex & b) { return Complex(a.real+b.real,a.imag+b.imag); } ostream &operator<< (ostream &out ,Complex &a )//修改过 { } istream &operator>>( istream &in ,Complex &a )//修改过 { } in >> a.real >> a.imag; return in; out << a.real<< a.imag; return out; 《面向对象程序设计》试卷 第9页 共9页 因篇幅问题不能全部显示,请点此查看更多更全内容