C++面经 100题(21-40)

  1. 为什么需要使用堆,使用堆空间的原因?
    • 直到运行时候对象才知道要多大内存,不知道对象生存期多长
  2. 数组名作实参而指针变量作形参,函数调用实参传给形参的是?
    • 数组第一个元素的地址
  3. 为什么数组名作为参数会改变数组内容,而其它类型如int却不会改变变量的值?
    • 因为数组名传递的是指针变量,而如int是传入的一份拷贝数据
  4. 析构函数何虚函数的用法和作用?
    • 析构函数:特殊的类成员函数,没有返回类型、参数,不能随意调用,也没有重载,只有在类对象的生命周期结束时,由系统自动调用,释放内存空间。

    • 虚函数:c++多态的一种表现,使用虚函数,,我们能灵活进行动态绑定,花费一定开销

    • 析构函数也可能时虚函数吗?

      • 可能,虚析构函数在如下情况也存在
      1
      2
      3
      4
      5
      6
      7
      class A {}; // A为父类
      class B : A {}; // B为子类

      A &a = new B(); // reference class B object
      delete a; // virtual destructor

      // 这里调用A的析构函数,但是A是B类的引用变量,所以B还有额外的空间没有被销毁,所以继承时,把父类析构函数定义成虚的,防止父类引用关联了子类对象。
  5. '\091' '\\' '\0' '\'' 错误的转义字符为?
    • '\091'
    • 使用转义的原因:c语言中键盘中没有办法输入但是又存在这个字符
    • % '' "",也可以是三个8进制数(0~7) \023,也可以时两个16进制数(0~f) \af
  6. 如果ClassA定义并实现虚函数int func(void)ClassB中也实现该函数,那么上述变量a->func()将调用哪个类里面的函数?如果int func(void)不是虚函数,情况又如何?why?
    • 第一问调用B的
    • 第二问调用A的
    • 虚函数的典型应用,虚函数只能借助于指针or引用来达到多态的效果
  7. 引用和指针有什么区别?
    • 引用必须被初始化
    • 引用初始化以后不能被改变,指针可以改变所指对象
    • 不存在指向空值的引用,存在指向空值的指针
  8. 如果不使用常量,直接在程序中填写数字或字符串将会有什么麻烦?
    • 可读性变差
    • 多处输入相同,易错
    • 如果要修改则会在很多地方改动,麻烦又易错
  9. c++有没有纯虚构造函数?
    • 构造函数不能为虚函数,构造函数为显式调用
  10. 重复多次fclose一个打开过一次的FILE *fp指针会有什么结果?
    • 导致文件描述符结构中指针指向的内存被重复释放,进而导致一些不可预期的异常。
  11. 重载(overload)、重写(override 也叫“覆盖”)、重定义(redefinition)的区别?
    • 重载:同一个类中
    • 重写:继承链中,子类去重新实现父类的同名函数,不能变换函数名、形参类型、个数,返回值无所谓
    • 重定义:第二种情况中,父类如果不是虚函数,则为子类完全重新实现父类函数
  12. c++里面是不是所有动作都是main()引起的?如果不是,请举例
    • 不一定
    1
    2
    3
    4
    5
    class A{};
    A a; // a的构造函数执行
    int main(){}

    // 比如上面全局变量的初始化,就不是由main函数引起的
  13. main函数执行前还会执行什么代码?
    • 全局对象的构造函数会在main函数之前执行
  14. c++中virtualinline含义分别是什么?
    • virtual(强制)主要用于声明虚函数,抽象类、纯虚函数、多态
    • inline声明内联函数
  15. const关键字有哪些作用?
    • 总的说:只读,不能改
    • 欲阻止一个变量被改变
    • 对指针,可以指定指针本身or指针所指数据为const
    • 修饰形参,表明函数内部不能修改
    • 修饰类成员函数,有时候必须指定其返回值为const类型,使得其返回值不为”左值”
  16. 编译中Debug与Release选项是什么含义?
    • Debug模式下会有额外信息,同时不做任何优化,主要用于调试/编辑测试阶段
    • Release模式下会把运行不相关的信息删掉,速度、文件大小都会有相应优化,用于发布阶段
  17. 是不是一个父类写了一个virtual函数,如果子类覆盖它的函数不加virtual,也能实现多态?
    • virtual修饰符会被隐形继承的,virtual可加可不加。子类空间里有父类所有变量(除了static)。
    • 同一个函数只存在一个实体(inline除外),子类覆盖它的函数不加virtual也能实现多态
    • 在子类空间中,有父类的私有变量,私有变量不能直接访问
  18. 下面代码,变量val内存地址位于?
    1
    2
    3
    4
    void func() {
    static int val;
    ...
    }
    • 已初始化数据段
  19. 在不用第三方参数情况下,交换两个参数的值
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // methed 1
    a = a + b;
    b = a - b;
    a = a - b;

    // method 2
    a = a ^ b
    b = a ^ b
    a = a ^ b
  20. 如何打印出当前源文件文件名以及源文件的当前行号?
    1
    2
    3
    cout << __FILE__;
    cout << __LINE__;
    // 两个系统预定义宏,是由编译器定义

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!