北京化工大学《面向对象程序设计》期末考试试题&解析 (上)



一、判断题

  1. 返回值类型、参数个数和类型都相同的函数也可以重载。

    答案:×
    解析:函数重载要求函数有不同的参数类型或参数个数。仅返回值不同无法构成重载。
    
    例子:
    int func(int a);
    double func(int a); // 这是非法的重载,因为参数相同,仅返回类型不同
  2. ​​友元函数是类的成员函数,所以可以存取或修改该类中的私有成员。

    答案:×
    解析:友元函数虽然可以访问类的私有成员,但它不是类的成员函数。
    
    例子:
    class MyClass {
        friend void friendFunction(MyClass &obj); // friendFunction 是友元函数
        private:
            int privateData;
    };
    
    void friendFunction(MyClass &obj) {
        obj.privateData = 10; // 可以访问私有成员
    }
  3. 在同一个类中,可以定义重载的成员函数 void f(int); 和 virtual void f(int);

    答案:×
    解析:virtual 关键字并不会改变函数签名,因此无法通过这种方式实现函数重载。
    
    例子:
    class MyClass {
        void f(int); // 成员函数
        virtual void f(int); // 错误:无法重载
    };
  4. 多继承情况下,派生类的构造函数的执行顺序取决于定义派生类时所指定的各基类的顺序,而与派生类构造函数中所定义的成员初始化列表的各项顺序无关。
    答案:√
    解析:构造函数的执行顺序由基类在派生类中的声明顺序决定。
    
    例子:
    class Base1 {};
    class Base2 {};
    class Derived : public Base1, public Base2 {
        Derived() : Base2(), Base1() {} // 基类的构造顺序是先Base1再Base2
    };
  5. 代码语句 A a1 = a2;触发的是类 A 的拷贝构造函数而非赋值运算符函数。
    答案:√
    解析:在对象声明时用另一个对象初始化,会调用拷贝构造函数。
    
    例子:
    class A {
        A(const A&); // 拷贝构造函数
    };
    A a1;
    A a2 = a1; // 调用拷贝构造函数
  6. 如果类 A 的声明代码中未定义构造函数,则代码语句 A a; 一定会报错。
    答案:×
    解析:如果没有定义构造函数,编译器会生成一个默认的无参构造函数,因此不会报错。
    
    例子:
    class A {};
    A a; // 不会报错,使用编译器生成的默认构造函数
  7. 抽象类指的是包含纯虚函数的类,抽象类无法用于实例化对象。
    答案:√
    解析:抽象类包含纯虚函数,不能直接实例化。
    
    例子:
    class AbstractClass {
        virtual void pureVirtualFunction() = 0; // 纯虚函数
    };
    AbstractClass obj; // 错误:不能实例化抽象类
  8. C++语言程序代码是由函数和类构成的,其中类是对象的抽象、函数是过程的抽象,所以 C++语言是不完全的面向对象程序设计语言。
    答案:√
    解析:C++既支持面向对象编程,也支持面向过程编程。
    
    例子:
    class MyClass {
        void memberFunction() {} // 类和成员函数表示面向对象
    };
    
    void globalFunction() {} // 全局函数表示面向过程
  9. 一个类可以定义多个构造函数,但只能定义一个析构函数。
    答案:√
    解析:构造函数可以重载,但析构函数不允许重载,每个类只能有一个析构函数。
    
    例子:
    class MyClass {
        MyClass() {} // 构造函数
        MyClass(int a) {} // 重载的构造函数
        ~MyClass() {} // 析构函数
    };
  10. 在保护继承方式下,基类中保护成员在派生类中转为公有成员。
    答案:×
    解析:在保护继承下,基类的保护成员在派生类中仍然是保护成员。
    
    例子:
    class Base {
        protected:
            int protectedData;
    };
    class Derived : protected Base {
        void access() {
            int data = protectedData; // 仍然是保护成员
        }
    };

二、单项选择题

1.下面关于 return 语句的描述中,错误的是(D):

  • A、被调用的函数可以不使用 return 语句
  • B、被调用函数可以使用多个 return 语句
  • C、被调用函数中,如果有返回值就一定要使用 return 语句
  • D、被调用函数可以使用 return 语句返回多个值给调用函数
    答案:D
    解析:C++函数不能通过 return 语句返回多个值。
    
    例子:
    int func() {
        return 1; // 返回单个值
    }

2.下列哪一项具有对当前类私有成员的访问权限(C):

  • A、当前类的对象
  • B、派生类对象引用
  • C、当前类的成员函数
  • D、基类指针
    答案:C
    解析:只有当前类的成员函数可以访问私有成员。
    
    例子:
    class MyClass {
        private:
            int privateData;
        public:
            void memberFunction() {
                privateData = 10; // 访问私有成员
            }
    };

3.副本(拷贝)构造函数的形参原则上要求是(D):

  • A、对象名
  • B、对象的成员名
  • C、对象的指针
  • D、对象的引用
    答案:D
    解析:拷贝构造函数的参数应该是对象的引用,以避免递归调用构造函数。
    
    例子:
    class MyClass {
        MyClass(const MyClass& other); // 拷贝构造函数
    };

4.(A)是拥有属性和行为或方法的实体:

  • A、对象
  • B、类
  • C、方法
  • D、构造方法
    答案:A
    解析:对象是类的实例,拥有属性和方法。
    
    例子:
    class MyClass {
        int attribute; // 属性
        void method() {} // 方法
    };
    
    MyClass obj; // 对象

5.当在类中定义两个及以上方法,这些方法有相同的名称但参数列表不同时,这称为(D):

  • A、继承
  • B、多态性
  • C、构造方法
  • D、函数重载
    答案:D
    解析:这被称为函数重载。
    
    例子:
    class MyClass {
        void method(int a) {}
        void method(double b) {} // 函数重载
    };

6.(B)修饰符允许对类成员的访问不依赖于该类的任何对象:

  • A、protected
  • B、static
  • C、return
  • D、public
    答案:B
    解析:static 修饰符使成员独立于任何对象。
    
    例子:
    class MyClass {
        static int staticData;
    };
    int MyClass::staticData = 0; // 静态成员独立于对象

7.用 static 修饰符描述的数据成员,其初始化必须在(B):

  • A、类内
  • B、类外
  • C、在构造函数内
  • D、静态成员函数内
    答案:B
    解析:静态成员变量的初始化必须在类外。
    
    例子:
    class MyClass {
        static int staticData;
    };
    int MyClass::staticData = 0; // 类外初始化

8.针对 C++语言多态性,以下选项中,实现多态性方式与其他选项不同的是(C):

  • A、函数重载
  • B、模板
  • C、虚函数
  • D、运算符重载
    答案:C
    解析:虚函数实现的是运行时多态性,而其他选项实现的是编译时多态性。
    

9.以下情形中,不会出现二义性问题的是(B):

  • A、多个函数具有相同函数名,但返回值类型不同
  • B、多个函数具有相同函数名,但形参类型不同
  • C、继承多个基类,不同基类中具有相同成员名
  • D、继承多个基类,而基类中有多个基类由同一个类派生而来
    答案:B
    解析:多个函数具有相同函数名但形参类型不同,不会导致二义性。
    
    例子:
    class MyClass {
        void method(int a) {}
        void method(double b) {} // 不会产生二义性
    };

10.关于虚函数描述不正确的是(D):

  • A、虚函数是用 Virtual 关键字修饰的
  • B、对虚函数的调用都是动态联编
  • C、Virtual 关键字提示编译器该函数进行动态联编
  • D、只有当访问虚函数是通过基类指针(或引用)时才可获得运行时的多态性
    答案:D
    解析:虚函数的动态联编需要通过基类指针或引用来实现多态性。
    
    例子:
    class Base {
        virtual void virtualFunction() {}
    };
    class Derived : public Base {
        void virtualFunction() override {}
    };
    Base *ptr = new Derived();
    ptr->virtualFunction(); // 动态联编

三、填空题

  1. 静态成员函数没有隐含的 ① this指针 ,所以,在 C++程序中,静态成员函数主要用来访问静态数据成员,而不访问非静态成员。
  2. 如果只想保留公共基类的一个复制,就必须使用关键字 ② virtual 把这个公共基类声明为虚基类。
  3. 从实现的角度来讲,多态性可以划分为两类: ③ 编译时多态 和 ④ 运行时多态
  4. 列出 C++中的两种代码复用方式: ⑤ 继承 和 ⑥ 模版?组合?(不知道正确答案 。
  5. 面向对象程序设计中,类的两种特殊成员函数在未定义的情况下可直接调用,它们是: ⑦ 构造 函数和 ⑧ 析构 函数。
  6. 面向对象程序设计中,客观世界中的事物都是对象,其中对象的 ⑨ 属性 用于描述其静态特征、 ⑩ 方法 用于描述其动态特征。

面向对象程序设计》试题 一、单选题(每空2分,共40分) 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 DefPar(int a, int b=7, char z = '*'); 下面函数调用中,不合法的是( )。 A.DefPar(5); B.DefPar(5,8); C.DefPar(5,'#'); D.DefPar(0,0,'*'); 4、系统在调用重载函数时往往根据一些条件确定哪个重载函数被调用,在下列选项中,不能作为依据的是( )。 A.函数的返回值类型 B.参数的类型 C.函数名称 D.参数个数 5、下列有关C++类的说法中,不正确的是( )。 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.派生类的对象可以初始化基类的引用 C.派生类的对象可以直接访问基类中的成员 D.派生类的对象的地址可以赋给指向基类的指针 13、设置虚基类的目的是( )。 A.简化程序 B.消除二义性 C.提高运行效率 D.减少目标代码 14、在C++中,用于实现动态多态性的是( )。 A.内联函数 B.重载函数 C.模板函数 D.虚函数 15、不能说明为虚函数的是( )。 A.析构函数 B.构造函数 C.类的成员函数 D.以上都不对 16、如果一个类至少有一个纯虚函数,那么就称该类为( )。 A.抽象类 B.派生类 C.纯基类 D.以上都不对 17、下面关于友元的描述中,错误的是( )。 A.友元函数可以访问该类的私有数据成员 B.一个类的友元类中的成员函数都是这个类的友元函数 C.友元可以提高程序的运行效率 D.类与类之间的友元关系可以继承 18、下列运算符中,( )运算符在C++中不能被重载。 A.&& B.[ ] C.:: D.new 19、模板的使用实际上是将类模板实例化成一个( )。 A.函数 B.对象 C.类 D.抽象类 20、假定MyClass为一个类,则该类的拷贝构造函数的声明语句为( )。 A.MyClass(MyClass x) B.MyClass&(MyClass x) C.MyClass(MyClass &x) D.MyClass(MyClass *x) 二、填空题(前16个空,每空1分,后2个空,每空2分,共20分) 1、类和对象的关系可表述为:类是对象的 ,而对象则是类的 。 2、在C++中,三种继承方式的说明符号为 、 和 ,如果不加说明,则默认的继承方式为 。 3、如果只想保留公共基类的一个复制,就必须使用关键字 把这个公共基类声明为虚基类。 4、若要把void fun( )定义为类A的友元函数,则应在类A的定义中加入语句 。 5、类的静态成员分为 和 。 6、运算符重载要求保持其原来的操作数个数、 、 和语法结构。 7、通过关键字 可以声明模板,通过关键字 指定函数模板的类型参数,有几个类型参数就有几个类型关键字。 8、列出C++中两种用户自定义的数据类型: 、 。 9、构造函数的作用是 。 10、后置自增运算符“++”重载为类的成员函数(设类名为A)的形式为 。 三、阅读下面3个程序,写出程序运行时输出的结果:(共13分) 1、#include <iostream> using namespace std; void fun(int &a,int &b) { int p; p=a; a=b; b=p; } void exchange(int &a,int &b,int &c) { if(a<b) fun(a,b); if(a<c) fun(a,c); if(b<c) fun(b,c); } void main() { int a=12,b=89,c=56; exchange(a,b,c); cout<<"a="<<a<<",b="<<b<< ",c="<<c<<endl; } 2、#include <iostream> using namespace std; class Date { public: 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 <<month<<"/"<<day<<"/"<<year<<endl; } void main() { Date d1(12,31,2009); Date d2(12,31); Date d3(1); Date d4; d1.display(); d2.display(); d3.display(); d4.display(); } 3、#include <iostream> using namespace std; class A { public: A() { cout<<"constructing A "<<endl; } ~A() { cout<<"destructing A "<<endl; } }; class B: public A { public: B() { cout<<"constructing B "<<endl; } ~B() { cout<<"destructing B "<<endl; } }; class C : public B { public: C() { cout<<"constructing C "<<endl; } ~C() { cout<<"destructing C "<<endl; } }; void main() { C c1; } 四、编程题(共27分) 1、(10分)已知复数类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)写出对运算符“+”、“<<”、“>>”进行重载的运算符重载函数的定义。 2、(17分)下列Base类是一个表示形状的抽象类,area( )为求图形面积的函数,total( )则是一个通用的用以求不同形状的图形面积总和的函数。 class Base { public: virtual double area()=0; }; double total(Base *s[ ], int n) { double sum=0.0; for(int i=0; i<n; i++) sum+=s[i]->area( ); return sum; } 要求: (1)从Base类派生圆类(Circle)、正方形类(Square),圆类新增数据成员半径(radius),正方形类新增数据成员边长(a),圆类和正方形类都有构造函数,修改、显示数据成员值的函数,求面积函数。 (2)写出main( )函数,计算半径为5.5的圆和边长为9.9的正方形的面积和(必须通过调用total函数计算)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值