本节有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。