C++复习——选择题

 

目录

一、函数重载和缺省参数值、内联函数

二、C++拷贝控制的五个函数

 三、三种继承方式

 四、虚函数和多态性、纯虚函数和抽象类

五、多重继承和虚基类

一、函数重载和缺省参数值、内联函数

1.对类的构造函数和析构函数描述正确的是(  )

   A. 构造函数可以重载,析构函数不能重载       B. 构造函数不能重载,析构函数可以重载

   C. 构造函数可以重载,析构函数也可以重载   D. 构造函数不能重载,析构函数也不能重载

 2.对定义重载函数的下列要求中,_____是错误的。

A. 要求参数的个数不同

B. 要求参数中至少有一个类型不同

C. 要求参数个数相同时,参数类型不同

D. 要求函数的返回值不同

注:重载函数要求参数个数或者参数类型不同,并不要求返回值类型不同

 3.下列函数参数默认值定义错误的是(  )

        A. int Sum (int x, int y=100);

        B. int Sum (int x = 100);

        C. int Sum (int x = 1, int y);

        D. int Sum(int x= 1, int y = 100);

注:eg:对于C选项,调用时:Sum(2);  实参2会直接赋值给x,而y既无实参也无缺省值,程序报错

4.关于引用调用,下面哪个说法正确(    )

A. 形参是指针, 实参是地址值

B. 形参和实参都是变量

C. 形参是数组名, 实参是数组名

D. 形参是引用, 实参是变量

二、C++拷贝控制的五个函数

1.假定A为一个类,则该类的移动构造函数的声明语句为(    )

A.  A & (A & x);   B.  A(A && x)     C.  A(const A & x);      D.  A(A* x)

2.若AB为一个类,则该类的拷贝构造函数的声明语句为(    )

          A.  AB&(AB x);   B.  AB(AB x);   C.  AB(AB *x);   D. AB(AB& x);

注:复制(拷贝)构造函数:A(const A &x);   

       移动构造函数:A(A && x)  noexcept;//移动构造过程中被移动的对象和需要移动构造的对象都发生了变化,因此,没有const修饰;

       拷贝赋值运算符重载形式:A &operator=(const A &x);//赋值运算符完成后返回当前对象的引用;

       移动赋值运算符重载形式:A &operator=(A &&x) noexcept;       //同理,没有const修饰

 三、三种继承方式

1. 派生类通过保护继承方式继承,那么在派生类中可以直接访问的基类成员是(     )

A.只能是公有成员                             B.只能是保护成员 

C.可以是公有成员与保护成员              D.所有成员

2.下列描述中,错误的是( )。
A. 基类的protected成员在public派生类中仍然是protected成员
B. 基类的private成员在public派生类中是不可访问的
C. 基类public成员在private派生类中是private成员
D. 基类public成员在protected派生类中仍是public成员

注:1.基类的私有成员只能在基类中访问;

2.公有继承不改变基类的保护成员和公有成员在派生类中的访问权限;

3.保护继承将基类的保护成员和公有成员改变为派生类中的保护成员;

4.私有继承将基类的保护成员和公有成员改变为派生类中的私有成员;

3.派生类的对象可以直接访问的基类成员是(或者这么问:可以用p.a的形式访问派生类对象p的基类成员a, 其中a是)

     A. 公有继承的公有成员                                B. 保护继承的公有成员

     C. 私有继承的公有成员                                D. 公有继承的保护成员

注:基类自身的成员可以访问基类中任何一个成员,但是通过基类的对象就只能访问其公有成员

     A. 公有继承的公有成员    ->   派生类的公有成员 

     B. 保护继承的公有成员    ->   派生类的保护成员

     C. 私有继承的公有成员    ->   派生类的私有成员

      D. 公有继承的保护成员   ->   派生类的保护成员

4.下列关于派生类构造函数和析构函数的说法中,错误的是

A.如果基类声明了带有形参表的构造函数,则派生类就应当声明构造函数

(如果基类中有默认构造函数,那么派生类可以不定义构造函数)

B.在销毁派生类对象时,先调用基类的析构函数,再调用派生类的析构函数

C.派生类的构造函数会隐含调用基类的构造函数

D.在建立派生类对象时,先调用基类的构造函数,再调用派生类的构造函数

 注:在建立派生类对象时,先调用基类的构造函数,其次调用派生类成员对象的构造函数,再调用派生类的构造函数;

析构时正好相反:先调用派生类的构造函数,其次调用派生类成员对象的析构函数,最后调用基类的析构函数。

 四、虚函数和多态性、纯虚函数和抽象类

1.下面纯虚函数声明正确的是(     )

A. int  virtual  func(int  i);        B. int virtual func(int  i)=0;

C. virtual int  func(int  i)=0;       D. virtual int func(int i);

 2.有关函数多态,以下哪个描述是正确的(     )

A. 多态是不同的对象调用不同名称的函数        

B. 跟继承无关,使用虚函数就可以实现多态

C. 多态通过不同的对象调用相同名称的函数体现       

D. 多态是一个对象调用不同名称的对象

注:虚函数只能在继承体系下实现;在继承体系下,用虚函数实现运行时的多态性有三个要素:(1)在基类定义中,把成员函数定义为虚函数,即在正常函数定义之前加关键字virtual;

(2)在派生类定义中,对虚函数的更新定义只能修改函数体的内容;

(3)必须用指向基类的指针(引用)访问虚函数,这样运行多态性才能实现。

3. 虚析构函数的作用是(    )

       A. 虚基类必须定义虚析构函数    B.  类对象作用域结束时释放资源

       C. delete动态对象时释放资源    D.  防止二义性

 注:虚析构函数:析构函数可以是虚函数,而且通常声明为虚函数,目的为:使用delete运算符删除一个对象时,能确保析构函数被正确执行;

另外,只有类的成员函数才能声明为虚函数;静态成员函数、内联函数、构造函数都不能是虚函数。

4.关于纯虚函数和抽象类的描述中,( )是错误的。

A.抽象类是指具有纯虚函数的类

B.一个基类中说明有纯虚函数,该基类的派生类一定不再是抽象类

C.抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出

D.纯虚函数是一种特殊的虚函数,它没有具体的实现

注:纯虚函数没有函数定义,所以纯虚函数不能被调用;

包含纯虚函数的类称为抽象类

抽象类无法建立对象,只能用做继承时的基类;

如果抽象类派生出的新类还有未定义的纯虚函数,则新派生类仍然是抽象类。

五、多重继承和虚基类

1.关于多继承二义性的描述中,_____是错误的。

A. 一个派生类的两个基类中都有某个同名成员,在派生类中对这个成员的访问可能出现二义性

B. 解决二义性的最常用的方法是对成员名的限定

C. 基类和派生类中出现同名函数,也存在二义性问题

D. 一个派生类是从两个基类派生来的,而这两个基类又有一个共同的基类,对该基类成员进行访问时,也可能出现二义性

注:多继承中的二义性问题:在有多继承的情况下,可能会造成派生类对基类中某个成员的访问出现不唯一的情况,这时就称对基类成员的访问出现了二义性。

产生二义性的两种情况:A、D选项

解决二义性方法:(1)使用作用域运算符,用类名对成员加以限定eg:

限定前:a.show();

限定后:a.Base::show();

(2) 在派生类中定义同名成员。如果派生类定义了一个和某个基类成员同名的新成员,派生的新成员就会覆盖外层同名成员。

C++为解决这个问题提供了虚基类,也就是说虚基类是用来解决多继承中的二义性问题的。

虚基类:在基类的所有直接派生类中将基类声明为虚基类,格式:

class   派生类名:  virtual   继承方式   基类名{ };

虚基类是这样一个基类:虽然被一个派生类间接地多次继承,但派生类却只继承一份该基类的成员。

 2.下列关于虚基类的描述中,错误的是__C___。

A. 使用虚基类可以消除由多继承产生的二义性

B. 构造派生类对象时,虚基类的构造函数只被调用一次

C. 声明class B:virtual public A说明类B为虚基类

D. 建立派生类对象时,首先调用虚基类的构造函数

注:说明类A为虚基类

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值