面试总结(一)
4月24日 阿里电话面试
1、重载与重写的区别?
答:重载是同一类中函数名相同,参数的类型、个数等不同的多个函数执行不同的功能的一种方法;
重写是一种存在于子类和父类之间的一种方法,子类通过重写父类的某一函数,来达到覆盖父类功能的目的,
子类重写时函数方法的名称、参数列表都与父类一致,创建子类时优先使用子类方法。
范围区别-----参数区别----virtual区别
重载(overload):同一个可访问区域内被声明的几个具有不同参数列(参数的类型、个数、顺序不同)的同名函数。
重写(覆盖override):指的是派生类中存在重新定义的函数。派生类中重新定义的函数,其函数名、参数列表、返
回值类型都必须与基类中被重写的函数完全一样!只有函数体不同,派生类调用时会调用派生类的重写函数,不会
调用被重写的基类中的函数。基类中被重写的函数必须有virtual来修饰!
隐藏(hide): 指的是派生类中的函数屏蔽了与其同名的基类中的函数。注意:只要同名函数就行,不管参数列表
是否相同,基类中的函数都会被屏蔽。
2、虚函数
答:虚函数时之在基类中声明为virtual并在派生类中重新被定义的函数,它的主要作用是实现了多态的的机制,通过
父类的指针来调用实际子类的成员函数。虚函数是通过一张虚函数表实现的。
虚函数----纯虚函数-----普通函数
虚函数的调用比普通函数多了很多步骤,虚函数是动态生成的,由虚函数表的指向进行访问,取虚函数表---取调用
函数地址---调用。普通函数是静态生成的,直接调用。
包含纯虚函数的类,被称为是“抽象类”。抽象类不能使用new出对象,只有实现了这个纯虚函数的子类才能new出对象。
纯虚函数更像是“只提供申明,没有实现”,是对子类的约束,是“接口继承”。纯虚函数也是一种“运行时多态”。
3、多线程如何防止一个变量被多个线程修改?
答:给线程加锁,通过互斥量来保证多线程的同步
互斥量----信号量----条件变量----事件
条件变量,能用于阻塞一个/多个线程,直至另一线程修改共享变量(条件)并通知。为了防止race-condition,条件变量总是和互斥锁变量mutex结合在一起使用。
信号量: 进程间或线程间(linux仅线程间的无名信号量pthread semaphore)
生产者消费者问题:如果不使用线程条件变量,由于消费者存在while函数,那么消费者的线程函数会一直的运行,这样会
十分的消耗资源,所以加了条件变量,如果条件不满足那么线程就处于等待休眠状态,直到条件满足,才会唤醒线
程来执行下面的操作,这样可以有效的避免资源浪费的情况。
参考链接:https://blog.csdn.net/alwaysrun/article/details/103317155
https://www.cnblogs.com/caozewen/p/12193127.html
https://blog.csdn.net/qq_42189368/article/details/80690948?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param
4、C++编译到生成可执行程序的过程?
答:源程序---编译预处理---编译---优化程序---汇编程序---链接程序---可执行文件
编译预处理 读取c源程序,对其中的伪指令(以#开头的指令)和特殊符号进行处理。
经过预编译得到的输出文件中,将只有常量。如数字、字符串、变量的定义,以及C语言的关键字
主要的工作是删除公共表达式、循环优化(代码外提、强度削弱、变换循环控制条件、已知量的合并等)、复写传播,以及无用赋值的删除,等等。
汇编过程实际上指把汇编语言代码翻译成目标机器指令的过程。
链接程序的主要工作就是将有关的目标文件彼此相连接,也即将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够被操作系统装入执行的统一整体。
参考链接:https://blog.csdn.net/weibo1230123/article/details/79970866