当前位置: 首页 > news >正文

c++初阶易错题(选择)

 本节有32道题,讲的是c++初阶里边我认为重要的题目,有兴趣可以看看十分详细,欢迎互相交流学习

1~10 

 1

A.引用必须定义时初始化,指针不初始化其值为随机指向

B.指针可以改变指向,引用不能,故错误

C.空指针没有任何指向,删除无害,引用是别名,删除引用就删除真实对象

D.引用必须初始化,所以不能为空引用,指针可以

 2

A.引用必须初始化,必须在定义引用时明确引用的是哪个变量或者对象,否则语法错误,指针不初  始化时值为随机指向

B.引用一旦定义时初始化指定,就不能再修改,指针可以改变指向

C.引用必须出示化,不能出现空引用,指针可以赋值为空

D.简单粗暴的引用理解可以理解为被引用变量或对象的"别名"

E.引用表面好像是传值,其本质也是传地址,只是这个工作有编译器来做,所以错误

F.函数调用为了提高效率,常使用引用或指针作为函数参数传递变量或对象

3

函数重载的条件是函数名相同,参数不同,返回值可以相同可以不相同

A.函数名相同只是函数重载的条件之一

B.重载函数必须参数列表有所不同(包括参数类型和参数个数)

C.重载函数不依靠返回值来区分,所以返回值可以相同

D.C不支持函数重载

4

A.重载必须是参数列表有所不同(包括个数和类型),所以参数类型不同,构成重载

B.参数类型不同,构成重载

C.参数类型不同,构成重载

D.函数重载不能依靠返回值的不同来构成重载,因为调用时无法根据参数列表确定调用哪个重载函  数,故错误

5

A.缺省参数就是给出的函数参数的默认值

B.很明显,这是给出缺省值的意义所在,缺省值的定义

C.纯C语言,即.c文件,函数不支持缺省参数,C++即.cpp文件支持

D.半缺省不能随便缺省一半,必须从右往左缺省,否则编译出错

 6

A.不一定,因为inline只是一种建议,需要看此函数是否能够成为内联函数(如果太长就不会成为内联函数,编译器是聪明的)

B. inline函数不支持声明和定义分离开,因为编译器一旦将一个函数作为内联函数处理,就会在调用位置展开,即该函数是没有地址的,也不能在其他源文件中调用,故一般都是直接在源文件中定义内联函数的

C.inline函数会在调用的地方展开,所以符号表中不会有inline函数的符号名,不存在链接冲突。

D.比较长的函数,递归函数就算定义为inline,也会被编译器忽略,故错误

7

A.含有循环语句,违背内联函数的本质

B.含有递归语句,违背内联函数的本质

C.尽可能把代码短小,频繁调用的函数设置为内联函数

D.含代码量大,违背内联函数的本质

内联函数是一种建议,如果函数内部包括循环,递归,或者  代码量大且复杂,这些函数即使设置了内联函数,系统也不会当做内联函数来处理。

8

A.基类保护成员在子类可以直接被访问,跟this无关

B.基类私有成员在子类中不能被访问,跟this无关

C.基类共有成员在子类和对象外都可以直接访问,跟this无关

D.this指针代表了当前对象,能够区分每个对象的自身数据,故正确

 9

A.C语言结构体不支持成员函数,但C++结构体支持,其class与struct本质没有区别,唯一区别  在于默认时class的访问属性为私有,struct为公有

B.正确

C.C++结构体也支持成员函数

10

分析:1、类的析构函数调用一般按照构造函数调用的相反顺序进行调用,但是要注意static对象的存在, 因为static改变了对象的生存作用域,需要等待程序结束时才会析构释放对象

   2、全局对象先于局部对象进行构造

   3、局部对象按照出现的顺序进行构造,无论是否为static

   4、所以构造的顺序为 c a b d

   5、析构的顺序按照构造的相反顺序析构,只需注意static改变对象的生存作用域之后,会放在局部 对象之后进行析构

   6、因此析构顺序为B A D C

11~20 

11

选A

A. 赋值运算符在类中不显式实现时,编译器会生成一份默认的,此时用户在类外再将赋值运算符重载为全局的,就和编译器生成的默认赋值运算符冲突了,故赋值运算符只能重载成成员函数

B.默认的赋值运算符是按成员成员,属于浅赋值

C.参数只有一个,另一个通过this指针传递,成员函数默认第一个参数是隐藏的this指针

D.两个函数的调用场景不同,相互没有影响

12

A.可以,例如重载对象取值,典型有以后学到的智能指针

B.可以,例如以后学到的仿函数就是通过重载()实现的

C.不能,不能被重载的运算符只有5个, 点号. 三目运算?: 作用域访 问符:: 运算符sizeof 以及.*

D.可以,例如重载对象的指向,典型有以后学到的智能指针

13

A.可以访问,这也把一个函数声明为友元的目的

B.可以访问

C.可以访问

D.友元函数对一个类里面的所有成员,全部通吃,正确

14

A.友元函数不是类的成员函数,就相当于你的朋友再亲密也不是你的家人,既然不是类成员函数,那和普通成员函数调用一样,不需要通过对象调用

B.友元的目的就是为了访问类的私有数据,成员函数可以直接访问类的私有数据

C.类的成员函数属于类,调用时其内部数据会通过this指针来调用

D.友元函数不具备this指针,更谈不上通过this调用(友元函数本质是全局函数没有this指针),故错误

15

A.全局函数不具备this指针

B.static函数不具备this指针

C.友元函数不具备this指针

D.正确,普通成员方法具有隐藏的this指针,不管访问限定符是啥,普通非全局,静态,友元函数都有this指针

16

A.static成员变量在对象生成之前生成

B.普通成员函数是可以调用static函数的

C.static函数属于所有对象共享,不具备this指针

D.static函数唯一能够访问的就是static变量或者其他static函数

 17

A.a是不同数据成员,可以通过构造函数进行赋值

B.正确,常量以及引用只能通过初始化列表初始化

C.d,e是静态成员,只能在类外初始化

D.d是静态成员,只能在类外初始化

E.b常量只能通过初始化列表初始化,但不是最佳答案

F.c引用只能通过初始化列表初始化,但不是最佳答案

18

构造函数执行次数就是数组个数,析构函数次数也是数组个数

A.申请数组空间,构造函数调用的次数就是数组的大小

B.正确

C.申请数组空间,构造函数调用的次数就是数组的大小

D.如果释放数组空间,delete使用了[],则会对应的调用数组大小次数的析构函数

19

当new和delete不匹配的时候,程序可能会崩溃(new数组的时候,delete也要跟[])

A.申请对象数组,会调用构造函数5次,delete由于没有使用[],此时只会调用一次析构函数,但往往会引发程序崩溃

B.构造函数会调用5次

C.析构函数此时只会调用1次,要想完整释放数组空间,需要使用[]

D.正确

20

A.堆大小受限于操作系统,而栈空间一般有系统直接分配

B.频繁的申请空间和释放空间,容易造成内存碎片,甚至内存泄漏,栈区由于是自动管理,不存在此问题

C.堆无法静态分配,只能动态分配

D.栈可以通过函数_alloca进行动态分配,不过注意,所分配空间不能通过free或delete进行释放

21~30 

21

A.栈区主要存在局部变量和函数参数,其空间的管理由编译器自动完成,无需手动控制,堆区是自己申请的空间,在不需  要时需要手动释放

B.栈区先定义的变量放到栈底,地址高,后定义的变量放到栈顶,地址低,因此是向下生长的,堆区则相反

C.频繁的申请空间和释放空间,容易造成内存碎片,甚至内存泄漏,栈区由于是自动管理,不存在此问题

D.32位系统下,最大的访问内存空间为4G,所以不可能把所有的内存空间当做堆内存使用,故错误

22

总结:必须有关键字class和typename指定类型,关键字(class和typename是一个意思都可以用)

A.1.模板语法错误,2.没有关键字class或typename指定类型,3.T2缺少class或typename

B.正确, 4,6,7为正确声明

C.5.T2缺少class或typename

D.8.缺少template

23

A.模板可以具有非类型参数,用于指定大小,可以根据指定的大小创建动态结构

B.模板最重要的一点就是类型无关,提高了代码复用性

C.模板运行时不检查数据类型,也不保证类型安全,相当于类型的宏替换,故错误

D.只要支持模板语法,模板的代码就是可移植的

24

分析:

str.reserve(111); //调整容量为 111

str.resize(5);   //调整元素个数为 5,resize时小于容量不会缩容,只会改变size

str.reserve(50);  //调整容量为 50,由于调整的容量小于已有空间容量,故容量不会减小(记住reserve不会缩容只会扩容

所以size=5 capacity=111

故答案为: C

25

分析:vector底层是以当前类型的指针作为迭代器,对于指针而言,能够进行操作的方法都支持,如==,++,*,而>>运算符并没有重载

故答案为D

26

这个答案是C,很简单,看第一个for循环,是删除300赋值给下一个,然后迭代器还要++,等于说有4个300,中间会因为迭代器++跳过2个300,所以打印的时候只有2个300,没想明白可以画图看看很简单的

27

分析:删除节点后,只有指向当前节点的迭代器失效了,其前后的迭代器仍然有效,因为底层为不连续空间,只有被删除的节点才会失效, 所以答案为 C

28

这道题是B选项,因为是不为0就打印并++迭代器,当迭代器指向0的时候删除0并且指向下一个位置,后边还有个++it,就跳过5直接指向6了所以打印没有0和5

29

分析:优先级队列priority_queue底层采用vector容器作为底层数据结构

30

这道题本质是想说明仿函数是模版函数,就可以按照模板的使用来答题

A.仿函数是模板函数,可以根据不同的类型代表不同的状态

B.仿函数是模板函数,可以有不同类型

C.仿函数是模板函数(因为要实例化),其速度比一般函数要慢,故错误

D.仿函数在一定程度上使代码更通用,本质上简化了代码

31~32

 31

A.deque底层总体为不连续空间

B.不支持,因为底层是一个个的不连续节点

C.正确

D.一般会以容量的2倍扩充容量,这是为了减少扩容的次数,减少内存碎片

32

这道题有点难,需要理解三种容器的底层实现

分析:此题主要考察cont.erase(tmpit)删除数据之后,迭代器失效相关问题

本题重点要关注的是底层实现

vector、deque底层都是用了连续空间,所以虽然++iter迭代器了,但是erase(tempit)以后

底层是连续空间,删除会挪动数据,最终导致iter意义变了,已失效了

而list,不是连续空间,删除以后tempIt虽然失效了,但是不影响iter

相关文章:

  • Linux: qemu-user-static 是如何工作的?
  • 初探自定义注意力机制:DAttention的设计与实现
  • 力扣128. 最长连续序列 || 452. 用最少数量的箭引爆气球
  • 如何打造安全稳定的亚马逊采购测评自养号下单系统?
  • 【微知】ip命令如何查看路由表?如何查看IPv6的路由表?(ip r s、ip -6 r s)
  • 【Netty】SimpleChannelInboundHandler如何根据数据类型处理消息
  • 区块链 智能合约安全 | 整型溢出漏洞
  • 对于memset(b, 1, sizeof b)赋值为16843009情况
  • Ansys 2024 R1 安装出现错误码-8544解决方法
  • SPACE_GAME
  • Qt-搭建开发环境
  • 【新能源汽车“心脏”赋能:三电系统研发、测试与应用匹配的恒压恒流源技术秘籍】
  • TF中 Arg 节点
  • 【canvas】一键自动布局:如何让流程图节点自动找到最佳位置
  • 【错误解决】ollama使用huggingface拉取模型异常
  • 第七章-PHP字符串操作
  • 精准git动图拆解​
  • 【NTP系列】chrony同步原理
  • java版鸿鹄招采系统源码 招投标系统源码 供应商招投标平台源码
  • 使用Mybatis 连接数据库 项目示例
  • 巴基斯坦全面恢复领空开放
  • 巴基斯坦军方:印度导弹袭击巴首都附近空军基地
  • 明查|哈佛大学批改美教育部长来信,红笔标出语法错误?
  • “一嗨租车”陷“五年后扣费”疑云,用户:违章处理莫名消失
  • 吴勇强、高颜已任南京市委常委
  • 法治日报:商品明细是隐私,外卖员快递员不应知晓