• C++经典面试题(二)


    近期看一些面试题,认为假设自己被问到了,并不能非常利落的回答出来。

    一是从来没有这个意识,二是没有认真的梳理下。

    以下对这些题做出分析,哈!个人能力有限,当中难免有疏漏,欢迎大家补充咯。


    11.引用与指针有什么差别?
    【參考答案】  
    1) 引用必须被初始化,指针不必。


    2) 引用初始化以后不能被改变,指针能够改变所指的对象。
    3) 不存在指向空值的引用。可是存在指向空值的指针。


    能够參考下 在 5 题中补充的内容




    12.C++中virtual与inline的含义各自是什么?
    【參考答案】
    在基类成员函数的声明前加上virtualkeyword,意味着将该成员函数声明为虚函数。
    inline与函数的定义体放在一起,使该函数称为内联。
    inline是一种用于实现的keyword,而不是用于声明的keyword。 
    虚函数的特点。假设希望派生类可以又一次定义基类的方法。则在基类中将该方法定义为虚方法。这样可以启用动态联编。 
    内联函数的特点。使用内联函数的目的是为了提高函数的执行效率。内联函数体的代码不能过长,由于内联函数省去调用函数的时间是以代码膨胀为代价的。内联函数不能包括循环语句。由于执行循环语句要比调用函数的开销大。


    哈。我想我确实要注意一下表达能力。。






    13.
    VC中。编译工具条内的Debug与Release选项是什么含义?
    【參考答案】
    Debug 通常称为调试版本号,它包括调试信息。而且不作不论什么优化。便于程序猿调试程序。
    Release 称为公布版本号。它往往是进行了各种优化,使得程序在代码大小和执行速度上都是最优的。以便用户非常好地使用。


    Debug带有大量的调试代码。执行时须要对应的执行库,
    公布模式程序紧凑不含有调试代码和信息,直接能够执行(假设不须要执行库)




    14.函数assert的使用方法?
    【參考答案】断言assert是仅在debug版本号起作用的宏,用于检查“不应该“发生的情况。程序猿能够把assert看成一个在不论什么系统状态下都能够安全使用的无害測试手段


    学VC++的时候见过assert宏定义。可是自己从来没用过。。。




    15.const  与 #define 的比較 。const有什么长处?
    【參考答案】
    (1) const 常量有数据类型,而宏常量没有数据类型。

    编译器能够对前者进行类型安全检查。而对后者仅仅进行字符替换,没有类型安全检查,而且在字符替换可能会产生意料不到的错误(边际效应) 。 
    #define不能生成 类的专属常量,由于它仅仅是进行简单的替换。。
    (2)  有些集成化的调试工具能够对 const 常量进行调试,可是不能对宏常量进行调试。


    《Effective C++》中建议以const、enum、inline取代#define。


    使用enum的原因
    有些情况下,编译器不同意静态常量出如今类的初始设定中,仅仅得以enum的形式
    还有一方面,enum和#define更相似,它们都没有详细的类型,比方,有const int a; 却没有 #define N int a,enum和#define都不可以被去地址,而const可以。




    16.请你谈谈引用和指针的差别。


    【參考答案】
    (1)引用被创建的同一时候必须被初始化(指针则能够在不论什么时候被初始化) 。 
    (2)不能有 NULL 引用,引用必须与合法的存储单元关联(指针则能够是 NULL) 。 
    (3)一旦引用被初始化,就不能改变引用的关系(指针则能够随时改变所指的对象) 。


    不断地出现。可见这个问题是常常easy被问到的。




    17.
    有了 malloc/free 为什么还要 new/delete  ?
    【參考答案】
    malloc 与 free 是 C++/C 语言的标准库函数。new/delete 是 C++的运算符。

    它们都可用于申请动态内存和释放内存。
     对于非内部数据类型的对象而言,光用 malloc/free 无法满足动态对象的要求。
    对象在创建的同一时候要自己主动运行构造函数,对象在消亡之前要自己主动运行析构函数。
    因为malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不可以把运行构造函数和析构函数的任务强加于 malloc/free。 
    因此 C++语言须要一个能完毕动态内存分配和初始化工作的运算符 new,以及一个能完毕清理与释放内存工作的运算符 delete。注意 new/delete 不是库函数。


    曾经仅仅是习惯在用C时用malloc/free,用C++时用new/delete。没注意到这些差异性。




    18.假设在申请动态内存时找不到足够大的内存块,malloc 和 new 将返回 NULL 指针,宣告内存申请失败。

    你是怎么处理内存耗尽的?
    【參考答案】
    (1)推断指针是否为 NULL。假设是则立即用 return 语句终止本函数。


    (2)推断指针是否为 NULL,假设是则立即用 exit(1)终止整个程序的执行 
    (3)为 new 和 malloc 设置异常处理函数。

    比如 Visual C++能够用_set_new_hander 函数为 new 设置用户自定义的异常处理函数,也能够让 malloc 享用与 new 同样的异常处理函数。


    我通常是直接return 了




    19.C++是不是类型安全的?
    【參考答案】不是。

    两个不同类型的指针之间能够强制转换(用reinterpret cast)。






    20. const 符号常量;
    (1)const char *p
    (2)char const *p (
    3)char * const p
    说明上面三种描写叙述的差别。
    【參考答案】
    (1)p是一个指向const char的指针,p是能够改变指向的。可是p指向的值是不能改变的;        
    (2)p指向的恰好是一个指向const的char的普通指针。
    (3)p是一个指针,这个指针是指向char的const指针。

           
    (1)和(2)的定义是一样的。


    1、2和3的差别在于。1和2的const出如今*号左边,3出如今*号右边。好像也是在《C和指针》上看到的这句话。



    未完。。

    。待续(*^_v_^*)



  • 相关阅读:
    nodejs修改jade为html的方法(ejs is not defined解决)
    http协议简单解析
    有序序列ol li 详解(ol li 标号未显示?)
    html5新标签及废弃元素
    HTML <!DOCTYPE> 声明详解
    ACM组队安排---递推
    使用CORDIC算法求解角度正余弦及Verilog实现
    Xilinx FPGA的专用时钟引脚及时钟资源相关
    【转】上拉下拉电阻、I/O输出(开漏、推挽等)
    Testbench文件编写纪要(Verilog)
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5054373.html
Copyright © 2020-2023  润新知