C++基础知识复习 面试必问!!!

C++基础知识复习

1.C++新增的数据类型是什么?
答:C++新増的bool类型,bool类型只有两种结果,true为真,false为假

2.什么是类?
答:封装事件的成员,属性以及产生的动作,并且对应有相应的权限

3.什么是域作用符?
答:::为域操作符,表明后面的成员或者函数是属于前面这一个空间的

4.malloc()和new有什么区别?
答:本质上不一样,malloc()本质是函数,new本质是操作符,申请空间失败后,new会抛出异常,malloc会指向NULL,malloc()申请堆空间需要指定内存大小,new会自动分配大小

5.那么new和new[]有什么区别呢?
答:new操作单个对象,new[]操作多个对象

6.C++引用有什么特征?
答:1).引用必须初始化
2).引用与引用变量的类型必须保持一致
3)引用是终身的
4)引用常量必须用常引用

7.引用与指针的区别是什么??
答: 1)引用必须初始化,指针可以不初始化
2)引用是终身的,指针的指向可以改变
3)C++编译器没有提供访问引用本身地址的方式,指针可以访问到自己的地址,引用只能访问到引用对象的地址

8.引用的时候需要注意些什么?
答: 1)没有void引用,因为引用的时候必须初始化,并且确定分配多大的内存,但是void引用无法确定分配多少内存
2)只有指针引用,没有引用指针,因为C++没有提供访问引用本身地址的方式

9.引用的本质是什么?
答:C++中的引用本质是C语言中的指针常量

10.引用在C++是干什么的?
答:1)当参数,既有一般类型做参数操作和调用简单的优点,也有指针做参数地址传递,不占内存的优点
2)当返回值,只需要拷贝一次,大大提高效率

11.当函数有返回值的时候需要注意哪些问题?
答:函数返回值绝对不能返回一个局部变量,否则在函数结束的时候会销毁返回值

12.那么怎么预防返回局部变量问题?
答:1)使用全局变量:耗内存,没有安全检查,不安全
2)使用静态变量:一样耗内存,而且生命周期太长
3)使用堆内存:使用堆内存一定要配套使用,没有及时释放容易内存泄漏
4)使用输出型参数:返回输出型参数的引用,参数在main函数里面申明,然后直接在函数中使用

13.什么是内联函数?
答:在函数前加inline_fun,内联函数使用起来既有带参宏的效率,也有一般函数会进行安全检查的优点,但是使用起来是有限制的,一般代码量不超过五行,不能使用循环,switch,递归,而且不能有任何抛出异常

14.什么是函数重载?
答:函数重载(静态联编),在用一个范围内(同一个文件,同一个类,同一个命名空间),允许函数名相同,参数不同,系统根据你的参数来决定调用哪一个重载函数

15.假如使用的实参没有一个对应得上的呢?
答:如果实参没有一个重载函数对应得上,那么系统会自动向最优匹配转化(即低精度向高精度转化)

16.函数重载有什么作用?
答:可以减少调用者的工作量,只需要根据需要的参数或我有的参数来调用函数

17.什么是函数重载二义性错误?
答:函数调用必须唯一性,不能同时调用两个,即传入的参数只能满足一个重载函数,满足多个的话,系统不知道调用哪一个

18.什么是缺省值?
答:当形参设置为缺省值以后,调用该函数可以不使用该缺省值,相当于这个缺省值参数可用可不用

19.使用缺省值有什么好处?
答:为该函数带来方便,有时候不同情况调用函数的不同参数

20.使用缺省值需要注意的问题是什么?
答: 1)带缺省值的函数定义和调用都要遵循从右向左的顺序,即右边没有缺省值的时候,左边也不能使用
2)注意二义性问题,有时候使用缺省值的时候,会与一些重载函数相冲突

21.C++中类有哪几种?
答:1)struct申明的,默认权限是pbblic
2)class申明的,默认权限是private

22.C++面向对象编程的三大特征是什么?
答:封装,继承,多态

23.什么是封装?
答:封装事件的属性(数据成员),以及所产生的动作,并赋予他们相应的权限

24.什么是多态??
答:简单来说就是实现父类的虚函数,这样父类指针不仅可以指向自己的函数,也可以指向子类的函数,实现动态联编 ,使得效率更高

25.什么是继承?
答:指一个对象直接使用另外对象的属性和方法,一个对象可以继承多个对象,同时有相应的权限

26.继承中遇到的误解?
答:不管怎么继承,子类都可以继承父类的私有成员和函数,只是在子类中无法访问父类的私有成员

27.怎么使用类中的数据成员和成员函数?
答:创建对象,只有创建类的对象,才会分配内存

28.创建对象的的方式有哪些?
答:1)创建一般对象,分配栈内存,调用默认构造函数
2)创建一般对象,分配栈内存,调用带参构造函数
3)创建对象指针,分配堆内存,调用默认构造函数
4)创建对象指针,分配堆内存,调用带参构造函数
5)创建对象数组,使用栈内存,调用默认构造函数
6)创建对象数组,使用堆内存,调用默认构造函数
7)创建对象引用,引用一个具体对象

29.什么是常对象??
答:函数后面加const,对象前面加const,常对象只能调用常函数

30.常对象与一把对象的访问规则是什么?
答:常对象只能访问常函数,一般对象只能访问一般函数,假如没有一般函数,也是可以访问常函数的

31.什么是mutable数据成员?
答:mutable修饰的数据成员为活跃数据成员,这种数据成员即使在常函数内也是可以修改的

32.什么是静态数据成员?
答:静态数据成员在类内申明,在类外实现,可以直接通过域名来访问,也可以通过对象来访问

33.为什么静态数据成员可以直接通过域名来访问?
答:因为静态数据成员在创建对象之前系统就已经分配了内存
所以当没有创建对象的时候只能通过域名来访问,不能使用this

34.有哪些开发设计模式??分别简单介绍一下
答: 1)工厂模式:建立一个对象的类就像一个加工厂,建立对象就如一个产品,只使用产品而不在乎产品如何生产
2)单例模式:确保一个类永远只有一个对象
3)策略模式:即每一个类都是都是一个胶囊,但是胶囊之间可以代替(即功能一样,但是实现的方法不一样)
4)观察者模式:定义一对多的依赖关系,让多个观察者同时监听一个主对象,当主对象发生动态改变的时候,会通知所有观察者
5)建造者模式:产品内部表象可以变化,客户不必只要内部组成,可以强制执行一种步骤在建造过程中,用一个接口完成不同的操作
6)访问者模式:对于数据结构没有确定的系统,把数据结构和基于数据结构的操作解耦合,让操作集合可以自由演化
7)桥接模式:将对象与现实化脱离,通过增加一个新访问者类
8)解释器模式:给定一个语言后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器
9)合成模式:将对象组织到树结构中,用来描述整体与部分之间的关系
10)适配器模式:把一个类的接口编程客户端所期待的另一种接口,从而使得原本因接口不匹配而无法一起工作的两个类能够一起 工作

35.为什么要引用友元函数?
答:实现类之间的数据共享时,减少系统开销,提高效率,避免把所有成员设置成公有成员,最大限度的保护数据成员的安全

36.友元函数的缺点是什么?
答:友元函数破坏了封装机制,所以我们一般不使用友元函数,迫不得已再使用

37.什么是构造函数?
答:函数名与类名相同,但是不能有返回值

38.构造函数的作用是什么?
答:完成对数据成员的初始化和其他初始化操作

39.什么是拷贝构造函数?
答:函数名与类名相同,没有返回值,需要一个类内对象的引用当参数

40.什么时候调用拷贝构造函数?
答:1)当一个已经初始化的对象给另外的对象赋值的时候
2)当函数的形参的时候
3)当函数的返回值的时候

41.当类内有成员为指针的时候需要注意的问题?
答:当类内有成员为指针的时候,需要重写拷贝函数,拷贝构造函数,析构函数,=操作符重载

42.什么是深拷贝,什么是浅拷贝?
答:本质上深拷贝使用的是堆内存,不仅拷贝地址而且拷贝内容,安全,但是占内存,浅拷贝使用的是栈内存,只拷贝地址,不安全但是不占内存

43.怎么禁用掉拷贝构造函数?
答:将拷贝拷贝构造函数设置为私有

44.什么是临时对象?
答:当函数需要返回一个对象,他会再栈中创建一个临时对象,存储函数的返回值

45.临时对象的优点?
答:不要赋值给命令对象,直接使用,使用以后立即销毁,节约内存

46.什么是内部类?
答:在类中定义另一个类,创建内部类对象的时候,需要加上外部的域名

47.内部类与外部类的访问特性是什么?
答:内部类可以访问外部类的所有成员以及函数(包括私有成员),但是外部类只能访问内部类的公有成员

48.什么是局部类?
答:定义在局部中的类(一般定义在函数中的类),局部类中不能声明静态数据成员,局部类的作用范围只在局部,局部类的主要用于事件监听器

49.继承的作用是什么?
答:提高代码重用性,子类只需要关心比父类更多的动作和属性,有利于快速建立系统

50.什么是静态联编?
答:(早期联编,早期束定),根据指针或者引用的类型来决定调用谁的函数,编译时确定

51.什么是动态联编?
答:(晚期束定,晚期联编),根据指针或引用实际指向的对象来决定调用谁的函数,运行时确定,使用动态联编的时候,要在父类的同名函数加virtual,变成虚函数,但是有虚函数不一定是动态联编,也可以有屏蔽和隐藏

52.虚函数的本质是什么?
答:定义了virtual以后,父类和子类都会增加四个字节,编译的时候会增加一个指针,此时编译器会增加一个虚函数表,会根据指针找到在虚函数表中的同名函数

53.关于动态联编中隐藏,屏蔽的问题?
答:1)隐藏:子类名字与父类相同,参数也相同,但是父类没有加virtual关键字,此时子类的函数将会被隐藏
2)屏蔽:在重写的时候参数不一样,此时不管父类有没有virtual都是屏蔽,是静态联编

54.什么是纯虚函数?
答:虚函数右边形参列表写 =0

55.纯虚函数的特点?
答:纯虚函数,只声明,不实现

56.什么是抽象类
答:有纯虚函数的类,就叫抽象类

57.抽象类有什么作用?
答:用来做接口(定义有哪些动作,但是动作实现由子类实现)

58.多继承会带来一些什么问题?
答:1)菱形问题:当继承的两个父类都有一个共同的爷爷类,子类不知道调用哪一个同名函数,用虚继承来解决
2)V型问题:二义性问题,用域名来解决

59.多态的类型多态是什么?
答:1)函数模板:用于C++标准库的通用算法
2)模板类

60.标准容器库中verctor是什么?
答:vector是向量,底层通过数组来实现的的

61.vector的一些特性是什么?
答:1).因为vector是使用的连续内存,在向vector添加成员的时候,如果超过容量,就会创建新的vector,然后把旧的vector数据拷贝
2)vector是有序容器,会根据插入顺序来存储,不会自动排序
3)vector允许有重复值
4)vector访问方便,增删效率低
5)vector使用的是随机迭代子
6)vector没有查找,去重,排序函数,需要调用通用算法,导入通用算法头文件(通用算法不允许改变容器大小!!)

62.什么是quueu?
答:队列,底层是通过数组实现的,只能从尾插入,头部删除,类似排队

63.quueu的有啥特性?
答:1)只能调用push()函数从尾部插入
2)只能调用pop()函数从头部删除
3)不能通过下边,迭代子,for_each来访问,要访问的话,只能边访问边删除
4)允许重复值

64.什么是deque?
答:双向队列(两端头都可以增删),底层也是数组实现

65.deque有啥特性?
答:1)在使用上不需要先扩容,也没有reverse函数
2)是有序容器
3)允许有重复值
4)没有查找,排序,去重函数,需要用到通用算法
5)适合查询,不适合增删
6)支持随机迭代子访问

66.什么是stack??
答:栈,底层也是数组实现,从尾部插入,从尾部删除,类似洗碗

67.stack的一些特性?
答:1)不能通过下标,迭代子,for_each访问,只能边访问便删除
2)允许有重复值

68.什么是list?
答: 链表,底层通过链表来实现的

69.list的一些特性?
答:1)链表底层通过链表来实现,所以不能使用下标来遍历,但是可以通过迭代子和for_each来遍历,注意,此时用的迭代子是顺序迭代子,不能随机访问
2)为有序容器,通过插入顺序来存放,不会自动排序
3)没有查找函数
4)多用于增删,查询少

70.什么是set?
答:set底层是红黑二叉树实现的容器

71.set的一些特性?
答:1)是一个无序容器,不按照插入顺序存放,再插入的时候自动排序
2)可以通过迭代子来遍历
3)有自己的查找find(),删除erase()函数

72.什么是map??
答:底层也是是红黑二叉树实现的容器

73map的一些特性?
答:1)map的每个数据都是一个值对,key,value,用pair来保存,pair的数据可以相同,但是key必须是唯一的,同样也是一个无序容器,会自动排序
2)通过迭代子来访问,也可以通过 at[key] 下标来访问,也可for_each通用算法
3)允许有重复的数据,但是不允许有重复的key
4)map的查找,删除都需要通过key来操作
5)查询效率高,增删效率低

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值