C++面经 100题(1-20)

这里面的知识对不对还有待考证

  1. 判断一段程序是什么编译器编译?
    • 看有没有对应的预定义宏
    1
    2
    3
    4
    5
    #ifdef __cplusplus
    cout << "c++";
    #else
    cout << "c";
    #endif
  2. c++中的传值方式有几种?
    • 值传递、指针传递、引用传递
  3. 虚函数c++
    1. 多态:重写父类同名函数,让程序根据实际情况运行不同函数
    2. 纯虚函数:主要用于定义抽象类
    3. 提示可能在子类中被重写,还有就是动态绑定
  4. c和c++有什么不同?
    1. 语法

    2. 高级特性

    3. 场景

    4. 效率

      1
      2
      3
      机制上:c面向过程;c++面向对象
      适用方向:c适合代码体积小,效率高的场合,如嵌入式;c++适合更上层
      名称上可看出c++是c的超集
  5. c和c++中struct区别?
    protection行为 能否定义函数
    c 否,但可以有函数指针
    c++ 有,默认private 可以
  6. c++中struct和class区别?
    • 默认继承权限。如不明确指定,class的继承按照private处理,struct继承按照public处理
    • 成员默认访问权限。class成员默认是private权限,struct默认是public权限
  7. int id[sizeof(unsigned long)];对吗?why?
    • 正确,这个sizeof是编译时运算符,编译时就确定了,可以看成和机器相关的常量
  8. new in c++ is a ()
    • library function like malloc in c [X]
    • operator [√]
    • key word [√]
      • malloc是库函数,不在编译器控制范围内,调用时从堆中申请内存
      • new是运算符,在编译器控制范围之内,调用时从对申请内存并为内存调用构造函数
  9. 变量的指针含义是指变量的
    • 地址
      • 但是地址值是变量的字节编号,可是指针只是变量字节编号的一部分(多字节变量,指针只是一个字节的编号,即首地址)
  10. 多态的作用?
    • 隐藏实现细节。使代码能够模块化,扩展代码,实现代码重用
    • 接口重用。为了类在继承和派生时,保证正确调用家族中任一类的实例的某属性
  11. 多态类中的虚函数表时Compile-Time,还是Run-Time时建立的?
    * 虚拟函数表时在编译期就建立的,各个虚拟函数这是被组织成了一个虚拟函数的入口地址的数组。而对象的隐藏成员虚拟函数表指针是在运行期,也就是构造函数被调用时进行初始化的,这是实现多态的关键。
  12. 面向对象三个基本特征?
    * 封装:将客观事物抽象成类,每个类对自身的数据和方法实行protection(private, protected, public)
    * 继承:(1、2为类继承,3为对象组合=>接口继承以及纯虚函数)
      * 实现继承:使用基类的属性和方法而无需额外编码能力
      * 可视继承:子窗体使用父窗体的外观和实现代码
      * 接口继承:仅使用属性和方法,实现之后到子类实现
    * 多态:是将父对象设置成为一or多个与他子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说:允许将子类类型的指针赋值给父类类型的指针
  13. 内联函数在编译时是否做参数检查?
    * 做,这是相对与宏的优势
  14. 内存的分配方式?
    * 静态存储区域分配,编译时已经分配好,程序整个运行期间,如全局变量
    * 栈分配。执行函数时,函数内局部变量的存储单元都可以在栈上创建,自动释放。分配运算内置于处理器指令集中,效率很高但容量有限
    * 堆分配。动态内存分配,malloc&new申请任意多少内存,需及时free&delete
  15. 频繁使用短小函数在c和c++中用什么实现?
    * c用宏定义,c++用inline
  16. 全局变量和局部变量有什么区别?是怎么实现的?操作系统怎么知道的?
    * 生命周期不同:全局变量随主程序创建&销毁;局部变量在局部函数或循环体内部,退出即消失;
    * 使用方式不同:全局变量声明后各个部分都可使用,局部变量只能在局部使用;
    * 实现:全局变量在全局数据区,局部变量在栈区
    * 操作系统通过内存分配位置知道是何变量。
  17. 静态全局变量作用域?
    - 本文件
  18. 有了malloc/free为何还要new/delete?
    * malloc/free是c/c++标准库函数,new/delete是c++关键字(or运算符)
    * 对于非内部数据类型的对象,需要执行构造析构函数,而malloc/free不是运算符,不在编译器的控制范围内,所以有new来完成动态内存分配,delete来清理何释放内存
  19. c++是不是类型安全?
    * 不是,两个不同类型指针之间可以强制转换(用reinterpret_cast)
    * 类型安全:不同数据类型的数据不能随意地转换来操作。
  20. 用c++写程序,判断os是16位还是32位?
    * 定义一个指针p,打印sizeof(p),如果结果是4(32),结果为2(16)
    
    * 不大行的法二
    
    
    1
    2
    3
    4
    5
    6
    int a = ~0;
    if(a > 65536) {
    cout << "32 bit" << endl;
    } else {
    cout << "16 bit" << endl;
    }