实习季C++基本问题汇总

又到了校招实习季的到来,看了好多人的经验才发现平时用的C++好像都白用了,总结一些问题,这半个月把坑都要填上。

1. C++中虚函数的作用?

虚函数是在实现多态中用到的,如果有虚函数的话,就能在子类中重新定义一个与基类成员函数同名的函数,并且能够通过基类的指针或者引用来访问基类和派生类中的同名函数。

纯虚函数就是接口类。

2.C中的struct和C++中class的异同?

struct只能定义数据成员,不能定义成员函数。

struct中的访问权限默认都是public。

class能定义模板参数,struct不能。

class默认是private继承,struct默认是public继承。


3.快速排序的思想。

快排就是用分治的思想。

分,随机取个数,然后把后面的数,小的放左边,大的放右边。

治,对左右的序列分别递归的重复上个过程。


4.C++多态的概念?

多态简单的说,就是当发出一条命令时,不同的对象接到不同的命令时,做出的动作不同。经常在基类和派生类中出现。或者说是一个接口,不同的方法,目的是实现接口的重用,不论传递过来的是哪个类的对象,函数都能通过一个接口调用到同一个接口调用到适合各自对象的方法。


5.如何用两个栈实现一个队列,用两个队列实现一个栈?

两个栈实现一个队列,设一个队列中包含,stack1和stack2,

压入元素都是压入stack1,如果出队列的话,就把所有元素依次压入stack2,也就是原来是abc,到stack2变为cba,然后弹出最上面元素就是出队列的操作。

两个队列实现一个栈,同理,一个栈包含,queue1和queue2,序列为abc,那么从queue1中向queue2装入ab,从queue1删除c。

6.const char*和 char *const的区别?

const char *p,*p指向的内容是常量,不能通过*p修改其中的值,但其变量自身是可以修改的。

char *const p,代表一个固定的指针指向char的数据,这个指针中保存的地址不能改变。


7.链表与数组的区别?

数组是固定的内存,不能更改,链表是动态的内存,可随时插入,删除;

数组在栈中分配空间,链表在堆中;

数组是一块连续的内存,链表可任意。


8.数据结构栈与队列的异同点?

进出的顺序不同,栈为后进先出,队列为先进先出,两者的互相实现看第五题。


9.怎样用队列的先进先出实现栈的后进先出?

见第五题。


10.二叉树的指针实现和数组实现,以及二叉树的第k层叶子节点个数的求法有哪些?


11.一个排序数组中所有数字出现两次,其中一个数字只出现1次,找出这个数字?除了位运算,有没有别的算法,要求高效。

位运算,让所有的数字全部进行异或(相异为1),进行n次操作就是答案。


12.static的用法?


13.虚函数的用法?

14.不用加减乘除求两个数的和?

15.一个公司所有人的年龄排序,时间复杂度为O(n),空间复杂度为O(1)

由于公司人员的年龄在一个较小的范围内,年龄的重复度较高,而且给了足够的空间复杂度,可以建立一个数组cAge[],假如最大年龄不超过100岁,那么这个数组大小为cAge[100],这个大小与排序的数量无关,所以空间复杂度为O(1),数组的元素对应储存那个年龄段的人员数量,比如cAge[30]就代表,30岁的人的数量储存在里面,这样对所有人的年龄遍历一遍,时间复杂度就是O(n)。


16.出入值参数和传入引用参数有什么区别?

值参数就是形参,只给函数传入值,结果不会改变实参,传入引用(int &a)就会改变实参的值。


17.C++中为一个三目运算符,?:的意思。

语句1?语句2:语句3

对语句1进行运算,语句1为true的条件下,执行语句2,语句1为false时,执行语句3.


18.递归的缺点是什么?

递归语句简洁,但是由于其实反复调用函数,每次调用函数都是有内耗的,都要在栈中分配空间,返回地址等操作,所以效率不如循环。更严重的是可能引起调用栈溢出的问题。


19.两个double类型比较的问题

在编程中经常用判断语句 if(a==b),但是float,double在计算机表示中都有一定的误差,比如a,b都是double类型的,如果直接拿 if(a==b) 就是错误的,因为数据类型的问题,不能够直接比较,那么如何比较double类型,就要设限制条件, 比如两者之差在 -0.0000001-0.00000001之间,那么就可以判断为true,然后完成判断语句。


20.如何快速的球x^n?

分治的思想。


21.C++/C中malloc和delete中释放内存后,内存被清空了吗?

没有,这两个指令只是告诉操作系统那两个内存不被占用了,可以被其他内容覆盖,但实际上并没真正地清空。


22. C++内存分配的三种方式?

从静态存储区域分配:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。静态分配的区域的生命期是整个软件运行期,就是说从软件运行开始到软件终止退出。只有软件终止运行后,这块内存才会被系统回收

      在栈上创建:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。在栈中分配的空间的生命期与这个变量所在的函数和类相关。如果是函数中定义的局部变量,那么它的生命期就是函数被调用时,如果函数运行结束,那么这块内存就会被回收。如果是类中的成员变量,则它的生命期与类实例的生命期相同。

      从堆上分配:亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。在堆上分配的内存,生命期是从调用new或者malloc开始,到调用delete或者free结束。如果不掉用delete或者free。则这块空间必须到软件运行结束后才能被系统回收。

23. static全局变量和普通全局变量的区别。

1 普通全局变量前面加上static 就成了static全局变量,他们的存储方式都是一样,存在静态存储方式。区别在于作用范围,普通全局变量作用域是整个源程序,当一个程序有多个源文件组成时候,普通全局变量在每个源文件中都是有效的,而静态全局变量则限制了作用域,只在定义该变量的源文件中有效。在同一个源程序中的其他源文件不能使用。由于静态全局变量的作用域限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。

 

static全局变量与普通全局变量区别 static全局变量只初始化一次,不能别其他源文件引用。

static局部变量与普通局部变量区别:static局部变量只初始化一次,下次引用的时候以上次的值。

static函数与不同函数的区别:static函数在内存中只保存一份,普通函数被调用中维持一份拷贝。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值