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支持STL的sort算法
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主页。