1.关于复制构造函数,下列说法正确的是

A.系统不会生成缺省复制构造函数,因此必须自己实现

B.复制构造函数是形如X::X(X)的函数

C.Myclass c1, c2; c1.n = 1; c2 = c1;第三句将会调用复制构造函数

D.调用函数A Func() {   A a(4);    return a;   }时,将会调用A的复制构造函数

解析:

只要你不写构造函数,系统就会自动帮你生成缺省的构造函数,包括复制构造函数,故A错误。复制构造函数的格式是X::X(X&)X::X(const X &),故B错误。复制构造函数起作用主要有以下三种情况:

1)当用一个对象去初始化同类的另一个对象时;

2)如果某函数有一个参数是类A的对象,那么该函数被调用时,类A的复制构造函数将被调用;

3) 如果函数的返回值是类A的对象时,则函数返回时,A的复制构造函数被调用。

由此可得,C错误,D正确(第3种情况)。

2.关于虚函数,下列说法不正确的是

A.不允许以虚函数作为构造函数

B.没有虚函数便无法实现多态

C.一般来讲,如果一个类中定义了虚函数,则不可将析构函数也定义为虚函数

D.不能用抽象类定义对象

解析:

在学习虚函数的时候,明确说过构造函数和静态函数不能使用virtual,即不能成为虚函数,虚函数是实现多态的基础,在实现多态的时候,析构函数也经常会被定义为虚函数,抽象类是可以定义对象的。这是一个概念题。

3.关于 this 指针,以下说法不正确的是

A.static成员函数内部不可以使用this指针

B.在构造函数内部可以使用this指针

C.在析构函数内部可以使用 this 指针

D.const成员函数内部不可以使用this 指针

解析:

一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。友元函数没有this指针,因为友元不是类的成员。只有成员函数才有this指针。静态成员函数是类的一部分,作用是为了处理静态数据成员,它没有this指针,静态成员函数可以直接访问该类的静态成员,但不能直接访问类中的非静态成员。构造函数、析构函数、const成员函数都是成员函数,故可以使用this指针,静态成员函数因为其设计的原因,不可以使用is指针。

4.以下关于多态的说法那个不正确?

A.在成员函数中调用虚函数,是多态

B.通过“基类对象名.函数名”的方式调用虚函数,不是多态

C.多态的函数调用语句中,函数一定是虚函数

D.通过“基类引用名.函数名”的方式调用虚函数,是多态

解析:

多态的表现形式有以下几种:

1)通过基类指针调用基类和派生类中的同名虚函数时:

①若该指针指向一个基类的对象,那么被调用的是基类的虚函数;

②若该指针指向一个派生类的对象,那么被调用的是派生类的虚函数。

2)通过基类引用调用基类和派生类中的同名虚函数时:

①若该引用引用的是一个基类的对象,那么被调用的是基类的虚函数;

②若该引用引用的是一个派生类的对象,那么调用的是派生类的虚函数。

故B、D正确,A错误。要实现多态,函数一定是虚函数,这是定义,故C正确。

5.map的每个元素包括KEY(first)和VALUE(second)。关于map容器,下列哪种说法错误

A.map支持下标运算符

B.map的不同元素可以有相同的VALUE

C.map支持STLsort算法

D.map支持双向迭代器

解析:

map的设计问题,不做解释,详情可以查看map的具体解析就会明白。

6.下列说法错误的是

A.可以在一个类的友元函数中使用this指针

B.每个类只有一个析构函数

C.抽象类至少包含一个纯虚函数

D.构造函数不可以是virtual函数

解析见第3题。

7.关于继承和派生的描述中,下列说法错误的是:

A.派生类的成员函数中,不能访问基类的private成员

B.在派生类的析构函数执行之前,会先调用基类的析构函数

C.派生类对象的地址可以赋值给基类指针

D.派生类可以有和基类同名同参数的成员函数

解析:

继承的权限如下:

若继承方式是public,基类成员在派生类中的访问权限保持不变,也就是说,基类中的成员访问权限,在派生类中仍然保持原来的访问权限;

若继承方式是private,基类所有成员在派生类中的访问权限都会变为私有(private)权限;

若继承方式是protected,基类的共有成员和保护成员在派生类中的访问权限都会变为保护(protected)权限,私有成员在派生类中的访问权限仍然是私有(private)权限。

故A正确。C正确,实践中已经实现。D可以通过多态来实现。B的正确过程应该是:构造函数先执行基类构造函数,再执行派生类的构造函数,析构函数先执行派生类的构造函数,再执行基类的构造函数。

8.以下哪种使用std::sort算法的方式是不合法的:

A. vector<int> a; …; sort(a.begin(), a.end());

B. bool b[99]; …; sort(b, b + 99);

C. string c = “2333”; …; sort(c.begin(), c.end());

D. list<int> d; …; sort(d.begin(), d.end());

解析:

A/B/C均可以实现,list应该使用mylist.sort();这种格式来进行排序。

9.A重载的运算符声明是int operator<(A &other) const,那么以下说法中正确的是:

A.小于号左侧的A对象不可以是const的

B.小于号右侧的A对象不可以是const

C.这个写法是错误的,因为小于号的返回类型必须是bool

D.使用小于号的时候,other参数处,传进来的对象实际上会被复制一次

解析:

该运算符使用时类似于c.operator<(other)。小于号左侧的A对象就是这个表达式中的c,是可以const,也可以不const的,但是小于号右侧的A对象是不能为const的,因为若左侧的A对象不是const,根据非const成员函数可以访问非const对象的非const数据成员、const数据成员,但不可以访问const对象的任意数据成员,那么一旦右侧为const的,这个比较就无法进行了,故A错误,B正确。

返回值为bool类型可以为int,故C错误,声明中参数是引用,故不会被复制一次,D错误。

10.以下STL中的函数模板哪个可以作用于set

A. sort

B. random_shuffle

C. find

D. 都不行

解析:

见set的使用说明。

本答案解析为本人整理,查阅了有关课本和网上的相关资料,如有转载请注明转载来源。本文首发于本博客(http://www.yushuai.xyz/2018/11/13/4130.html),未来还将发表于我的个人公众号(小奥的学习笔记)和我的GitHub、Gitee主页。