程序员模拟面试题.docx
- 文档编号:28439601
- 上传时间:2023-07-13
- 格式:DOCX
- 页数:66
- 大小:46.15KB
程序员模拟面试题.docx
《程序员模拟面试题.docx》由会员分享,可在线阅读,更多相关《程序员模拟面试题.docx(66页珍藏版)》请在冰豆网上搜索。
程序员模拟面试题
程序员笔试题
概念性题目:
1)指针和引用有什么分别;如果传引用比传指针安全,为什么?
如果我使用常量指针难道不行吗?
答案:
引用必须初始化,指针不用;引用初始化后不能被改变,而指针可以改变所指向的对象;不存在指向空值的引用,但是存在可以指向空值的指针。
解释:
(1)引用在创建的同时必须初始化,即引用到一个有效的对象;而指针在定义的时候不必初始化,可以在定义后面的任何地方重新赋值.
(2)不存在NULL引用,引用必须与合法的存储单元关联;而指针则可以是NULL.
(3)引用一旦被初始化为指向一个对象,它就不能被改变为另一个对象的引用;而指针在任何时候都可以改变为指向另一个对象.给引用赋值并不是改变它和原始对象的绑定关系.
(4)引用的创建和销毁并不会调用类的拷贝构造函数
(5)语言层面,引用的用法和对象一样;在二进制层面,引用一般都是通过指针来实现的,只不过编译器帮我们完成了转换.
不存在空引用,并且引用一旦被初始化为指向一个对象,它就不能被改变为另一个对象的引用,显得很安全。
const指针仍然存在空指针,并且有可能产生野指针.
总的来说:
引用既具有指针的效率,又具有变量使用的方便性和直观性.
2)参数传递有几种方式;实现多态参数传递采用什么方式,如果没有使用某种方式原因是什么;
传值,传指针或者引用
采用引用的方式在多态中进行传参
原因:
使用引用可以节省空间和时间,用于对象时不用调用拷贝构造函数产生参数副本,可以调高效率,直观,安全。
3)C++和C定义结构的分别是什么。
C语言的结构仅仅是数据的结合,不可以定义方法。
C++的struct和class其实具备几乎一样的功能,只是默认的访问属性不一样而已。
4)构造函数可否是虚函数,为什么?
析构函数呢,可否是纯虚的呢?
构造函数不能为虚函数,要构造一个对象,必须清楚地知道要构造什么,否则无法构造一个对象。
析构函数可以为纯虚函数。
5)拷贝构造函数相关问题,深拷贝,浅拷贝,临时对象等。
深拷贝意味着拷贝了资源和指针。
而浅拷贝只是拷贝了指针,没有拷贝资源,
这样使得两个指针指向同一份资源,造成对同一份析构两次,程序崩溃。
临时对象的开销比局部对象小些。
6)在什么时候需要使用“常引用”?
如果既要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变,就应使用常引用。
常引用声明方式:
const类型标识符&引用名=目标变量名。
7)将“引用”作为函数返回值类型的格式、好处和需要遵守的规则?
好处:
在内存中不产生被返回值的副本;(注意:
正是因为这点原因,所以返回一个局部变量的引用是不可取的。
因为随着该局部变量生存期的结束,相应的引用也会失效,产生runtimeerror!
注意事项:
(1)不能返回局部变量的引用。
(2)不能返回函数内部new分配的内存的引用。
(3)可以返回类成员的引用,但最好是const。
(4)流操作符重载返回值申明为“引用”的作用:
(5)在另外的一些操作符中,却千万不能返回引用:
+-*/四则运算符。
8)引用与多态的关系?
引用是除指针外另一个可以产生多态效果的手段。
这意味着,一个基类的引用可以指向它的派生类实例。
9)#include
答:
前者是从StandardLibrary的路径寻找和引用file.h,而后者是从当前工作路径搜寻并引用file.h。
10)Newdelete与mallocfree的联系与区别?
都是在堆(heap)上进行动态的内存操作。
用malloc函数需要指定内存分配的字节数并且不能初始化对象,new会自动调用对象的构造函数。
delete会调用对象的destructor,而free不会调用对象的destructor.
11)描述内存分配方式以及它们的区别?
1)从静态存储区域分配。
内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。
例如全局变量,static变量。
2)在栈上创建。
在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。
栈内存分配运算内置于处理器的指令集。
3)从堆上分配,亦称动态内存分配。
程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。
动态内存的生存期由程序员决定,使用非常灵活,但问题也最多。
12)C++中struct和class的区别
struct的成员默认是公有的,而类的成员默认是私有的。
struct和class在其他方面是功能相当的。
13)当一个类A中没有声明任何成员变量与成员函数,这时sizeof(A)的值是多少?
1
14)(重要)分别写出BOOL,int,float,指针类型的变量a与“零”的比较语句。
答案:
规范写法
BOOL:
if(!
a)orif(a)
int:
if(a==0)
float:
constEXPRESSIONEXP=0.000001
if(a
pointer:
if(a!
=NULL)orif(a==NULL)
15)请说出const与#define相比,有何优点?
答案:
1)const常量有数据类型,而宏常量没有数据类型。
编译器可以对前者进行类型安全检查。
而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。
2)有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。
16)类成员函数的重载、覆盖和隐藏区别?
答案:
a.成员函数被重载的特征:
(1)相同的范围(在同一个类中);
(2)函数名字相同;
(3)参数不同;
(4)virtual关键字可有可无。
b.覆盖(重写)是指派生类函数覆盖基类函数,特征是:
(1)不同的范围(分别位于派生类与基类);
(2)函数名字相同;
(3)参数相同;
(4)基类函数必须有virtual关键字。
c.“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下:
(1)如果派生类的函数与基类的函数同名,但是参数不同。
此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。
(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。
此时,基类的函数被隐藏(注意别与覆盖混淆)
17)ISO的七层模型是什么?
tcp/udp是属于哪一层?
tcp/udp有何优缺点?
应用层、表示层、会话层、传输层、网络层、链路层、物理层
tcp/udp属于传输层
TCP服务提供了数据流传输、可靠性、有效流控制、全双工操作和多路复用技术等。
与TCP不同,UDP并不提供对IP协议的可靠机制、流控制以及错误恢复功能等。
由于UDP比较简单,UDP头包含很少的字节,比TCP负载消耗少。
tcp:
提供稳定的传输服务,有流量控制,缺点是包头大,冗余性不好
udp:
不提供稳定的服务,包头小,开销小
18)数组和链表的区别
数组:
数据顺序存储,固定大小
链表:
数据可以随机存储,大小可动态改变
19)类的静态成员和非静态成员有何区别?
类的静态成员每个类只有一个,非静态成员每个对象一个
20)纯虚函数如何定义?
使用时应注意什么?
virtualvoidf()=0;
是接口,子类必须要实现
21)进程死锁的原因
资源竞争及进程推进顺序非法
23)死锁的4个必要条件
互斥、请求保持、不可剥夺、环路
24)死锁的处理
鸵鸟策略、预防策略、避免策略、检测与解除死锁
25)列举几种进程的同步机制,并比较其优缺点。
原子操作
信号量机制
自旋锁
管程,会合,分布式系统
26)进程之间通信的途径
共享存储系统
消息传递系统
管道:
以文件系统为基础
27)TCP/IP建立连接的过程
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
第一次握手:
建立连接时,客户端发送连接请求到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:
服务器收到客户端连接请求,向客户端发送允许连接应答,此时服务器进入SYN_RECV状态;
第三次握手:
客户端收到服务器的允许连接应答,向服务器发送确认,客户端和服务器进入通信状态,完成三次握手
28)头文件中的ifndef/define/endif的作用是什么?
防止该头文件被重复引用。
29)C++是不是类型安全的?
不是。
两个不同类型的指针之间可以强制转换(用reinterpretcast)。
C#是类型安全的。
30)流操作符重载返回值申明为“引用”的作用:
流操作符<<和>>,这两个操作符常常希望被连续使用,例如:
cout<<"hello"< 可选的其它方案包括: 返回一个流对象和返回一个流对象指针。 但是对于返回一个流对象,程序必须重新(拷贝)构造一个新的流对象,也就是说,连续的两个<<操作符实际上是针对不同对象的! 这无法让人接受。 对于返回一个流指针则不能连续使用<<操作符。 因此,返回一个流对象引用是惟一选择。 这个唯一选择很关键,它说明了引用的重要性以及无可替代性,也许这就是C++语言中引入引用这个概念的原因吧。 赋值操作符=。 这个操作符象流操作符一样,是可以连续使用的,例如: x=j=10;或者(x=10)=100;赋值操作符的返回值必须是一个左值,以便可以被继续赋值。 因此引用成了这个操作符的惟一返回值选择。 数据库常见面试题 1.触发器的作用? 答: 触发器是一中特殊的存储过程,主要是通过事件来触发而被执行的。 它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。 可以联级运算。 如,某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触发器被触发。 触发器: 当满足触发器条件,则系统自动执行触发器的触发体。 触发时间: 有before,after.触发事件: 有insert,update,delete三种。 触发类型: 有行触发、语句触发 2.什么是存储过程? 用什么来调用? 答: 存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。 如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。 可以用一个命令对象来调用存储过程。 3.索引的作用? 和它的优点缺点是什么? 答: 索引就一种特殊的查询表,数据库的搜索引擎可以利用它加速对数据的检索。 它很类似与现实生活中书的目录,不需要查询整本书内容就可以找到想要的数据。 索引可以是唯一的,创建索引允许指定单个列或者是多个列。 缺点是它减慢了数据录入的速度,同时也增加了数据库的尺寸大小。 4、什么是内存泄漏? 答: 一般我们所说的内存泄漏指的是堆内存的泄漏。 堆内存是程序从堆中为其分配的,大小任意的,使用完后要显示释放内存。 当应用程序用关键字new等创建对象时,就从堆中为它分配一块内存,使用完后程序调用free或者delete释放该内存,否则就说该内存就不能被使用,我们就说该内存被泄漏了。 5维护数据库的完整性和一致性,你喜欢用触发器还是自写业务逻辑? 为什么? 答: 我是这样做的,尽可能使用约束,如check,主键,外键,非空字段等来约束,这样做效率最高,也最方便。 其次是使用触发器,这种方法可以保证,无论什么业务系统访问数据库都可以保证数据的完整新和一致性。 最后考虑的是自写业务逻辑,但这样做麻烦,编程复杂,效率低下。 6、什么是事务? 什么是锁? 答: 事务就是被绑定在一起作为一个逻辑工作单元的SQL语句分组,如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上有个节点。 为了确保要么执行,要么不执行,就可以使用事务。 要将有组语句作为事务考虑,就需要通过ACID测试,即原子性,一致性,隔离性和持久性。 锁: 在所以的DBMS中,锁是实现事务的关键,锁可以保证事务的完整性和并发性。 与现实生活中锁一样,它可以使某些数据的拥有者,在某段时间内不能使用某些数据或数据结构。 当然锁还分级别的。 7、什么叫视图? 游标是什么? 答: 视图是一种虚拟的表,具有和物理表相同的功能。 可以对视图进行增,改,查,操作,试图通常是有一个表或者多个表的行或列的子集。 对视图的修改不影响基本表。 它使得我们获取数据更容易,相比多表查询。 游标: 是对查询出来的结果集作为一个单元来有效的处理。 游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行。 可以对结果集当前行做修改。 一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。 8、为管理业务培训信息,建立3个表: S(S#,SN,SD,SA)S#,SN,SD,SA分别代表学号,学员姓名,所属单位,学员年龄 C(C#,CN)C#,CN分别代表课程编号,课程名称 SC(S#,C#,G)S#,C#,G分别代表学号,所选的课程编号,学习成绩 (1)使用标准SQL嵌套语句查询选修课程名称为’税收基础’的学员学号和姓名? 答案: selects#,snfromswhereS#in(selectS#fromc,scwherec.c#=sc.c#andcn=’税收基础’) (2)使用标准SQL嵌套语句查询选修课程编号为’C2’的学员姓名和所属单位? 答: selectsn,sdfroms,scwheres.s#=sc.s#andsc.c#=’c2’ (3)使用标准SQL嵌套语句查询不选修课程编号为’C5’的学员姓名和所属单位? 答: selectsn,sdfromswheres#notin(selects#fromscwherec#=’c5’) (4)查询选修了课程的学员人数 答: select学员人数=count(distincts#)fromsc (5)查询选修课程超过5门的学员学号和所属单位? 答: selectsn,sdfromswheres#in(selects#fromscgroupbys#havingcount(distinctc#)>5) 9、锁: 共享锁、互斥锁 两段锁协议: 阶段1: 加锁阶段阶段2: 解锁阶段 10.死锁及处理: 事务循环等待数据锁,则会死锁。 死锁处理: 预防死锁协议,死锁恢复机制 11、存储过程: 存储过程就是编译好了的一些sql语句。 1.存储过程因为SQL语句已经预编绎过了,因此运行的速度比较快。 2可保证数据的安全性和完整性。 通过存储过程可以使没有权限的用户在控制之下间接地存取数据库,从而保证数据的安全。 通过存储过程可以使相关的动作在一起发生,从而可以维护数据库的完整性。 3.可以降低网络的通信量。 存储过程主要是在服务器上运行,减少对客户机的压力。 4: 存储过程可以接受参数、输出参数、返回单个或多个结果集以及返回值。 可以向程序返回错误原因 5: 存储过程可以包含程序流、逻辑以及对数据库的查询。 同时可以实体封装和隐藏了数据逻辑。 12、内联接,外联接区别? 内连接是保证两个表中所有的行都要满足连接条件,而外连接则不然。 在外连接中,某些不满条件的列也会显示出来,也就是说,只限制其中一个表的行,而不限制另一个表的行。 分左连接、右连接、全连接三种 32)Student(S#,Sname,Sage,Ssex)学生表 S#: 学号;Sname: 学生姓名;Sage: 学生年龄;Ssex: 学生性别 Course(C#,Cname,T#)课程表 C#,课程编号;Cname: 课程名字;T#: 教师编号 SC(S#,C#,score)成绩表 S#: 学号;C#,课程编号;score: 成绩 Teacher(T#,Tname)教师表 T#: 教师编号;Tname: 教师名字 问题: 1、查询“001”课程比“002”课程成绩高的所有学生的学号; selecta.S#from(selects#,scorefromSCwhereC#='001')a,(selects#,score fromSCwhereC#='002')b wherea.score>b.scoreanda.s#=b.s#; 2、查询平均成绩大于60分的同学的学号和平均成绩; selectS#,avg(score) fromsc groupbyS#havingavg(score)>60; 3、查询所有同学的学号、姓名、选课数、总成绩; selectStudent.S#,Student.Sname,count(SC.C#),sum(score) fromStudentleftOuterjoinSConStudent.S#=SC.S# groupbyStudent.S#,Sname 4、查询姓“李”的老师的个数; selectcount(distinct(Tname)) fromTeacher whereTnamelike'李%'; 5、查询没学过“叶平”老师课的同学的学号、姓名; selectStudent.S#,Student.Sname fromStudent whereS#notin(selectdistinct(SC.S#)fromSC,Course,Teacherwhere SC.C#=Course.C#andTeacher.T#=Course.T#andTeacher.Tname='叶平'); 6、查询学过“001”并且也学过编号“002”课程的同学的学号、姓名; selectStudent.S#,Student.SnamefromStudent,SCwhereStudent.S#=SC.S#andSC.C#='001'andexists(Select*fromSCasSC_2whereSC_2.S#=SC.S#andSC_2.C#='002'); 7、查询学过“叶平”老师所教的所有课的同学的学号、姓名; selectS#,Sname fromStudent whereS#in(selectS#fromSC,Course,TeacherwhereSC.C#=Course.C#andTeacher.T#=Course.T#andTeacher.Tname='叶平'groupbyS#havingcount(SC.C#)=(selectcount(C#)fromCourse,Teacher whereTeacher.T#=Course.T#andTname='叶平')); 8、查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名; SelectS#,Snamefrom(selectStudent.S#,Student.Sname,score,(selectscorefromSCSC_2whereSC_2.S#=Student.S#andSC_2.C#='002')score2 fromStudent,SCwhereStudent.S#=SC.S#andC#='001')S_2wherescore2 9、查询所有课程成绩小于60分的同学的学号、姓名; selectS#,Sname fromStudent whereS#notin(selectStudent.S#fromStudent,SCwhereS.S#=SC.S#andscore>60); 10、查询没有学全所有课的同学的学号、姓名; selectStudent.S#,Student.Sname fromStudent,SC whereStudent.S#=SC.S#groupby Student.S#,Student.Snamehavingcount(C#)<(selectcount(C#)fromCourse); 11、查询至少有一门课与学号为“1001”的同学所学相同的同学的学号和姓名; selectS#,SnamefromStudent,SCwhereStudent.S#=SC.S#andC#inselectC#fromSCwhereS#='1001'; 12、查询至少学过学号为“001”同学所有一门课的其他同学学号和姓名; selectdistinctSC.S#,Sname fromStudent,SC whereStudent.S#=SC.S#andC#in(selectC#fromSCwhereS#='001'); 13、把“SC”表中“叶平”老师教的课的成绩都更改为此课程的平均成绩; updateSCsetscore=(selectavg(SC_2.score) fromSCSC_2 whereSC_2.C#=SC.C#)fromCourse,TeacherwhereCourse.C#=SC.C#andCourse.T#=Teacher.T#andTeacher.Tname='叶平'); 14、查询和“1002”号的同学学习的课程完全相同的其他同学学号和姓名; selectS#fromSCwhereC#in(selectC#fromSCwhereS#='1002') groupbyS#havingcount(*)=(selectcount(*)fromSCwhereS#='1002'); 15、删除学习“叶平”老师课的SC表记录; DelectSC fromcourse,Teacher whereCourse.C#=SC.C#andCourse.T#=Teacher.T#andTname='叶平'; 16、向SC
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序员 模拟 试题
![提示](https://static.bdocx.com/images/bang_tan.gif)