﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-春暖花开-随笔分类-面试总结</title><link>http://www.cppblog.com/SpringSnow/category/10819.html</link><description>雪化了，花开了，春天来了</description><language>zh-cn</language><lastBuildDate>Sat, 02 Jan 2010 07:47:43 GMT</lastBuildDate><pubDate>Sat, 02 Jan 2010 07:47:43 GMT</pubDate><ttl>60</ttl><item><title>感谢所有帮助我的人</title><link>http://www.cppblog.com/SpringSnow/archive/2009/12/21/103651.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Mon, 21 Dec 2009 14:29:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/archive/2009/12/21/103651.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/103651.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/archive/2009/12/21/103651.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/103651.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/103651.html</trackback:ping><description><![CDATA[今天是一个非常开心的日子，我拿到了我梦寐以求的一家公司的offer，可以继续沿着梦想的道路继续前进，开心。 <br><br>首先感谢默默支持我的人，在这一路寻找的路上，有过很多挫折，谢谢他们给我的力量，让我越挫越勇。 <br><br>其次感谢一次次面试中给了我很多帮助的面试官，其实面试是一个互相学习的机会，而且每一次的肯定都是对能力的一种肯定，给了我很多信心。最后可能由于各种原因，与一些公司擦肩而过，也衷心祝愿这些公司的发展越来越好。 <br><br>最后感谢给了我很多建议的人，让我一路坚持梦想的走下来。 软件开发，是我热爱的一个方向，我也希望能够沿着这条路继续走下去。 <br><br><br><br><br><br><br>小小广告，如果你的网络很慢，不妨试试Opera的Turbo加速，不一般的体验啊！ 
<img src ="http://www.cppblog.com/SpringSnow/aggbug/103651.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/SpringSnow/" target="_blank">Sandy</a> 2009-12-21 22:29 <a href="http://www.cppblog.com/SpringSnow/archive/2009/12/21/103651.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转： 函数的线程安全和可重入</title><link>http://www.cppblog.com/SpringSnow/archive/2009/10/22/99202.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Thu, 22 Oct 2009 09:33:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/archive/2009/10/22/99202.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/99202.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/archive/2009/10/22/99202.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/99202.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/99202.html</trackback:ping><description><![CDATA[摘自：<br><a href="http://liuaigui.blog.sohu.com/86494742.html">http://liuaigui.blog.sohu.com/86494742.html</a><br><br>线程安全的(Thread-Safe)：如果一个函数在同一时刻可以被多个线程安全地调用，就称该函数是线程安全的。线程安全函数解决多个线程调用函数时访问共享资源的冲突问题。<br><br>可重入(Reentrant)：函数可以由多于一个线程并发使用，而不必担心数据错误。可重入函数可以在任意时刻被中断，稍后再继续运行，不会丢失数据。可重入性解决函数运行结果的确定性和可重复性。可重入函数编写规范为：<br>1、不在函数内部使用静态或全局数据 <br>2、不返回静态或全局数据，所有数据都由函数的调用者提供。 <br>3、使用本地数据，或者通过制作全局数据的本地拷贝来保护全局数据。<br>4、如果必须访问全局变量，利用互斥机制来保护全局变量。<br>5、不调用不可重入函数。<br><br>两者之间的关系：<br>1、一个函数对于多个线程是可重入的，则这个函数是线程安全的。<br>2、一个函数是线程安全的，但并不一定是可重入的。<br>3、可重入性要强于线程安全性。<br><br>比如：strtok函数是既不可重入的，也不是线程安全的。加锁的strtok不是可重入的，但线程安全。而strtok_r既是可重入的，也是线程安全的<br><br>之所以会去查这个问题，是在考试中遇到过考strtok这个问题是否可用于多线程。自己从使用的角度上感觉不安全，但是究其原因却不是很明白。查了一下，居然涉及到函数的线程安全。<br><br>在另一篇博文中，是这样解释的：<br>strtok不是一个线程安全的函数。因为根据其定义，它必须使用内部静态变量来记录字符串中下一个需要解析的标记的当前位置。但是，由于指示这个位置的变量只有一个，那么，在同一个程序中出现多个解析不同字符串的strtok调用时，各自的字符串的解析就会互相干扰。（摘自： <a href="http://hi.baidu.com/pigfanfan/blog/item/72816c958d63e743d1135ebf.html">http://hi.baidu.com/pigfanfan/blog/item/72816c958d63e743d1135ebf.html</a>）<br><br>怎么避免呢？<br>我们可以利用另一个函数：strtok_r，这个是一个线程安全的函数——strtok_r，以此来代替strtok。<br>
<img src ="http://www.cppblog.com/SpringSnow/aggbug/99202.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/SpringSnow/" target="_blank">Sandy</a> 2009-10-22 17:33 <a href="http://www.cppblog.com/SpringSnow/archive/2009/10/22/99202.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>“1”的个数</title><link>http://www.cppblog.com/SpringSnow/archive/2009/07/28/91495.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Tue, 28 Jul 2009 07:56:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/archive/2009/07/28/91495.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/91495.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/archive/2009/07/28/91495.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/91495.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/91495.html</trackback:ping><description><![CDATA[这也是《程序员面试攻略》上的一道题，题目是这样的：<br>请编写一个函数，确定一个整数的计算机内部表示中有几个&#8220;1&#8221;。<br><br>思索了一下这个题目，我是这样考虑的，也学书上给出伪代码<br>count = 0;<br>while (这个整数不为0)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果这个整数对2求余的结果是1，则count加1；<br>&nbsp;&nbsp;&nbsp;&nbsp; 将这个整数向右移移位<br>}<br><br>代码写出来是这样的：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;numOnesInBinary(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;num)<br><img id=Codehighlighter1_29_135_Open_Image onclick="this.style.display='none'; Codehighlighter1_29_135_Open_Text.style.display='none'; Codehighlighter1_29_135_Closed_Image.style.display='inline'; Codehighlighter1_29_135_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_29_135_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_29_135_Closed_Text.style.display='none'; Codehighlighter1_29_135_Open_Image.style.display='inline'; Codehighlighter1_29_135_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_29_135_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_29_135_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;count&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(num&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_66_117_Open_Image onclick="this.style.display='none'; Codehighlighter1_66_117_Open_Text.style.display='none'; Codehighlighter1_66_117_Closed_Image.style.display='inline'; Codehighlighter1_66_117_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_66_117_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_66_117_Closed_Text.style.display='none'; Codehighlighter1_66_117_Open_Image.style.display='inline'; Codehighlighter1_66_117_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_66_117_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_66_117_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(num&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;num</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;count;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<br>看了一下书中的答案，的确比我简练很多。对于求余这个方法还是比较笨的。书中采用了逻辑与。<br><br>判断条件从&#8220;num%2 == 1&#8221;变成 &#8220;num&amp;1 == 1&#8221;，从程序中更倾向与后者。<br>所以在分析问题的时候，要学会用逻辑&#8220;与、或、异或&#8221;进行判断。<br><br>到这一步，看似已经很完美了。但是书中又出奇的给了另一种解法。这种想法我真的没有想到。<br><br>想法的出发点是考虑一个数字减1时，它的二进制发生了什么变化。减1得到的结果是，从最低位的1到最低位都发生了翻转，其他高位保持不变。如果您对这个整数和减一后的结果进行AND操作，得到的新的数字与原来的整数相比，只有最后一个1变成0.<br><br>如果进行多次这样的操作，这个整数的值变为0。这样我们也就获得了这个数的计算机表示中&#8220;1&#8221;的个数。<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;numOnesInBinary2(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;num)<br><img id=Codehighlighter1_30_120_Open_Image onclick="this.style.display='none'; Codehighlighter1_30_120_Open_Text.style.display='none'; Codehighlighter1_30_120_Closed_Image.style.display='inline'; Codehighlighter1_30_120_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_30_120_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_30_120_Closed_Text.style.display='none'; Codehighlighter1_30_120_Open_Image.style.display='inline'; Codehighlighter1_30_120_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_30_120_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_30_120_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;count&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(num&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_66_103_Open_Image onclick="this.style.display='none'; Codehighlighter1_66_103_Open_Text.style.display='none'; Codehighlighter1_66_103_Closed_Image.style.display='inline'; Codehighlighter1_66_103_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_66_103_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_66_103_Closed_Text.style.display='none'; Codehighlighter1_66_103_Open_Image.style.display='inline'; Codehighlighter1_66_103_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_66_103_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_66_103_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;num&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;(num</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;count;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<p><br>第一方法的时间复杂度为o(n)，第二种的时间复杂度为o(m)，m为1的个数。<br><br>后记：<br>最近一周多，一直在做这本书上的编程题。一天3道，自己先尝试编写，运行成功后再与书上的解答进行对比。稍有几次略感比书上稍好些。但大多数情况还是效率差一些。想想原因，还是练得比较少。所以继续努力。多多积累，养成良好的思维习惯。</p>
<img src ="http://www.cppblog.com/SpringSnow/aggbug/91495.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/SpringSnow/" target="_blank">Sandy</a> 2009-07-28 15:56 <a href="http://www.cppblog.com/SpringSnow/archive/2009/07/28/91495.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>二面总结</title><link>http://www.cppblog.com/SpringSnow/archive/2009/06/12/87482.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Fri, 12 Jun 2009 06:07:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/archive/2009/06/12/87482.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/87482.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/archive/2009/06/12/87482.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/87482.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/87482.html</trackback:ping><description><![CDATA[<p>昨天很意外,收到了二面的通知.原本以为没戏了,因为方向不是很对.<br><br>今天很兴奋的去,为了一套衣服花了很多money,结果太正式了,自己都不敢穿着出去了.一身休闲的衣服去了.还是这么舒服哈.<br><br>很温柔的声音,那个mm很温柔,到了才发现原来这么温柔的mm竟然是leader,我原先把她当作hr了.<br><br>两个人,一个leader,一个leader的leader,两个人都很nice. 没想到这的人都这么好.越来越喜欢这了.<br><br>我进会议室后,问了一些我网上查到的关于这个部门的信息,以及产品,从这个话题延伸出来对部门的介绍.<br>哇,跟我的方向很相近.让我心里顿时燃起了无线的憧憬.<br><br>下面主要是对我所做项目的询问,各种问题,都是有关项目的.这个状态持续了一个多小时.<br>从问题中也发现了很多问题,原来自己了解的那么少.<br><br>由于将近中午了,我们就很愉快的结束了面试.给了我无线的希望哈.<br><br>继续加油啊,我好想去啊! <br><br>总结一下:<br><br>在面试的时候,总是会涉及进程及线程之间的通信,如何同步.两回问题不是很一样.但是比较相近.<br>自己这方面答的不是很好.需要好好总结一下.</p>
<img src ="http://www.cppblog.com/SpringSnow/aggbug/87482.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/SpringSnow/" target="_blank">Sandy</a> 2009-06-12 14:07 <a href="http://www.cppblog.com/SpringSnow/archive/2009/06/12/87482.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struct 与class的区别</title><link>http://www.cppblog.com/SpringSnow/archive/2009/06/08/87064.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Mon, 08 Jun 2009 05:43:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/archive/2009/06/08/87064.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/87064.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/archive/2009/06/08/87064.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/87064.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/87064.html</trackback:ping><description><![CDATA[<p>这是我在面试中的问到的第一个问题。<br><br>有什么重要区别呢？<br>我当时是这样答的：在struct中，方法和变量默认为public，而在class中，方法和变量默认为private。其他的什么区别，都想不起来了。<br><br>在《深度探索C++模型》中，作者也谈及struct与class之间的区别，似乎也没有怎么说两个之间有什么区别。我这人健忘，也只记住了这一点区别。<br><br>在网上查了一下，有一篇文章很是不错，也作为我这里的解释吧。<br><br>摘自：<a href="http://www.diybl.com/course/3_program/c++/cppsl/2008222/100455.html">http://www.diybl.com/course/3_program/c++/cppsl/2008222/100455.html</a><br><br>从语法上，在C++中（只讨论C++中）。class和struct做类型定义时只有两点区别：<br>（一）默认继承权限。如果不明确指定，来自class的继承按照private继承处理，来自struct的继承按照public继承处理；<br>（二）成员的默认访问权限。class的成员默认是private权限，struct默认是public权限。<br>除了这两点，class和struct基本就是一个东西。语法上没有任何其它区别。</p>
<p>不能因为学过C就总觉得连C++中struct和class都区别很大，下面列举的说明可能比较无聊，因为struct和class本来就是基本一样的东西，无需多说。但这些说明可能有助于澄清一些常见的关于struct和class的错误认识：<br>（1）都可以有成员函数；包括各类构造函数，析构函数，重载的运算符，友元类，友元结构，友元函数，虚函数，纯虚函数，静态函数；<br>（2）都可以有一大堆public/private/protected修饰符在里边；<br>（3）虽然这种风格不再被提倡，但语法上二者都可以使用大括号的方式初始化：A a = {1, 2, 3};不管A是个struct还是个class，前提是这个类/结构足够简单，比如所有的成员都是public的，所有的成员都是简单类型，没有显式声明的构造函数。<br>（4）都可以进行复杂的继承甚至多重继承，一个struct可以继承自一个class，反之亦可；一个struct可以同时继承5个class和5个struct，虽然这样做不太好。<br>（5）如果说class的设计需要注意OO的原则和风格，那么没任何理由说设计struct就不需要注意。<br>（6）再次说明，以上所有说法都是指在C++语言中，至于在C里的情况，C里是根本没有&#8220;class&#8221;，而C的struct从根本上也只是个包装数据的语法机制。<br>---------------------------------------------------------------</p>
<p>最后，作为语言的两个关键字，除去定义类型时有上述区别之外，另外还有一点点：&#8220;class&#8221;这个关键字还用于定义模板参数，就像&#8220;typename&#8221;。但关键字&#8220;struct&#8221;不用于定义模板参数。<br><br>注意class的data member在内存中的布局可不一定是data member的申明次序。C++只保证处于同一个access section的data member按照申明次序排列。<br><br><br><font color=#002c99>知识分享，共同进步。</font><br></p>
<img src ="http://www.cppblog.com/SpringSnow/aggbug/87064.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/SpringSnow/" target="_blank">Sandy</a> 2009-06-08 13:43 <a href="http://www.cppblog.com/SpringSnow/archive/2009/06/08/87064.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>记实习</title><link>http://www.cppblog.com/SpringSnow/archive/2009/06/08/87062.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Mon, 08 Jun 2009 05:26:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/archive/2009/06/08/87062.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/87062.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/archive/2009/06/08/87062.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/87062.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/87062.html</trackback:ping><description><![CDATA[<p>经济危机了，所以还没有开始找工作，实习大战已经开幕了。<br><br>我也投了几家自己非常心仪的公司，掂量掂量自己的水平吧。不过，这一掂量的确不怎么样。唯有继续好好学习。<br><br>我投了四家，两家参加机试，不过看来都算挂了吧，题目不是很难，但是有的不是遗忘，就是反应有些慢。还有一家是直接拒绝了我。最后一家参加了笔试，也有幸进入了一面。<br><br>面试中先是做了一个自我介绍，英文的。这个我准备了，不过要说5分钟。<br><br>下面是询问我做过的项目。面试官很nice，尽管他不是很懂我做的项目，还是一个一个的项目问，而且很耐心，不错的面试官。<br><br>问完项目后，问了一些问题，有C++的，有数据库的（这个只有一道，多年没有摸过，忘得一干二净，没答上来），有linux(如何查看进程，我还是不会)。<br><br>那就只有C++，我还可以答上一二。<br><br>发现平常有时候，你知道的一些知识，有的觉得是这样的，但当你去表达的时候，却理不出来头绪。此时的我就是这样。看来基本功不是很扎实。<br><br>那个职位自己的把握也不是很大，中间有些东西自己说的不好，跟职位的匹配性也不是很好。<br><br>不过通过这次面试历练，我觉得应该在一下几方面注意一下：<br>1、对知识的掌握上，一定要很清楚，不能只知道皮毛性的东西。<br>2、在于对方的交谈上，一定不要快速的回答问题，要给自己留一个思维缓冲的阶段。能够把答案稍作调理。<br>3、不要过多谈一些想法，要有自己的想法。<br><br>被问到职业发展方向，这个真的不知道怎么回答，回来想想，还是很困惑，不过这倒给我提了一个醒，要好好规划自己的人生，不能糊里糊涂的走下去。<br><br>我将来做什么呢？当程序员，或许可以出几本书，总结一下自己的程序员经验。这是我现在想到的。<br>至于方向么？数据库，windows mobile，这个我真的还不是很清楚。<br><br>如果你对我有建议的话，那我先谢谢你了。</p>
<img src ="http://www.cppblog.com/SpringSnow/aggbug/87062.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/SpringSnow/" target="_blank">Sandy</a> 2009-06-08 13:26 <a href="http://www.cppblog.com/SpringSnow/archive/2009/06/08/87062.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>