目录
一、函数重载和缺省参数值、内联函数
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为虚基类