程序员面试题范文
程序员面试题范文(精选6篇)
程序员面试题 第1篇
1:如果一个对象equals另一个对象,那么他们的hashcode一定相同
2:如果一个对象==另一个对象,那么他们的hashcode一定相同
3:instanceof运算符可以用来决定某对象的类是否实现了某个接口
4:Spring/webwork/Hibernate是几个实现MVC的框架
5:运行在一台主机上的服务器进程,其端口号不能重复
6:属于unix主机系统的可热插拔硬盘,在取出硬盘前,必须先将该硬盘的文件系统拆卸unmound下来.
7:HTML是XML
8:Jsp不是servlet
9:数据库触发器的编译代码不在数据库中存储,所以多次触发触发器时,数据库管理系统都
将对触发器进行编译,然后执行它.
10:事务transctions是数据库管理系统进行并发控制的最小单位.
更多与计算机专业相关的面试试题分享,大家可继续阅读:
1、C语言笔试题目及答案
2、网管系统维护工程师面试题
3、网络系统分析工程师传输类笔试题
程序员面试题 第2篇
但是如果data.inc中包含JSP CODE,我们可以使用:<%@include file=“data.inc”%>
2、如何执行一个线程安全的JSP?只需增加如下指令
<%@ page isThreadSafe=“false” %>
3、JSP如何处理HTML FORM中的数据?通过内置的request对象即可,如下:<%
String item = request.getParameter(“item”);int howMany = new
Integer(request.getParameter(“units”)).intValue();%>
4、在JSP如何包含一个静态文件?
静态包含如下:<%@ include file=“copyright.html” %>动态包含如下:
5、在JSP中如何使用注释?主要有四种方法:1。<%– 与 –%> 2。// 3。/**与**/ 4。
6、在JSP中如何执行浏览重定向?使用如下方式即可:
response.sendRedirect(“");
也能物理地改变HTTP HEADER属性,如下:<%
response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
String newLocn=”/newpath/index.html“;response.setHeader(”Location“,newLocn);%>
7、如何防止在JSP或SERVLET中的输出不被BROWSER保存在CACHE中?
把如下脚本加入到JSP文件的开始即可:<%
response.setHeader(”Cache-Control“,”no-store“);//HTTP 1.1response.setHeader(”Pragma“,”no-cache“);//HTTP 1.0response.setDateHeader(”Expires“, 0);//prevents caching at the proxy server%>
8、在JSP中如何设置COOKIE?
COOKIE是作为HTTP HEADER的一部分被发送的,如下方法即可设置:<%
Cookie mycookie = new Cookie(”aName“,”aValue“);response.addCookie(mycookie);
%>
9、在JSP中如何删除一个COOKIE?<%
Cookie killMyCookie = new Cookie(”mycookie“, null);killMyCookie.setMaxAge(0);killMyCookie.setPath(”/“);response.addCookie(killMyCookie);%>
10、在一个JSP的请求处理中如何停止JSP的执行如下例:<%
if(request.getParameter(”wen“)!= null){// do something} else {return;}%>
11、在JSP中如何定义方法
你可以定义方法,但是你不能直接访问JSP的内置对象,而是通过参数的方法传递。如下:<%!
public String howBadFrom(HttpServletRequest req){HttpSession ses = req.getSession();...return req.getRemoteHost();}%><%
out.print(”in general,lao lee is not baddie “);%>
<%= howBadFrom(request)%>
12、如果BROWSER已关闭了COOKIES,在JSP中我如何打开SESSION来跟踪
使用URL重写即可,如下:hello1.jsp
<%@ page session=”true“ %><%
Integer num = new Integer(100);session.putValue(”num“,num);
String url =response.encodeURL(”hello2.jsp“);%>
>hello2.jsphello2.jsp
<%@ page session=”true“ %><%
Integer i=(Integer)session.getValue(”num“);out.println(”Num value in session is “+i.intValue());%>
13、在JSP中能发送EMAIL吗
可以使用SUN的专用包:sun.net.smtp包。如下脚本使用
SmtpClient类发送EMAIL。
<%@ page import=”sun.net.smtp.SmtpClient, java.io.*“ %><%
String from=”ybwen@sina.com“;
String to=”hewenjun@yeah.net, lei@who.com.cn“;try{
SmtpClient client = new SmtpClient(”mail.xxxxx.xxx“);client.from(from);client.to(to);
PrintStream message = client.startMessage();message.println(”To: “ + to);
message.println(”Subject: Sending email from JSP!“);message.println(”This was sent from a JSP page!“);message.println();
message.println(”Cool!:-)“);message.println();
message.println(”Good Boy“);message.println(”Im in genius.com“);message.println();client.closeServer();}
catch(IOException e){
System.out.println(”ERROR SENDING EMAIL:“+e);}%>
14、在SERVLET中我能调用一个JSP错误页吗
当然没问题,如下展示了如何在一个SERVLET控制逻辑单元内调用一个JSP错误页面。
HttpServletResponse response, String errorPageURL,Throwable e)
throws ServletException, IOException {getServletConfig().getServletContext().getRequestDispatcher(errorPageURL).forward(request,response);}
public void doPost(HttpServletRequest request,HttpServletResponse response){try {
// do something
} catch(Exception ex){try {
sendErrorRedirect(request,response,”/jsp/MyErrorPage.jsp“,ex);
} catch(Exception e){e.printStackTrace();} } }
15、JSP和APPLET如何通讯
JSP如何与EJB SessionBean通讯下面的代码段作了很好的示范<%@ page import=”javax.naming.*, javax.rmi.PortableRemoteObject,foo.AccountHome, foo.Account“ %><%!
//定义一个对SessionBeanHome接口实例的全局引用AccountHome accHome=null;
public void jspInit(){//获得Home接口实例
InitialContext cntxt = new InitialContext();
Object ref= cntxt.lookup(”java:comp/env/ejb/AccountEJB“);accHome =
(AccountHome)PortableRemoteObject.narrow(ref,AccountHome.class);}%><%
//实例化SessionBean
Account acct = accHome.create();//调用远程方法acct.doWhatever(...);// 如此等等%>
16、当我使用一个结果集时,如何防止字段为”null“的字域显示在我的HTML输入文本域中?
可以定义一个简单的函数来达到目的,如下:String blanknull(String s){return(s == null)? ”“ : s;}
然后在JSP的FORM中,可以这样使用
“>
17、如何中SERVLET或JSP下载一个文件(如:binary,text,executable)?现提供两个解决方案:A:使用HTTP,B:在Servlet中,通过设置ContentType和使用java.io包的Stream等类可作到.例如:
response.setContentType(”application/x-msword“);然后想输出缓冲中写一些东东即可。
18、使用useBean标志初始化BEAN时如何接受初始化参数使用如下两标签即可:
protected void sendErrorRedirect(HttpServletRequest <%!
%>
19、使用JSP如何获得客户浏览器的信息?使用request.getHeader(String)即可20、能象调用子程序一样调用JSP吗?
当然可以,用
32、对一个JSP页,如果多个客户端同时请求它,同步可能吗?在jsp:useBean语法中使用beanName有何好处?beanName使用Beans.instantiate()初始化Bean33、当我使用
21、当我重编译我的JSP使用的一个类后,为什么JVM继续使用我的老CLASS?
<%@include file=”abc.jsp“%>与
前一个为静态包含,而后一个为动态包含
22、JSP的缺点?
1。对JAVA程序进行调试没有好东东
2。因大多数的servlet引擎不支持connection pooling3。Servlet引擎没有标准4。JSP与其它脚本语言的交互
23、JSP能进行递归调用吗?当然可以,如对form的提交给本页
34、如何实现JSP的国际化?
为各种版本提供resource bundles属性文件即可
25、在JSP中如何写文本文件?使用PrintWriter对象,如:<%@ page import=”java.io.*“ %><%
String str = ”print me“;
String nameOfTextFile = ”/usr/anil/imp.txt“;try {
PrintWriter pw = new PrintWriter(new FileOutputStream(nameOfTextFile));pw.println(str);pw.close();
} catch(IOException e){out.println(e.getMessage());}%>
26、如何在JSP中包括绝对路径文件?使用URLConnection即可。
27、在servlets和JSP之间能共享session对象吗?当然可以,HttpSession session = request.getSession(true);session.putValue(”variable“,”value");
28、JavaScript的变量能复制到JSP的SESSION中吗?
29、如何设置cookie在某一时间后过期?用Cookie.setMaxAge(int)30、如何获得当前的sessions数?
可以使用HttpSessionBindingListeners来跟踪
31、能设置一些代码在我所有的JSP文件之上运行?如果可以,能共享吗?
当然可以,可以为你的JSP文件定义一个别
34、如何转换JSP 0.9版本的文件到JSP1.1?可使用sed/awk即可
35、使用JSP能设置HTML FORM中输入域的焦点,不用JavaScript?没办法
公选科级干部面试题解析 第3篇
综合分析类
第一题:有人认为, 一个人要发展, 必须要靠机遇, 但也有人说机遇可遇不可求, 最终要靠实力。对此, 你怎么看?如果这次竞争成功, 你认为自己靠的是机遇还是实力?
【解析】这是一道综合分析类型的题目, 同时也是一道观点阐述类型的题目, 旨在考察考生的综合分析能力、辩证思维能力和语言表达能力。
从出题者的思路来说, 看考生能否对不同的观点作出正确的判断, 并对观点提出认同的理由。如果考生选择错误, 那么给出的理由就有可能牵强附会, 难以自圆其说。实际上, 多数观点类型的题目, 必须都是正确的, 但是, 必须要客观地看、辩证地看、从不同角度去看, 都有一定的道理, 又都似乎有不周到的地方。当然, 也有的就是错误的。这就要看考生的知识面, 能否上升到哲学的高度去理解和分析。就这一道题目而言, 回答起来是非常简单的。首先要肯定这两种观点都是正确的, 但都不够全面;其次是要指出, 一个人要发展, 既要靠机遇, 更要靠实力, 是机遇和实力的结合, 成就一个人的发展。当然, 首先是要有实力, 然后是机遇。不然, 有了机遇, 没有实力也不成。只有有了实力, 一旦有了机遇, 才能成功。再次是要考生回答, 如果这次竞争成功, 认为自己靠的是机遇还是实力的问题。对于这一问的回答, 无非是结合自身的实际, 再谈谈对本次公选给了自己的机遇, 但是, 真正使自己竞争成功的, 还是自己的实力, 是自己平时注重学习。注重知识积累、注重提高能力, 而使自己能够从众多的竞争者中脱颖而出。
从考官对考生的评判标准来说, 着重要把握的就是上述三个方面, 考生回答得越是诚恳、可信, 越是能够打动考官。也可以添加一些具体生活或工作中的小事例, 加以说明。
从当天本组35名考生的回答来看, 几乎所有回答都是完美的, 考官给出的小分都很高, 几乎都在上等的位置。
情境模拟类
第二题:如果你到新岗位工作后, 手下只有两个兵。小孙业务能力强, 但性格孤僻;小赵勤勤恳恳, 但能力一般。小孙经常瞧不起小赵, 小赵对小孙也经常抱怨。你将如何带领这支团队开展工作?
【解析】这是一道情境模拟类型的题目, 也是一道人际沟通与协调类型的题目。旨在考察考生的领导能力, 对下属如何做好思想工作, 团结一致完成组织目标的能力。
从出题者的思路来说, 主要看考生能否站在全局和大局的高度, 协调好下属的矛盾, 发挥团队合作精神, 实现有效组织目标。对于这一道题目回答, 考生必须要把握以下几点:一是作为新任领导, 对遇到题目给定的情况, 必须要认真对待, 冷静处置。不然就会出现“三个人三条心”的状况。二是要通过交流谈心, 了解两个兵背后的真实情况, 进行具体问题, 具体分析。三是要明确工作职责范围, 把注意力引导到工作上来。四是要加强思想教育, 让他们感受到团结出生命力、团结出战斗力。五是要通过自己的努力和表率作用, 让他们感受到人与人相处, 需要理解与包容。特别是在一起工作, 既需要合作, 更需要有团队精神、大局意识, 来调动他们的工作积极性, 主动作为。
从考官对考生的评判标准来说, 衡量一个考生的回答是否完美, 主要就是看上述的五个方面。当然, 从回答中还可以看出考生是否真正具有一个领导者应有的风范和领导方法。同样, 还有效率、激励、考核等, 能够回答到, 会更加完美。
从当天本组35名考生的回答来看, 绝大多数回答是不错的, 仅有少数考生回答得不够理想。从考官给出考生的小分来看, 都在中等偏上。
组织协调类
第三试题:某县正在开展“访民情、解民忧、办实事”活动, 组织上安排你带队到某村走访, 群众向你们反映了许多农村公共基础设施建设上的问题, 有的桥梁年久失修, 存在极大安全隐患;有的村民组电路严重老损, 一到夏天便无法用电。面对群众提出的问题, 你打算怎么去处理?
【解析】这既是一道情境模拟类型的题目, 也是一道组织协调类型的题目。旨在考察考生的群众观念, 政策法律意识, 组织协调和处理复杂问题的能力。
从出题者的思路来看, 是要考生能够准确把握中央对领导干部“访民情、解民忧、办实事”的理解, 通过“访、摸、办”真正体验到农村工作的艰难、农民的艰辛、农业生产的艰苦, 更加重视和关注“三农”。尤其是中央对今后“三农”工作提出的宏伟蓝图, 发展目标, 要有新的理解。过去我们常说:“群众事无小事”, 那么, 涉及农民、农业、农村每一件事, 都事关农民的切身利益。需要考生通过自己的回答, 体验出对“三农”的关心与关注。回答好这一题目, 可以说, 对多数考生来说, 有一定难度, 但是, 作为一名领导干部, 必须要了解。因为一旦走上领导岗位, 这样的事是常常发生的, 要能够面对, 更要敢于面对。
从考官对这一道题目需要把握的要点来看, 着重在以下几个方面:一是要熟悉上级政策和相关要求。究竟什么是政策能够解决的, 什么是政策不能够解决的。二是要带着感情下去, 真正把农民当亲人。只有当亲人, 才能体会到农民朋友的“难”。三是要摸清农村、农业、农民的真实状况, 给上级领导机关提出意见或建议, 加大对“三农”工作的支持。四是要主动协调相关部门, 给予相应的支持, 特别是供电、交通、水利、乡村建设等部门的支持。毕竟, 这几年, 中央和各级政府都在加大对“三农”工作的支持, 有许多项目资金等待投入。五是要主动帮助基层组织编制项目, 同他们一道跑部门, 争取项目支持。“访民情、解民忧、办实事”的落脚点就是“办实事”, 解决了群众的需要是活动的目的, 也是关键。
|轻松阅读东鳞西爪|DONGLINXIZHAO
古代首脑有哪些称呼
□赖军
夏代以前, 全氏族的共同始祖就是天然的首领, 称为“后”, 本意是生育。部落和部落联盟的首领称“伯”, 由选举产生, 伯即老大之意。大禹治水后中原出现了最早的国家夏, 夏朝的首脑称后。从商汤开始, 国家的首脑称王。周王统治的地区叫“天下”, 由周王分封的诸侯统治区域叫“国”, 由诸侯再分的大夫领地叫“家”。周王又称“天子”, 意为上天之长子受命于天在人间进行统治。周天子的各个封国君主都由周王策命, 王畿内的统治者称“公”或“伯”, 王畿外的一般通称为“侯”, 诸侯死后一般尊称为“公”, 并评一个称号, 叫做“谥号”。
从当天本组35名考生的回答来看, 这一道题目, 多数没有回答好。从考官给出的小分来看, 多数在中等偏下, 关键是没有能够吃透政策, 把握住题目中的关键问题是“访民情”, 是要对“群众向你们反映了许多农村公共基础设施建设上的问题, 有的桥梁年久失修, 存在极大安全隐患;有的村民组电路严重老损, 一到夏天便无法用电”等问题的处理。可以看出考生对上级领导对基层干部要求的关注度不够。
总之, 中组部对公选干部有一个明确的指导思想, 就是“干什么、考什么”, “考什么, 更需要干部去干什么”, 往往许多考生缺少的就是对实际工作的了解和把握, 可以看出基层锻炼对年轻干部成长的重要。近年来, 许多突发事件的发生, 本身只是少数人的维权, 但是, 之所以成了群体性的事件, 就是许多干部缺少对基层群众的了解, 用过急的“对手思维”方式去处理, 结果很糟。所以考生要切实加强基层锻炼, 才能走上领导岗
编辑史新建
秦始皇统一中国, 决定用皇帝这个称号, 皇帝是理想化的君主和至高无上的太阳神的化身。从秦始皇到辛亥革命推翻清王朝, 皇帝的称号在中国沿用了两千多年。皇帝自称“朕”, 臣民称皇帝叫“陛下”, 史官记事称皇帝为“上”, 皇帝说的话叫“制”“诏”, 通俗说法叫“圣旨”或“金口玉言”。皇帝所用之物叫“御”, 所用之印叫“玺”, 所到之处叫“幸”。臣民谈皇帝通常以“县官”代之, “万岁”也是皇帝的代称。■
“天才”面试题 第4篇
1房里有三盏灯,房外有三个开关,在房外看不见房内的情况。但可以任意扳动开关。你只能进门观察一次,你用什么方法来区分哪个开关控制哪一盏灯?
2有两根粗细不均匀的香,燃烧时快时慢,但每根香烧完的时间确定是一小时。你能用什么方法来确定45分钟的时间?
3村子里有50个人,每个人都有一条狗,在这50条狗中有病狗(这种病不传染),人们要找出病狗。每个人可以观察其他49条狗,以判断它们是否生病,但只有自己的狗不能看,观察后得到的结果不能交流,也不能通知病狗的主人。主人一旦推算出自己的狗有病时,就必须在一天内将其枪毙,而且只有权力枪毙自己的狗,没有权力打死其他人的狗。第一天大家全看完了,但枪没响,第二天枪也没响,第三天才传来枪响。问:村里共有几条病狗?如何推算出来的?
4在太平洋的一个小岛上生活着土著人,他们不愿意被外人打扰。一天,一位探险家到了岛上,被土著人捉住,土著人的首领告诉他:“你临死前可以有个机会留下一句话,如果这句话是真的,你将被烧死;如果是假的。你将被五马分尸。”可怜的探险家说什么才能活下来?
5一个老师为了测试一下A、B两个学生哪一个反应速度更快,就把他们带到一个伸手不见五指的黑房子里。老师打开灯说:“这张桌子上有五顶帽子,两顶是红色的,三顶是黑色的。现在,我把灯关掉,并把帽子的顺序搞乱,然后,我们三人每人摸一顶戴在头上。当我把灯打开时,请你们尽快说出,自己头上戴的是什么颜色的帽子。”然后老师把灯关掉了,三个人都摸了一顶帽子戴在头上,同时,老师把另外两顶藏起来了。电灯打开后,那两个同学看到老师头上戴着的是顶红色的帽子,过了一会儿,A喊道:“我戴的是黑帽子。”请问A是如何推理的?
答案(仅供参考):
1先打开两个开关,等一段时间再关上其中一个,马上进里观察。打开的灯对应打开的开关,因此用手摸到热的灯对应刚刚关闭的开关,凉的对应始终投打开的开关。
2点燃其中一根。并把另一根两头点燃。第二根烧完恰好过去30分钟,第一根剩下部分应该能支撑30分钟的燃烧。然后把第一根剩下的部分两头点燃,15分钟即可燃尽,此过程一共耗时45分钟。
3若只有一条病狗,病狗的主人看到其他的狗都沒有病,那么就知道自己的狗有病,所以第一天晚上就会枪响。因为没有枪响,就说明病狗数量大于1。若有两条病狗,病狗的主人会看到有一条病狗,而第一天没听到枪响,说明病狗数大于1,所以病狗主人也会知道自己的狗有病,因而第二天会听枪响,既然第二天枪也没响,说明病狗数大于2。依此类推,如果第三天听到枪响。说明有三条病狗。
4这是一个悖论问题,探险家只能描述一种非真非假的状况,比如:我将被五马分尸。如果土著判定这话是真的,那么他将被烧死——这样“五马分尸”就成假的了。如果土著判定这话是假的,那他将被五马分尸的话就变成了真的。
5如果A戴的是红帽子,那么B马上就可以猜出自己戴的是黑帽子(因为红帽子只有两顶);而B并没有立刻猜到,所以A马上推断出自己戴的是黑帽子!
汪新才摘自《狗眼看世界》
网站程序员面试题 第5篇
正题吧,说说笔试题。之前还以为会有诸如“令狐冲对岳不群的看法”这样的题目,结果基本都是基础题,还好,本来那些武侠都忘的差不多了
选择题
第一题,两台电脑在局域网中,机器为千兆网卡,一台作服务器里面有一张网页为1K字节,问另一台下载这个网页的速度。
我答:我不知道1K是指1024还是1000不过按我的算法没区别,1000 000000/8/1k
我选了10 000张/秒
第二题,单链表插入一个节点的问题。在p指向的节点后插入一个q指向的节点。
我答:q->next=p->next;p->next=q;
之后乱序,我记不清楚题号了。
有一题,地图染色问题,每个国家用矩形表示,让相邻国家颜色不同。离散里面有
有一题,问快速排序达到最坏情况时间复杂度n2的原数数组的具体情形。见数据结构
有一题,很扯的指针取址符号混乱,选项却很白痴。
有一题,入栈序列1,2,3,4,5,..,n,第一个出栈的是n,问第i个出栈的是多少。
我答:n-i+1
最后一题,给中缀和后缀表达式,求前缀表达式。
填空题
第一题:数组(a1,a2,a3,a4..,an),删除任意一个的概率相同,问平均删除一个要移动多少个。
我答:(n-1)/2
第二题:一个程序填空,程序大意是在数组里面找第二大的数。
注:不难
第三题:大致如下一个程序片段:
void xxx(x)
{
intcountx=0;
while(x)
{
countx++;
x=x&(x-1);
}
cout<
}
问xxx(9999)输出什么。
程序员网络面试题 第6篇
分析:答案是不可以。C++编译器在实现const的成员函数的时候为了确保该函数不能修改类的实例的状态,会在函数中添加一个隐式的参数const this*。但当一个成员为static的时候,该函数是没有this指针的。也就是说此时static的用法和static是冲突的。
我们也可以这样理解:两者的语意是矛盾的。static的作用是表示该函数只作用在类型的静态变量上,与类的实例没有关系;而const的作用是确保函数不能修改类的实例的状态,与类型的静态变量没有关系。因此不能同时用它们。
题目(二):运行下面的代码,输出是什么?
class A
{
};
class B
{
public:
B {}
~B() {}
};
class C
{
public:
C() {}
virtual ~C() {}
};
int _tmain(int argc, _TCHAR* argv[])
{
printf(“%d, %d, %d ”, sizeof(A), sizeof(B), sizeof(C));
return 0;
}
分析:答案是1, 1, 4。class A是一个空类型,它的实例不包含任何信息,本来求sizeof应该是0。但当我们声明该类型的实例的时候,它必须在内存中占有一定的空间,否则无法使用这些实例。至于占用多少内存,由编译器决定。Visual Studio 中每个空类型的实例占用一个byte的空间。
class B在class A的基础上添加了构造函数和析构函数。由于构造函数和析构函数的调用与类型的实例无关(调用它们只需要知道函数地址即可),在它的实例中不需要增加任何信息。所以sizeof(B)和sizeof(A)一样,在Visual Studio 2008中都是1。
class C在class B的基础上把析构函数标注为虚拟函数。C++的编译器一旦发现一个类型中有虚拟函数,就会为该类型生成虚函数表,并在该类型的每一个实例中添加一个指向虚函数表的指针。在32位的机器上,一个指针占4个字节的空间,因此sizeof(C)是4。
题目(三):运行下面中的代码,得到的结果是什么?
class A
{
private:
int m_value;
public:
A(int value)
{
m_value = value;
}
void Print1()
{
printf(“hello world”);
}
void Print2()
{
printf(“%d”, m_value);
}
};
int _tmain(int argc, _TCHAR* argv[])
{
A* pA = NULL;
pA->Print1();
pA->Print2();
return 0;
}
分析:答案是Print1调用正常,打印出hello world,但运行至Print2时,程序崩溃。调用Print1时,并不需要pA的地址,因为Print1的函数地址是固定的。编译器会给Print1传入一个this指针,该指针为NULL,但在Print1中该this指针并没有用到。只要程序运行时没有访问不该访问的内存就不会出错,因此运行正常。在运行print2时,需要this指针才能得到m_value的值。由于此时this指针为NULL,因此程序崩溃了。
题目(四):运行下面中的代码,得到的结果是什么?
class A
{
private:
int m_value;
public:
A(int value)
{
m_value = value;
}
void Print1()
{
printf(“hello world”);
}
virtual void Print2()
{
printf(“hello world”);
}
};
int _tmain(int argc, _TCHAR* argv[])
{
A* pA = NULL;
pA->Print1();
pA->Print2();
return 0;
}
分析:答案是Print1调用正常,打印出hello world,但运行至Print2时,程序崩溃。Print1的调用情况和上面的题目一样,不在赘述。由于Print2是虚函数。C++调用虚函数的时候,要根据实例(即this指针指向的实例)中虚函数表指针得到虚函数表,再从虚函数表中找到函数的地址。由于这一步需要访问实例的地址(即this指针),而此时this指针为空指针,因此导致内存访问出错。
题目(五):静态成员函数能不能同时也是虚函数?
分析:答案是不能。调用静态成员函数不要实例。但调用虚函数需要从一个实例中指向虚函数表的指针以得到函数的地址,因此调用虚函数需要一个实例。两者相互矛盾。
题目(六):运行下列C++代码,输出什么?
struct Point3D
{
int x;
int y;
int z;
};
int _tmain(int argc, _TCHAR* argv[])
{
Point3D* pPoint = NULL;
int offset = (int)(&(pPoint)->z);
printf(“%d”, offset);
return 0;
}
答案:输出8。由于在pPoint->z的前面加上了取地址符号,运行到此时的时候,会在pPoint的指针地址上加z在类型Point3D中的偏移量8。由于pPoint的地址是0,因此最终offset的值是8。
&(pPoint->z)的语意是求pPoint中变量z的地址(pPoint的地址0加z的偏移量8),并不需要访问pPoint指向的内存。只要不访问非法的内存,程序就不会出错。
题目(七):运行下列C++代码,输出什么?
class A
{
public:
A()
{
Print();
}
virtual void Print()
{
printf(“A is constructed. ”);
}
};
class B: public A
{
public:
B()
{
Print();
}
virtual void Print()
{
printf(“B is constructed. ”);
}
};
int _tmain(int argc, _TCHAR* argv[])
{
A* pA = new B();
pA;
return 0;
}
答案:先后打印出两行:A is constructed. B is constructed. 调用B的构造函数时,先会调用B的基类及A的构造函数。然后在A的构造函数里调用Print。由于此时实例的类型B的部分还没有构造好,本质上它只是A的一个实例,他的虚函数表指针指向的是类型A的虚函数表。因此此时调用的Print是A::Print,而不是B::Print。接着调用类型B的构造函数,并调用Print。此时已经开始构造B,因此此时调用的Print是B::Print。
同样是调用虚拟函数Print,我们发现在类型A的构造函数中,调用的是A::Print,在B的构造函数中,调用的是B::Print。因此虚函数在构造函数中,已经失去了虚函数的动态绑定特性。
题目(八):运行下列C#代码,输出是什么?
namespace ChangesOnString
{
class Program
{
static void Main(string[] args)
{
String str = “hello”;
str.ToUpper();
str.Insert(0, “ WORLD”);
Console.WriteLine(str);
}
}
}
答案:输出是hello。由于在.NET中,String有一个非常特殊的性质:String的实例的状态不能被改变。如果String的成员函数会修改实例的状态,将会返回一个新的String实例。改动只会出现在返回值中,而不会修改原来的实例。所以本题中输出仍然是原来的字符串值hello。
如果试图改变String的内容,改变之后的值可以通过返回值拿到。用StringBuilder是更好的选择,特别是要连续多次修改的时候。如果用String连续多次修改,每一次修改都会产生一个临时对象,开销太大。
题目(九):在C++和C#中,struct和class有什么不同?
答案:在C++中,如果没有标明函数或者变量是的访问权限级别,在struct中,是public的;而在class中,是private的。
在C#中,如果没有标明函数或者变量的访问权限级别,struct和class中都是private的。struct和class的区别是:struct定义值类型,其实例在栈上分配内存;class定义引用类型,其实例在堆上分配内存。
题目(十):运行下图中的C#代码,输出是什么?
namespace StaticConstructor
{
class A
{
public A(string text)
{
Console.WriteLine(text);
}
}
class B
{
static A a1 = new A(“a1”);
A a2 = new A(“a2”);
static B()
{
a1 = new A(“a3”);
}
public B()
{
a2 = new A(“a4”);
}
}
class Program
{
static void Main(string[] args)
{
B b = new B();
}
}
}
答案:打印出四行,分别是a1、a3、a2、a4。
在调用类型B的代码之前先执行B的静态构造函数。静态函数先初始化类型的静态变量,再执行静态函数内的语句。因此先打印a1再打印a3。接下来执行B b = new B(),即调用B的普通构造函数。构造函数先初始化成员变量,在执行函数体内的语句,因此先后打印出a2、a4。
题目(11):运行下图中的C#代码,输出是什么?
namespace StringValueOrReference
{
class Program
{
internal static void ValueOrReference(Type type)
{
String result = “The type ” + type.Name;
if (type.IsValueType)
Console.WriteLine(result + “ is a value type.”);
else
Console.WriteLine(result + “ is a reference type.”);
}
internal static void ModifyString(String text)
{
text = “world”;
}
static void Main(string[] args)
{
String text = “hello”;
ValueOrReference(text.GetType());
ModifyString(text);
Console.WriteLine(text);
}
}
}
答案:输出两行。第一行是The type String is reference type. 第二行是hello。类型String的定义是public sealed class String {...},既然是class,那么String就是引用类型。
在方法ModifyString里,对text赋值一个新的字符串,此时改变的不是原来text的内容,而是把text指向一个新的字符串“world”。由于参数text没有加ref或者out,出了方法之后,text还是指向原来的字符串,因此输出仍然是“hello”.
题目(12):运行下图中的C++代码,输出是什么?
#include
class A
{
private:
int n1;
int n2;
public:
A(): n2(0), n1(n2 + 2)
{
}
void Print()
{
std::cout << “n1: ” << n1 << “, n2: ” << n2 << std::endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
A a;
a.Print();
return 0;
}
答案:输出n1是一个随机的数字,n2为0。在C++中,成员变量的初始化顺序与变量在类型中的申明顺序相同,而与它们在构造函数的初始化列表中的顺序无关。因此在这道题中,会首先初始化n1,而初始n1的参数n2还没有初始化,是一个随机值,因此n1就是一个随机值。初始化n2时,根据参数0对其初始化,故n2=0。
题目(13):编译运行下图中的C++代码,结果是什么?(A)编译错误;(B)编译成功,运行时程序崩溃;(C)编译运行正常,输出10。请选择正确答案并分析原因。
#include
class A
{
private:
int value;
public:
A(int n)
{
value = n;
}
A(A other)
{
value = other.value;
}
void Print()
{
std::cout << value << std::endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
A a = 10;
A b = a;
b.Print();
return 0;
}
答案:编译错误。在复制构造函数中传入的参数是A的一个实例。由于是传值,把形参拷贝到实参会调用复制构造函数。因此如果允许复制构造函数传值,那么会形成永无休止的递归并造成栈溢出。因此C++的标准不允许复制构造函数传值参数,而必须是传引用或者常量引用。在Visual Studio和GCC中,都将编译出错。
题目(14):运行下图中的C++代码,输出是什么?
int SizeOf(char pString[])
{
return sizeof(pString);
}
int _tmain(int argc, _TCHAR* argv[])
{
char* pString1 = “google”;
int size1 = sizeof(pString1);
int size2 = sizeof(*pString1);
char pString2[100] = “google”;
int size3 = sizeof(pString2);
int size4 = SizeOf(pString2);
printf(“%d, %d, %d, %d”, size1, size2, size3, size4);
return 0;
}
答案:4, 1, 100, 4。pString1是一个指针。在32位机器上,任意指针都占4个字节的空间。*pString1是字符串pString1的第一个字符。一个字符占一个字节。pString2是一个数组,sizeof(pString2)是求数组的大小。这个数组包含100个字符,因此大小是100个字节。而在函数SizeOf中,虽然传入的参数是一个字符数组,当数组作为函数的参数进行传递时,数组就自动退化为同类型的指针。因此size4也是一个指针的大小,为4.
题目(15):运行下图中代码,输出的结果是什么?这段代码有什么问题?
#include
class A
{
public:
A()
{
std::cout << “A is created.” << std::endl;
}
~A()
{
std::cout << “A is d.” << std::endl;
}
};
class B : public A
{
public:
B()
{
std::cout << “B is created.” << std::endl;
}
~B()
{
std::cout << “B is d.” << std::endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
A* pA = new B();
pA;
return 0;
}
答案:输出三行,分别是:A is created. B is created. A is d。用new创建B时,回调用B的构造函数。在调用B的构造函数的时候,会先调用A的构造函数。因此先输出A is created. B is created.
接下来运行语句时,会调用析构函数。由于pA被声明成类型A的指针,同时基类A的析构函数没有标上virtual,因此只有A的析构函数被调用到,而不会调用B的析构函数。
由于pA实际上是指向一个B的实例的指针,但在析构的时候只调用了基类A的析构函数,却没有调用B的析构函数。这就是一个问题。如果在类型B中创建了一些资源,比如文件句柄、内存等,在这种情况下都得不到释放,从而导致资源泄漏。
问题(16):运行如下的C++代码,输出是什么?
class A
{
public:
virtual void Fun(int number = 10)
{
std::cout << “A::Fun with number ” << number;
}
};
class B: public A
{
public:
virtual void Fun(int number = 20)
{
std::cout << “B::Fun with number ” << number;
}
};
int main()
{
B b;
A &a = b;
a.Fun();
}
答案:输出B::Fun with number 10。由于a是一个指向B实例的引用,因此在运行的时候会调用B::Fun。但缺省参数是在编译期决定的。在编译的时候,编译器只知道a是一个类型a的引用,具体指向什么类型在编译期是不能确定的,因此会按照A::Fun的声明把缺省参数number设为10。
这一题的关键在于理解确定缺省参数的值是在编译的时候,但确定引用、指针的虚函数调用哪个类型的函数是在运行的时候。
问题(17):运行如下的C代码,输出是什么?
char* GetString1()
{
char p[] = “Hello World”;
return p;
}
char* GetString2()
{
char *p = “Hello World”;
return p;
}
int _tmain(int argc, _TCHAR* argv[])
{
printf(“GetString1 returns: %s. ”, GetString1());
printf(“GetString2 returns: %s. ”, GetString2());
return 0;
}
答案:输出两行,第一行GetString1 returns: 后面跟的是一串随机的内容,而第二行GetString2 returns: Hello World. 两个函数的区别在于GetString1中是一个数组,而GetString2中是一个指针。
当运行到GetString1时,p是一个数组,会开辟一块内存,并拷贝“Hello World”初始化该数组。接着返回数组的首地址并退出该函数。由于p是GetString1内的一个局部变量,当运行到这个函数外面的时候,这个数组的内存会被释放掉。因此在_tmain函数里再去访问这个数组的内容时,结果是随机的。
当运行到GetString2时,p是一个指针,它指向的是字符串常量区的一个常量字符串。该常量字符串是一个全局的,并不会因为退出函数GetString2而被释放掉。因此在_tmain中仍然根据GetString2返回的地址得到字符串“Hello World”。
问题(18):运行下图中C#代码,输出的结果是什么?
namespace StaticVariableInAppDomain
{
[Serializable]
internal class A : MarshalByRefObject
{
public static int Number;
public void SetNumber(int value)
{
Number = value;
}
}
[Serializable]
internal class B
{
public static int Number;
public void SetNumber(int value)
{
Number = value;
}
}
class Program
{
static void Main(string[] args)
{
String assamblyName = Assembly.GetEntryAssembly().FullName;
AppDomain domain = AppDomain.CreateDomain(“NewDomain”);
A.Number = 10;
String nameOfA = typeof(A).FullName;
A a = domain.CreateInstanceAndUnwrap(assamblyName, nameOfA) as A;
a.SetNumber(20);
Console.WriteLine(“Number in class A is {0}”, A.Number);
B.Number = 10;
String nameOfB = typeof(B).FullName;
B b = domain.CreateInstanceAndUnwrap(assamblyName, nameOfB) as B;
b.SetNumber(20);
Console.WriteLine(“Number in class B is {0}”, B.Number);
}
}
}
答案:输出两行,第一行是Number in class A is 10,而第二行是Number in class B is 20。上述C#代码先创建一个命名为NewDomain的应用程序域,并在该域中利用反射机制创建类型A的一个实例和类型B的一个实例。我们注意到类型A是继承自MarshalByRefObject,而B不是。虽然这两个类型的结构一样,但由于基类不同而导致在跨越应用程序域的边界时表现出的行为将大不相同。
由于A继承MarshalByRefObject,那么a实际上只是在缺省的域中的一个代理,它指向位于NewDomain域中的A的一个实例。当a.SetNumber时,是在NewDomain域中调用该方法,它将修改NewDomain域中静态变量A.Number的值并设为20。由于静态变量在每个应用程序域中都有一份独立的拷贝,修改NewDomain域中的静态变量A.Number对缺省域中的静态变量A.NewDomain没有任何影响。由于Console.WriteLine是在缺省的应用程序域中输出A.Number,因此输出仍然是10。
B只从Object继承而来的类型,它的实例穿越应用程序域的边界时,将会完整地拷贝实例。在上述代码中,我们尽管试图在NewDomani域中生成B的实例,但会把实例b拷贝到缺省的域。此时,调用b.SetNumber也是在缺省的域上进行,它将修改缺省的域上的A.Number并设为20。因此这一次输出的是20。
问题(19):运行下图中C代码,输出的结果是什么?
int _tmain(int argc, _TCHAR* argv[])
{
char str1[] = “hello world”;
char str2[] = “hello world”;
char* str3 = “hello world”;
char* str4 = “hello world”;
if(str1 == str2)
printf(“str1 and str2 are same. ”);
else
printf(“str1 and str2 are not same. ”);
if(str3 == str4)
printf(“str3 and str4 are same. ”);
else
printf(“str3 and str4 are not same. ”);
return 0;
}
答案:输出两行。第一行是str1 and str2 are not same,第二行是str3 and str4 are same。
str1和str2是两个字符串数组。我们会为它们分配两个长度为12个字节的空间,并把“hello world”的内容分别拷贝到数组中去。这是两个初始地址不同的数组,因此比较str1和str2的值,会不相同。str3和str4是两个指针,我们无需为它们分配内存以存储字符串的内容,而只需要把它们指向“hello world“在内存中的地址就可以了。由于”hello world”是常量字符串,它在内存中只有一个拷贝,因此str3和str4指向的是同一个地址。因此比较str3和str4的值,会是相同的。
问题(20):运行下图中C#代码,输出的结果是什么?并请比较这两个类型各有什么特点,有哪些区别。
namespace Singleton
{
public sealed class Singleton1
{
private Singleton1()
{
Console.WriteLine(“Singleton1 constructed”);
}
public static void Print()
{
Console.WriteLine(“Singleton1 Print”);
}
private static Singleton1 instance = new Singleton1();
public static Singleton1 Instance
{
get
{
return instance;
}
}
}
public sealed class Singleton2
{
Singleton2()
{
Console.WriteLine(“Singleton2 constructed”);
}
public static void Print()
{
Console.WriteLine(“Singleton2 Print”);
}
public static Singleton2 Instance
{
get
{
return Nested.instance;
}
}
class Nested
{
static Nested() { }
internal static readonly Singleton2 instance = new Singleton2();
}
}
class Program
{
static void Main(string[] args)
{
Singleton1.Print();
Singleton2.Print();
}
}
}
答案: 输出三行:第一行“Singleton1 constructed”,第二行“Singleton1 Print”,第三行“Singleton2 Print”。
当我们调用Singleton1.Print时,.NET运行时会自动调用Singleton1的静态构造函数,并初始化它的静态变量。此时会创建一个Singleton1的实例,因此会调用它的构造函数。Singleton2的实例是在Nested的静态构造函数里初始化的。只有当类型Nested被使用时,才回触发.NET运行时调用它的静态构造函数。我们注意到我们只在Sington2.Instance里面用到了Nested。而在我们的代码中,只调用了Singleton2.Print。因此不会创建Singleton2的实例,也不会调用它的构造函数。
这两个类型其实都是单例模式(Singleton)的实现。第二个实现Singleton2只在真的需要时,才会创建实例,而第一个实现Singleton1则不然。第二个实现在空间效率上更好。
问题(21):C#是一门托管语言,那么是不是说明只要用C#,就能保证不会出现内存泄露和其他资源泄漏?如果不是,在哪些情况下可能会出现泄漏?
答案:C#不能保证没有资源泄漏。比如如下几种情况可能会造成资源泄漏:(1) 调用Native code,比如用P/Invoke或者调用COM;(2) 读写文件时的,没有及时close stream, 或者ADO.NET连数据库时,没有及时关闭连接,也算资源泄漏?(3)注册事件后没有remove,导致publisher和subscriber的强依 赖,垃圾回收可能会被推迟;(4).NET还定义了一些方法直接申请非托管内存,比如Marshal.AllocHGlobal和Marshal.AllocCoTaskMem。通过这种方式得到的内存,如果没有及时释放,也会造成内存泄露。
问题(22):下面的两段C#有哪些不同?
static void CatchException1()
{
try
{
Function();
}
catch
{
throw;
}
}
static void CatchException2()
{
try
{
Function();
}
catch (Exception e)
{
throw e;
}
}
答案:两个函数的catch都是重新抛出截获的exception,但抛出的exception的call stack是不一样的。对于第一种方法,exception的call stack是从最开始的抛出地点开始的。对于第二种方法,exception的call stack是从CatchException2开始的,最初抛出的地方相关的信息被隐藏了。
问题(23):运行下图中的C++代码,打印出的结果是什么?
bool Fun1(char* str)
{
printf(“%s ”, str);
return false;
}
bool Fun2(char* str)
{
printf(“%s ”, str);
return true;
}
int _tmain(int argc, _TCHAR* argv[])
{
bool res1, res2;
res1 = (Fun1(“a”) Fun2(“b”)) || (Fun1(“c”) || Fun2(“d”));
res2 = (Fun1(“a”) Fun2(“b”)) (Fun1(“c”) || Fun2(“d”));
return res1 || res2;
}
答案:打印出4行,分别是a、c、d、a。
在C/C++中,与、或运算是从左到右的顺序执行的。在计算rest1时,先计算Fun1(“a”) Func2(“b”)。首先Func1(“a”)打印出内容为a的一行。由于Fun1(“a”)返回的是false, 无论Func2(“b”)的返回值是true还是false,Fun1(“a”) Func2(“b”)的结果都是false。由于Func2(“b”)的结果无关重要,因此Func2(“b”)会略去而不做计算。接下来计算Fun1(“c”) || Func2(“d”),分别打印出内容c和d的两行。
在计算rest2时,首先Func1(“a”)打印出内容为a的一行。由于Func1(“a”)返回false,和前面一样的道理,Func2(“b”)会略去不做计算。由于Fun1(“a”) Func2(“b”)的结果是false,不管Fun1(“c”) Func2(“d”)的结果是什么,整个表达式得到的结果都是false,因此Fun1(“c”) Func2(“d”)都将被忽略。
问题(24):运行下面的C#代码,打印出来的结果是什么?
struct Person
{
public string Name;
public override string ToString()
{
return Name;
}
}
class Program
{
static void Main(string[] args)
{
ArrayList array = new ArrayList();
Person jim = new Person() {Name = “Jim”};
array.Add(jim);
Person first = (Person)array[0];
first.Name = “Peter”;
Console.WriteLine(array[0].ToString());
}
}
答案:Person的定义是一个struct,因此是一个值类型。在运行到语句Person first = (Person)array[0]的时候,first是array[0]的一个拷贝,first和array[0]不是一个实例。因此修改first对array[0]没有影响。
问题(25):运行下面的C++代码,打印的结果是什么?
class Base
{
public:
void print() { doPrint();}
private:
virtual void doPrint() {cout << “Base::doPrint” << endl;}
};
class Derived : public Base
{
private:
virtual void doPrint() {cout << “Derived::doPrint” << endl;}
};
int _tmain(int argc, _TCHAR* argv[])
{
Base b;
b.print();
Derived d;
d.print();
return 0;
}
答案:输出两行,分别是Base::doPrint和Derived::doPrint。在print中调用doPrint时,doPrint()的写法和this->doPrint()是等价的,因此将根据实际的类型调用对应的doPrint。所以结果是分别调用的是Base::doPrint和Derived::doPrint2。如果感兴趣,可以查看一下汇编代码,就能看出来调用doPrint是从虚函数表中得到函数地址的。
程序员面试题范文
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。


