logo头像

不忘初心,奋力前行

《C++面向对象程序设计》2018年秋季期末考试答案(选择题)

本文于547天之前发表,文中内容可能已经过时,如有问题,请联系我。

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 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 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主页。

支付宝打赏 微信打赏 QQ钱包打赏

感觉不错?欢迎给我 打个赏~我将不胜感激!