周's profile宇宙的空间PhotosBlogListsMore Tools Help

Blog


    9/15/2009

    什么是管理培训生

    什么是管理培训生

    http://blog.sina.com.cn/s/blog_4ccd98380100ay38.html~type=v5_one&label=rela_prevarticle


    管理培训生(Management Trainee)是一个外来术语,是外企里面“以培养公司未来领导者”为主要目标的特殊项目。譬如,四大外资银行的校园招聘都是分三条管道的:intern, staff 和 MT。

    1.MT一般是有期限的。譬如,恒生MT是4年,渣打MT是2年,汇丰MT是1年。

    2. 期间MT们将在各部门快速轮岗,大量参加课堂学习,全面的掌握公司和行业知识。譬如,渣打MT据说2年内要考14门,然后轮岗三个部门的各种职位。

    3. “毕业”后,MT将被安排到相对高级的领导岗位,一般是部门或者团队主管。日后的晋升速度也相对的快,因此MT有“直升飞机”的美誉。

    4. MT的薪酬增长速度也相当快。因为公司花了2-4年时间培养一个MT,它最怕的就是跳槽。而事实上,MT们都是猎头公司的重点进攻对象。一旦被挖,薪酬通 常都会double甚至triple。之前看一师兄的博客,某外资银行MT,“毕业”后月薪20K,被挖一次40K,两年后又跳槽,60k,此时他还未到 30岁.........

    5. 管理比较好的央企,最近也开始搞MT项目,用的是台湾的叫法“储备干部”。

       

        咨询公司麦肯锡此前发布的一项报告被大量引用,这份报告预测了未来10~15年,能在国际市场上有效开展工作的中层管理人才的缺口,数字是7.5万名,而目前符合要求的此类人才仅有3000~5000人。而翰威特早前发布的一项调查表明,超过80%的在华外资企业都承受着人才短缺的压力,其中最为短缺的就是中高层管理者。

       

        行业内流动、猎头公司挖角,这样的做法似乎不再那么有效,其在短期内能够或多或少缓解管理者短缺的问题,而从长期来看却不是最佳解决方案。不少公司开始尝试内部培养的做法,而“管理培训生”作为一种管理人才速成的培养方式,获得跨国公司的青睐。

    名企管理培训生的待遇

    名企管理培训生的待遇(2008-09-26 23:16:32)

    http://blog.sina.com.cn/s/blog_4ccd98380100ay3p.html

    标签:杂谈  分类:职场规划与感想

        管理培训生的待遇按照行业和学历有不同的分类

     

    一、快消类:

        1、宝洁:本7200、研8200、博9700,均14个月,另有800交通补助,marketing每9个月涨20%-30%。

        2、玛氏:月薪10000。据说将14个月的工资除以12得出的数据

        3、箭牌:sales:4400×15。

     

    二、金融类:

        1、汇丰银行:Global markets中国大陆地区外汇trader,月薪8000。

        2、花旗银行MT:8000×13。

        3、中金IBD:本科:111000base,sign on bonus 9250×6。

                    研究生:19万base,sign on bonus 19250×10。

        4、巴克莱:香港sales:40万港币。

        5、瑞银证券(UBSS):operation部门15万、投行部门27万,奖金要看项目。

        6、荷兰国际ING:有一个base在香港的培训项目,是local pay+global relocation p

    ackage的形式,总额比一般投行都高(约70-80w),以前只招MBA,今年扩大到普研,值

    得争取。现在有越来越多的公司有这样的项目,大家要多留心想在国内读MBA的,以后可

    以瞄准这的项目。

        7、中信银行总行:平均起薪5-6万,本科和研究生差别不大。

        8、农行总行软开:转正后6500/月,房补1500左右,一年16个月。

        9、嘉实基金:固定收益部研究生:基本工资11.2万,基本奖金4.8万。绩效奖金和福利不祥。

        10、华安基金:研究生,助理行业分析员,基本工资12万,不过是按照8万基本工资发,另外4万按照福利名义发给刚入职的毕业生,奖金和其他待遇不详。

        11、KKR和Blackstone:起薪40万USD,但都是要在投行里做过一段时间的。

        12、南方基金:第一年年新大约16万,而且经常会发一两万元的沃尔马购物卡。以后涨幅也挺大的。行业研究员更高,在21万。

        13、深国投:待遇比南方基金的待遇还要好,确切数字不清楚,至少20万年薪吧。 明年开始深国投采取提成的制度,估计年薪会创新高

        14、Discover Finacial Sevice:上海,Base 15w/y,福利奖金不清楚,前MorganStanly的子公司,Discover信用卡,2008第一年在中国招人

     

    三、IT类:

    1、IBM China:

        销售 (ISU,STG,SWG) 培训期6-9个月 本科4800,研究生6000,14个月转正后第一年 base 7500,14个月,100%完成任务发140%工资,200%完成任务大概拿340%的工资,

        补助:ibm为每个员工设立一个帐户,每个月往这个账户上存员工工资的15%,工作满三年后,员工才可以 取这个账户的钱.三年后如果员工继续留IBM,公司会继续向帐户存15%的工资,总额满10w为止,ibm最多为每个员工存10w,这样算下来,新员工3 年能拿4-5w大概。

        IBM CDL CRL前半年试用期待遇是band6,而且可以休病假、年假和探亲假

                   CDL=(7500+800)*12 + 7500*2.5

                   CRL=(7500+800+900)*12 + 7500*2.5

                   住房公积金的标准是750 + 750 /m

        2、摩根斯坦利IT:18万base,奖金看表现。

        3、穆迪KMV:计算机硕士:2500刀/月+绩效奖+年终奖,14个月。在深圳14万。岗位不同薪酬不同。

        4、Microsoft:base 16.1w,什么都加起来也就19w左右,股票不是每年都给。

        5、腾讯:一般职位本科生起薪7万,研究生起薪10万。广告销售部按业绩提成,有人一单就提成50w。

           腾讯的研发不太透明,北大清华计算机牛人可以和hr谈工资,有专门的hr面。研发也分部门,一个是传统的腾讯北京研发部,另一个是新搞的腾讯研究院。前者 大部分都是10w起,少数一两个特别厉害的,hr单独谈,可以谈到20w...腾讯研究院16万起,可以谈,有把工资谈到20万的。     

        6、Google:软件工程师计算机硕士18万。

        7、百度:应届计算机硕士:baidu se今年有好几等,17.8w,19.2,20.6w以及超牛的接近30w,都是package。有道也有分别:web dev 15w多一点,普通dev 16w,这都是工资不算奖金。    

        8、EMC:所有(奖金+福利)都加起来15.5w

     

    四、咨询类:

        1、麦肯锡: 16万base,3000美元  signing bonus

        2、BCG: 前三年的base分别 16、25、47万(据说),bonus不清楚

        3、Bain: 肯定比以上两个都高。

        4、罗兰贝格:15万base+3万bonus。

        5、IBM咨询 (GBS):base 6000-6800不等,在外地作项目每天200-250补助,14个月,补助同上。其他IT咨询原五大分出来的如毕博、埃森哲、凯捷均可参考IBM的GBS薪水,IBM的GBS部门是原普华永道咨询部门和IBM自身的咨询部门合并而成。

        6、AC尼尔森:MT 5500。

        7、世联地产:本硕博一样,2500-5500,转正后有差别。

     

    五、能源类:

        1、斯伦贝谢:FE下面的部门里面:钻井部门(DM)的工资属于中等

              国内员工:14万base,上井每天100美元补助。

              国际员工(IM):Global pay,培训期间工资4.8K美元×系数×12,一般越危险的地方系数越高,从1.0-1.7不等,12个月工资。培训期间无补助,完成培训后上井补助每天100美元。都有奖金,工作越久奖金越多。Wireline部门工资比DM高。

        2、Shell:7500,本研博一样。12个月工资,超过12个月的属于bonus,Sales部门完成销量有3个月bonus,销量多则bonus多;其他部门有1-5个月bonus不等。

        3、法国液化空气:扬帆国际管培项目offer(签三年)的待遇

                  国内半年 7.8k/m

                  国外1年半 global pay + relocation expense

                  国内1年 12万+4万

        4、GE Energy:普通职位:硕士5k-6k×13;CLP(Commercial Leadership Program):6

    000*13,两年4个rotation,2个在美国,所有费用公司cover。

     

    六、四大会计师事务所:

        本5500、研5800,均13个月,有CPA证书普华德勤加500每月,安永毕马威加1000 ,审计部每年涨30%-50%。

     

    七、其他:

        1、华为:华为本科4500,每月1000补助,研究生再多1000,年底3-8个月的奖金。一般来说第一年只能拿到3个月工资的奖金。外派海外补助很多。

        2、国际纸业:sales本4000、研6000。

        3、新蛋:本10000、研11000,均13个月。

    堆和栈的区别

    [url]http://blog.sina.com.cn/s/blog_5821e00e010006qy.html[/url]

    一、预备知识—程序的内存分配
    一个由c/C++编译的程序占用的内存分为以下几个部分
    1、栈区(stack)— 由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
    2、堆区(heap) — 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
    3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放
    4、文字常量区 —常量字符串就是放在这里的。程序结束后由系统释放
    5、程序代码区—存放函数体的二进制代码。

    二、例子程序
    这是一个前辈写的,非常详细
    //main.cpp
    int a = 0; 全局初始化区
    char *p1; 全局未初始化区
    main()
    {
    int b; 栈
    char s[] = "abc"; 栈
    char *p2; 栈
    char *p3 = "123456"; 123456\0在常量区,p3在栈上。
    static int c =0; 全局(静态)初始化区
    p1 = (char *)malloc(10);
    p2 = (char *)malloc(20);
    分配得来得10和20字节的区域就在堆区。
    strcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
    }
    二、堆和栈的理论知识
    2.1申请方式
    stack:
    由系统自动分配。 例如,声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间
    heap:
    需要程序员自己申请,并指明大小,在c中malloc函数
    如p1 = (char *)malloc(10);
    在C++中用new运算符
    如p2 = (char *)malloc(10);
    但是注意p1、p2本身是在栈中的。
    2.2
    申请后系统的响应
    栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。
    堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,
    会 遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内 存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大 小,系统会自动的将多余的那部分重新放入空闲链表中。
    2.3申请大小的限制
    栈:在Windows下,栈是向低地址扩展的数据结构,是一块 连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在 WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因 此,能从栈获得的空间较小。
    堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。
    2.4申请效率的比较:
    栈由系统自动分配,速度较快。但程序员是无法控制的。
    堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便.
    另外,在WINDOWS下,最好的方式是用VirtualAlloc分配内存,他不是在堆,也不是在栈是直接在进程的地址空间中保留一快内存,虽然用起来最不方便。但是速度快,也最灵活
    2.5堆和栈中的存储内容
    栈:在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。
    当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。
    堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。
    2.6存取效率的比较

    char s1[] = "aaaaaaaaaaaaaaa";
    char *s2 = "bbbbbbbbbbbbbbbbb";
    aaaaaaaaaaa是在运行时刻赋值的;
    而bbbbbbbbbbb是在编译时就确定的;
    但是,在以后的存取中,在栈上的数组比指针所指向的字符串(例如堆)快。
    比如:
    #include
    void main()
    {
    char a = 1;
    char c[] = "1234567890";
    char *p ="1234567890";
    a = c[1];
    a = p[1];
    return;
    }
    对应的汇编代码
    10: a = c[1];
    00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh]
    0040106A 88 4D FC mov byte ptr [ebp-4],cl
    11: a = p[1];
    0040106D 8B 55 EC mov edx,dword ptr [ebp-14h]
    00401070 8A 42 01 mov al,byte ptr [edx+1]
    00401073 88 45 FC mov byte ptr [ebp-4],al
    第一种在读取时直接就把字符串中的元素读到寄存器cl中,而第二种则要先把指针值读到edx中,在根据edx读取字符,显然慢了。
    ?

    2.7小结:
    堆和栈的区别可以用如下的比喻来看出:
    使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。
    使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。

    堆和栈的区别主要分:
    操作系统方面的堆和栈,如上面说的那些,不多说了。
    还有就是数据结构方面的堆和栈,这些都是不同的概念。这里的堆实际上指的就是(满足堆性质的)优先队列的一种数据结构,第1个元素有最高的优先权;栈实际上就是满足先进后出的性质的数学或数据结构。
    虽然堆栈,堆栈的说法是连起来叫,但是他们还是有很大区别的,连着叫只是由于历史的原因。

    9/14/2009

    (ZZ)Autodesk面试技术题解答

    By SmartPtr(http://www.cppblog.com/SmartPtr/)
          
        近一年以来,AUTODESK的面试题在网上是闹的沸沸扬扬,作为一个名企,这是可以理解的,况且其面试题质量也是不错的。抽一些闲暇时间,把网上传的比 较多的70道题简单的解答了一遍,不为别的,只为再熟悉一下在大学学过的一些基础知识。希望对大家有用。当然,这只是我的个人解答,有什么不对的或者需要 补充的,大家尽管提上来,好的话我加上去的。。。

         

    1. 在类的普通成员函数中调用虚函数,情况是怎么样的?(对象、引用、指针)

    多态, 事实上,这是 Template Method模式的关键
    2.
    关于成员变量初始化顺序,几个有依赖关系的成员变量要初始化,让写出构造函数。

    在初始化列表中,成员变量的初始化顺序是其在类中声明顺序,而非列表中的顺序。

    3. 写一个双链表。

    Struct ListNode

    {

        int nData;

        ListNode* pPreviousNode;

        ListNode* pNextNode;

    }

    一般链表都会有一个表头节点与指向表头节点的头指针, 应该会提供列表接口, 按此数据结构实现即可。

    4. 写个is-ahas-a

    这个比较简单

    Class Pet{};

    Class Dog: public Pet{};

    Class Boy{Pet* m_pPet;};

    5. struct vs. class.

    1)默认访问属性, structpublic, classprivate

    2)class可以用来声明模板参数,而struct不能

    6. 8个小球的问题

    没题

    7. stl 里面vector的实现(内部空间的申请与分配)

    Vector中文名字是动态数组, 其内部数据结构就是一个数组, 但是在数组元素不够用的时候,就要动态的重新分配, 一般是现在大小的两倍, 然后把原数组的内容拷贝过去。所以, 在一般情况下, 其访问速度同一般数组, 只有在重新分配发生时, 其性能才会下降

    8. struct /class的区别

    重复了

    9. 为什么要用struct

    成员的默认属性不同,用struct的话,主要是作为数据的集合。

    10. 怎样使一个class不能被实例化

    1,构造函数私有化,2,抽象类

    11. 私有继承和public继承的区别。

    私有继承: 只继承实现,不继承实现 has-a

    公有继承:继承接口与实现    is-a

    12. void *p的问题

    不能++

    13. 引用和指针的区别与联系。引用是否可以更改

    联系: 支持多态,可以用来引用同一对象

    区别:指针可以为NULL 引用不可以; 指针可以重赋值, 引用不可以;

    14. windows编程基础,线程与进程的区别

    程序是一系列静态的指令序列

    进程是程序的一次动态执行,进程其实是一个资源的容器,包括一个私有的虚拟地址空间,一些初始的代码与数据, 一些系统资源的句柄等

    线程是一个进程中的执行体, 一般包括CPU寄存器状态,两个栈(内核模式,用户模式)以及一个TLS(Thread-Local Storage)

    15. com+是否熟悉

    COM+COM技术的延伸与发展, 它包括了所有COM的基本功能(基于接口的编程模型,基本组件服务),并组合了DCOM(使组件技术延伸到了分布式领域)和MTS-Microsoft Transaction Server(提供了服务器端的组件管理与配置管理),并新增了一些服务:负载平衡,内存数据库,事件模型,队列服务等,主要用于Windows DNA(Distributed interNet Application Architecture)三层结构的中间层。

    16. 简述一下hash算法

    哈希表的目的是表查询插入修改能够达到O(1)的算法复杂度, 通过对key编码来确定其存储地址来实现, 当不同的key得到相同的编码时,便需要进行冲突检测与处理,一般方法有除留余数法, 线性探测法,平方探测法, 这使其无法真正达到O(1)

    17. 一个32位的数据,怎样找到最左边的一个1

    如果是在最左位,这个数是负数,否则的话,左移一位,看是否变成负数,这是O(n)的算法 也可以用一个模板去与,并不断改变这个模板

    O(n/2)的算法:二分方式查找 ???

    18. 一个4*4的格子,填入1~15 然后给个目标状态,怎样去搜索。

    题意不懂

    19. 给你100万个数据,数据的值在0~65535之间 用最快的速度排序

    多关键字基数排序MSD(MOST SIGNIFICANT DIGIT FIRST)

    20. 如果我们的一个软件产品,用户回复说:运行速度很慢,你怎么处理?

    询问其Workflow, 用户的硬件环境

    21. 八皇后问题,详述解法 八皇后问题说的是在8*8国际象棋棋盘上,要求在每一行放置一个皇后,且能做到在竖方向,斜方向都没有冲突

    回溯法

    22. kmp快速匹配算法 ---不算轻松的搞定

    普通的模式匹配算法,一旦不匹配,模式串右移一位;但是其实根据一直条件,我们可以算出应该向右移几位以避免不必要的比较;算法实现比较曲折

    23. 无向图中两点间最短路问题 ---伟大的迪杰克斯拉算法

    假设一共有N个节点, 需要一个一维数组Previous[N]来记录前一个节点序号;一个一维数组TotalLength[N]来记录从原点到当前节点最短路径;一个二维数组Weights[N][N]来记录各点之间边的权重(如果存在) 然后从源点到终点进行深度搜索或广度搜索, 按以下规则:搜索到某个节点b时,假设其前一个节点为a, TotalLength[a] + Weights[a][b]TotalLength[b]相比较,如果小于TotalLength[b] TotalLength[b] = TotalLength[a] + Weights[a][b], Previous[b] = a; 反之则不做任何操作。这样到搜索结束后, Previous[N]数组中就能得到整条最短路径了

    24. 空间中任意给两个向量,求角平分线

    先单位化, 假设单位化后结果为nv1, nv2, 则角平分线为(nv1+nv2) / 2

    25. 什么是平衡树

    左右子树都是平衡树,且高度相差不超过1的有序二叉树

    26. 哈夫曼编码问题

    理论基础:霍夫曼树是带权路径长度(WPLWeighted Path Length)最小的二叉树,它不一定是完全二叉树,应该是权值大的外结点离根节点最近的扩充二叉树。霍夫曼编码是为了实现数据的最小冗余编码,是数据压缩学的基础。 它根据字符在电文中出现的频率为权值,构造霍夫曼树,左为0 右为1. 其有两个效果,一是保证电文有最短的编码,二是字符间不需要分隔符,因为不同的字符必定有不同的开头(成为前缀编码)。

    27. 有向图求环

    以该节点为源点与终点吗进行深度优先或广度优先搜索

    28. .n个点,求凸包问题

    凸包(convex hull)是指一个最小凸多边形,满足这N个点都在多边形上,或其内。算法描述:

    求出最右的那个点作为凸多边形的一个顶点(P0),遍历其他所有点(Pi) 如果其他点都在向量P0Pi的同一侧,则Pi也为凸多边形的顶点。

    29. 四则运算(给一个前缀表达式(波兰式)或后缀表达式(逆波兰式),然后求解;给一个中缀表达式)

    +*-CDBA -/EF---------------------> A+B*(C-D)-E/F       前缀-中缀

    操作符进栈,一个变量tmp放上一个中间操作数(运算结果),遇到操作数检查tmp是否为空, 空的话取两个操作数,不空的话取一个操作数,另一个就是tmp了,操作符出栈运算,结果放入tmp中,如果是操作符,tmp清空

     ABCD-*+EF/- ---------------------> A+B*(C-D)-E/F     后缀-中缀

    操作数进栈,遇到操作符,两个操作数出栈,计算结果入栈

    30. STLcontainer有哪些?

    序列容器: vector, list, deque, bitset

    关联容器:     set, multiset, map, multimap

    适配容器:stack, queue, priority_queue

    类容器:         string, valarray, bitset

    扩展容器:hash_set, hash_multiset, hash_map, hash_multimap

    31. map中的数据存储方式是什么?

    红黑树, 是一种平衡二叉搜索树, 具有良好的最坏情况运行时间(统计性能好与AVL树)

    32. maphashmap有什么区别?

    内部数据结构不同, map是红黑树,hashmap是哈希表

    33. hashmap是标准库中的吗?

    不是的,但在SGI stlvc2005中都提供了。

    34. vector中的erase方法跟algorithmremove有什么区别?

    vectorerase是真正删除了元素, 迭代器访问不到了。 algorithm中的remove只是简单的把要remove的元素移到了容器最后面,迭代器还是可以访问到的。因为algorithm通过迭代器操作,不知道容器的内部结构,所以无法做到真正删除。

    35. object是什么?

    具有内部状态,以及操作的 软件构造,用来表示真实存在(物理上或概念上)的对象

    36. C++中如何阻止一个类被实例化?

    纯虚函数;构造函数私有化(友元)

    37. 一般在什么时候构造函数被声明成private呢?

     singleton模式; 阻止某些操作(如阻止拷贝构造

    38. 什么时候编译器会生成默认的copy constructor呢?

    用户没有自定义copy constructor;在代码中使用到了copy constructor;

    39. 如果你已经写了一个构造函数,编译器还会生成copy constructor吗?

    如果我写的是copy constructor, 不会

    如果我写的不是copy constructor, 38

    40. 为什么说如果一个类作为基类,则它的析构函数要声明成virtual的?

    因为,如果delete一个基类的指针时, 如果它指向的是一个子类的对象,那么析构函数不为虚就会导致无法调用子类析构函数,从而导致资源泄露。 当然,另一种做法是将基类析构函数设为protected.

    41. inline的函数和#define有什么区别?什么时候会真的被inline,什么时候不会呢?

    1) 宏是在预编译阶段简单文本替代, inline在编译阶段实现展开

    2)宏肯定会被替代,而复杂的inline函数不会被展开

    3)宏容易出错(运算顺序),且难以被调试,inline不会

    4)宏不是类型安全,而inline是类型安全的,会提供参数与返回值的类型检查

    当出现以下情况时inline失败

    函数size太大

    inline虚函数

    函数中存在循环或递归

    函数调用其他inline函数

    42. 如果把一个类的成员函数写在类的声明中是什么意思?

    inline此函数 inlinetemplate类似, 必须在.h中实现)

    43. public继承和private继承有什么架构上的区别?

    publicis-a的关系,继承接口与实现

    privatehas-a的关系 ,只继承实现

    44. 在多继承的时候,如果一个类继承同时继承自class Aclass B,而class AB中都有一个函数叫foo(),如何明确的在子类中指出override哪个父类的foo()

    首先,fooA,B总应该都是虚函数,否则就直接覆盖了,就没有这个问题了;其次,这个问题从语法角度来看似乎是无法解决。因为我们不能改原有设计(不然也没这个问题了:),所有只好从extend来考虑:

    class EA: public class A

    {

    public:

       virtual void foo(){fooA();}

    private:

       virtual void fooA() = 0;

    }

    class EB: public class B

    {

    public:

       virtual void foo(){fooB();}

    private:

       virtual void fooB() = 0;

    }

    这样, 我就可以override不同的函数来达到这个目的了

    class AB: public EA, pubic EB

    {

    private:

    virtual void fooA(){}

    virtual void fooB(){}

    }

    45. 虚拟继承的语法是什么?

        A

     /     \

    B      C

       \ /

        D

    class A{};

    class B: virtual public A{};

    class C: virtual public A{};

    class D: public B, public C{};

    46. 部分模版特例化和全部模版特例化有什么区别?

    偏特化只使用于类模板,而全特化适用与函数模板,类模板。

    偏特化的结果还是一个模板,而全特化的结果是一个具体的类型。

    47. 编一个函数,使一个单项链表转置。

    应该是逆序吧

    这个小算法竟然花了我不少时间,没有测试过的:

    struct ListNode
    {
        
    int data;
        ListNode
    * next;
    };

    void ReverseList(ListNode* p)
    {
        ListNode
    * p0 = NULL;
        ListNode
    * p1 = p->next;
        ListNode
    * p2 = p1 ? p1->next : NULL;

        
    // 三个指针,分别表示当前处理节点,前一节点与后一节点
        
    // 复用头节点的next来保存节点
        while (NULL != p2)
        {
            p
    ->next = p2->next; //暂存

            p1
    ->next = p0;      //逆转
            p2->next = p1;

            p0 
    = p1;            //往下一个节点
            p1 = p2;
            p2 
    = p->next;
        }
        p
    ->next = p1;    //p1末元素变为首元素,链到头节点上
    }

    48. 拆解一个整数,比如4,可以拆解成4=3+14=2+24=2+1+14=1+1+1+1

    首先,对一个数进行拆分后,可能又要对最后一个因子进行拆分,所以要用递归;其次,第n+1个因子是小于等于第n个因子的;再者,对最后一个因子,我可以直接输出,也可以继续拆分。

    算法如下:

    N久的。。。。

    void print(int res[], int num)
    {
        
    for (int i = 0; i < num; ++i)
        {
            printf(
    "%d ", res[i]);
        }
        printf(
    "\n");
    }
    // n表示总数,m表示最大因子
    void split(int n, int m)
    {
        
    static int res[100]; //保存结果
        static int num = -1//当前因子下标
        num++;
        
    //递归终止条件,为0不可再分,直接输出
        if(0 == n) 
        {
            print(res, num
    +1);
            num
    --;
            
    return;
        }
        
    else
        {
            
    if(n == m) 
            {
                
    // 不拆,直接输出
                res[num] = m;
                print(res,num
    +1);
                num
    --;
            }
            
    else
            {
                
    // 拆分出第一个
                res[num] = m;
                n 
    = n-m;
                
    //最大因子不可能大于总数
                if(m>n) m = n;

                
    // 循环,第二个因子可以继续拆分,而且按照最大因子不同可以拆分成多个
                for (int i = m; i>=1--i)
                {
                    split(n, i);
                }
                num
    --;
            }    
        }
    }

    void Split(int n)
    {
        
    for (int i = n-1; i>=1; i--)
        {
            split(n, i);
        }
    }


    唉,老了,这个小东西搞了我

    49. 不用库函数,实现strcpy或者memcpy等函数

    一个字节一个字节的拷过去吧,但是要考虑源内存与目标内存的重叠。

    50. 内联函数的作用和缺点

    把代码直接插入到调用的地方,可以减少函数调用的次数,但是会增加代码的size,还有,如果内联失败,在每个调用的obj里,都会产生一份该函数的拷贝,这样既没有怎么减少代码的size,又没有减少函数的调用,赔了夫人又折兵。。。

    51. 指针和引用的区别

    指针可以不初始化,引用必须初始化

    指针可以是NULL,而引用必须引用一个实在的对象

    指针可以重指向其他对象,引用一旦初始化,便不再改变

    52. 友元的意义

    使被声明为友元的函数或类可以访问某个类的非共有成员

    53. 虚函数的意义

    实现多态

    54. Overload, Overwrite, Override 各自的特点和意义

    Overload: 函数重载(名字相同,参数不同)

    Overwrite:覆盖

    Override: 虚函数重载

    55. 头文件中的ifndef/define/endif 干什么用?

    防止该头文件被重复引用

    56. i nclude <filename.h> 和#i nclude “filename.h” 有什么区别?

    i nclude <filename.h> 从标准库路径去寻找该文件,对于VC来说,应该还包括VC环境设置选项中的包含目录以及工程属性中指定的目录

    i nclude “filename.h”:先在当前目录查找,如果找不到,按上面那种方式寻找

    57. C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”

    C++语言支持函数重载,C 语言不支持函数重载。函数被C++编译后在库中的名字与C 语言的不同。C++提供了C 连接交换指定符号extern“C”来解决名字匹配问题

    58. 一个类有基类、内部有一个其他类的成员对象,构造函数的执行顺序是怎样的?

    先执行基类的(如果基类当中有虚基类,要先执行虚基类的,其他基类则按照声明派生类时的顺序依次执行),再执行成员对象的,最后执行自己的。

    59. 请描述一个你熟悉的设计模式

    这个看你熟悉什么了。singleton最简单了,template method用的最多了,bridge挺炫的,command吹吹undo,redo也不错。。。。。

    60. UML 中,聚合(aggregation)和组合(composition)有什么区别?

    其实从名字就能分别出来了。

    聚合表示只是简单的聚聚,没什么本质的联系,所以这些对象的生存时间也就没什么关系了;

    组合表示了更加紧密的一种关系,这些对象有着共同的生存期。

    一个典型的例子是孙悟空,手臂,金箍棒的关系。。。。

    61. C#C++除了语法上的差别以外,有什么不同的地方?

    C++是直接生成可执行代码,而C#是先生成中间代码,等到第一次执行时,才由JITJust In Time)生成可执行的机器码。

    还有就是(1) c#有垃圾自动回收机制,程序员不用担心对象的回收。(2)c#严禁使用指针,只能处理对象。如果希望使用指针,则仅可在unsafe 程序块中能使用指针。(3)c#只能单继承。(4)必须通过类名访问静态成员。不能像C++中那样,通过对象访问静态成员。(5)在子类中重写父类的虚函数时必须用关键字override,覆盖父类的方法要用关键字new

    62. New deletemalloc free 的区别

    对于类,New delete会调用构造,析构函数

    newdelete都是能感知到类型的。new返回一个制定的类型,delete删除一个指定的类型,从而不用给定size。而mallocfree都是处理void类型的。用时时必须经过强制类型转换。

    63. #define DOUBLE(x) x+xi = 5*DOUBLE(10)i是多少?正确的声明是什么?

    I = 5*10+10 = 60 60

    正确的声明是:

    #define DOUBLE(x) (x+x)

    64. 有哪几种情况只能用intialization list 而不能用assignment?

    当类中含有constreference 成员变量;基类的构造函数都需要参数;类中含有其他类的成员对象,而该类的构造函数都需要参数。

    65. C++是不是类型安全的?

    不是。两个不同类型的指针之间可以强制转换。C#是类型安全的。

    66. main 函数执行以前,还会执行什么代码?

    全局对象的构造函数会在main 函数之前执行。

    67. 描述内存分配方式以及它们的区别。

    1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static 变量。

    2 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集。用的是cache,速度较快但容量较小。

    3 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc new 申请任意多少的内存,程序员自己负责在何时用free delete 释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。

    68. 比较一下C++static_cast dynamic_cast 的区别。

    Static_cast可以显式的做一些自动转换,如一些int, char一些基础类型的转换,以及指针之间的转换。但是其不保证安全性。Dynamic_cast主要作用其实在于把一个基类指针转化为子类指针,因为这个基类指针真正指向的不一定是我们想转换的类型的对象,所以转换可能失败,dynamic_cast能够知道失败而返回NULL,而static_cast就没那么聪明了,原因是dynamic_cast会利用rtti去查找该转换是否可行.(耗费时间多点。)

    69. 当一个类A 中没有生命任何成员变量与成员函数,这时sizeof(A)的值是多少,如果不是零,请解释一下编译器为什么没有让它为零。

    不为零,不同的对象应该有不同的地址,假设我声明一个A的数组A a[2],如果为零,那么a[0]a[1]的地址岂不相同了

    70. 已知两个链表head1 head2各自有序,请把它们合并成一个链表依然有序,要求用递归方法进行。

    归并排序,应该比较简单。要注意的是如果一个链表为空,那么可以简单的把另一个直接链过去了。


    注:有一部分题的答案是在网上看到的题中就包含了的。