美文网首页
2.C++面试问题汇总

2.C++面试问题汇总

作者: guanghaolv | 来源:发表于2020-08-06 00:06 被阅读0次

    最近准备秋招,需要好好复习C++语言了,准备看着别人面经里的问题复习,索性就记录下来,一是加深印象,另一个也可以供所有人参考。

    1.指针和引用的区别

    1.内存
    • 指针占用内存空间;引用只是一个别名,不占内存空间;
    2.初始化
    • 指针可以不初始化;引用必须初始化,不初始化会报错;
    3.指向
    • 指针的指向可以变化,指向不同的对象;引用的指向不可以变化,从一而终;
    4.++操作
    • 指针的++操作为地址的增加(增加指向类型的字节数);引用的++为指向变量的++操作;
    5.sizeof()
    • 指针的sizeof()为指针变量(一个地址)的大小;引用的sizeof()为指向变量的大小;
    6.层级
    • 指针有多级指针;引用只有1级

    2.堆和栈的区别

    1.管理方式
    • 堆是程序员管理(new/delete,malloc/free);栈是编译器管理;
    2.空间大小
    • 堆是一段不连续的内存空间(链表),大小受可用的虚拟内存影响,空间较大;栈是一段连续的空间大小,大小一般固定(1/2M),空间较小;
    3.分配方式
    • 堆是动态分配,需手动释放;栈有静态分配和动态分配两种,静态分配(如临时变量,函数参数等)由编译器完成,动态分配(如alloca)由编译器自动释放;
    4.分配效率
    • 堆的分配由库函数实现,机制复杂,因此效率较低;栈的分配在计算机底层提供支持,分配专门的寄存器存放栈地址,效率较高;
    5.生长方向
    • 堆向上增长,地址越来越大;栈向下增长,地址越来越小;
    6.内存碎片
    • 堆频繁的申请和释放内存会造成大量的内存碎片;栈是先进后出,不会造成内存碎片。

    3.new和delete是如何实现的,new 与 malloc的异同处

    1.new的实现

    string* p=new string("hello");
    

    new的实现

    //1.分配内存
    void* mem=operate new( sizeof(string) );
    //2.转型
    p=static_cast<string*>(mem);
    //3.构造函数
    p->string::string("hello");
    

    2.delete的实现

    delete p;
    

    delete的实现

    //1.析构函数
    p->string::~string();
    //2.释放内存
    operate delete(p);
    

    3.new 与 malloc的异同处

    1.属性
    • new/delete是C++关键字,需要编译器支持。malloc/free是库函数,需要头文件支持c。
    2.参数
    • 使用new操作符申请内存分配时无须指定内存块的大小,编译器会根据类型信息自行计算。而malloc则需要显式地指出所需内存的尺寸。
    3.返回类型
    • new操作符内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无须进行类型转换,故new是符合类型安全性的操作符。而malloc内存分配成功则是返回void * ,需要通过强制类型转换将void*指针转换成我们需要的类型。
    4.分配失败
    • new内存分配失败时,会抛出bac_alloc异常。malloc分配内存失败时返回NULL。
    5.自定义类型
    • new会先调用operator new函数,申请足够的内存(通常底层使用malloc实现)。然后调用类型的构造函数,初始化成员变量,最后返回自定义类型指针。delete先调用析构函数,然后调用operator delete函数释放内存(通常底层使用free实现)。
    • malloc/free是库函数,只能动态的申请和释放内存,无法强制要求其做自定义类型对象构造和析构工作。
    6.重载
    • C++允许重载new/delete操作符,特别的,布局new的就不需要为对象分配内存,而是指定了一个地址作为内存起始区域,new在这段内存上为对象调用构造函数完成初始化工作,并返回此地址。而malloc不允许重载。
    7.内存区域
    • new操作符从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。而堆是操作系统中的术语,是操作系统所维护的一块特殊内存,用于程序的内存动态分配,C语言使用malloc从堆上分配内存,使用free释放已分配的对应内存。自由存储区不等于堆,比如对new进行重载,分配的内存为已有的栈上的内存,那new就可以不位于堆中,它在栈上。自由存储区是个抽象的概念,它可能在堆,也可能在栈。new的内存=自由存储区。

    4.C和C++的区别

    感觉这个没有一个标准的答案,感觉区别很大很多,又很细,所以此除只罗列几个吧

    1.面向过程OR面向对象
    • C语言为面向过程编程语言;C+为面向对象编程语言;
    2.关键字不同
    • C语言有32个关键字;C++98有63个关键字;
    3.函数重载
    • C语言没有函数重载;C++支持函数重载。

    5.C++、Java的联系与区别,包括语言特性、垃圾回收、应用场景等(java的垃圾回收机制)

    联系:两者均为面向对象编程语言,都具有面向对象的特性,但是C++是对C的扩充,多少影响了面向对象,而Java比较彻底。
    区别:

    1.指针
    • C++具有指针,可以使用指针访问内存;Java中无法使用指针直接访问内存,增加了自动的内存管理功能,有效地防止了指针操作失误,如野指针;
    2.多重继承
    • C++具有多重继承;Java不具有多重继承,但是可以继承多个接口,实现了多重继承的功能;
    3.数据类型及类
    • C++中允许将函数和变量定义为类外;Java为完全面向对象的语言,所有函数和变量都是类或者类的一部分;
    4.自动内存管理
    • C++中使用new动态管理内存时需要手动释放内存;Java自动进行内存回收操作,不需程序员操作;
    5.操作符重载
    • C++支持操作符重载;Java不支持操作符重载;
    6.预处理功能
    • C++有一个预编译阶段,支持预处理,虽然提供了方便,但是增加了编译的复杂度;Jav不支持预处理,但是提供的引入语句(import)和预编译的功能类似;
    7.字符串
    • C++使用'\0'终止符代表字符串的结束;Java中字符串使用类对象来实现;
    8.goto语句
    • C++支持goto语句,导致程序结构混乱,不易理解;Java虽然指定goto作为关键字,但是不支持它的使用;
    9.类型转换
    • C++支持数据类型的隐式转换,比如float隐式转换为int;Java不支持隐式类型转换,必须显式进行强制类型转换;

    6.struct和class的区别

    1.默认继承和默认访问权限
    • struct为public,class为private;
    2.模板
    • class可以定义模板类形参,而struct不可以。

    7.define 和const的区别(编译阶段、安全性、内存占用等)

    1.编译器处理方式
    • define在预处理阶段进行替换;const在编译时确定;
    2.类型检查
    • define无类型,不进行安全检查,可能会产生意想不到的结果;const有数据类型,编译时会进行类型检查;
    3.内存空间
    • define不分配内存,给出的是立即数,有多少次就进行多少次替换,在内存中有多个拷贝,消耗内存大;const分配内存(可能在全局静态区,也可能在栈区),在程序运行过程中只有一次拷贝;
    4.其他
    • 在编译时,编译器通常不为const常量分配存储空间,而是将它们保存在符号表中,使它成为一个编译期间的常量,没有存储和读内存,因此效率很高。

    8.在C++中const和static的用法(定义,用途)

    9.const和static在类中使用的注意事项(定义、初始化和使用)

    10.C++中的const类成员函数(用法和意义)

    11.计算下面几个类的大小:

    class A {}; //sizeof(A) = 1;
    class A { virtual Fun(){} }; //sizeof(A) = 4(32位机器)/8(64位机器);
    class A { static int a; }; //sizeof(A) = 1;
    class A { int a; }; //sizeof(A) = 4;
    class A { static int a; int b; }; //sizeof(A) = 4;
    

    12.给一个代码,求输出结果

    class A
    {
    public:
    A(int x){}
    }
    

    问:A a = 1;是否正确, 如果正确, 那么它调用了哪些函数?
    这类题目更常见的是在基类和子类有不同实现方法。(虚函数相关,栗子很多,不多说了)

    13.C++的STL介绍(这个系列也很重要,建议侯捷老师的这方面的书籍与视频),其中包括内存管理allocator,函数,实现机理,多线程实现等

    14.STL源码中的hash表的实现

    15.STL中unordered_map和map的区别

    16.STL中vector的实现

    17.vector使用的注意点及其原因,频繁对vector调用push_back()对性能的影响和原因。

    18.C++中的重载和重写的区别:

    19.C ++内存管理(热门问题)

    20.介绍面向对象的三大特性,并且举例说明每一个。

    21.多态的实现(和下个问题一起回答)

    22.C++虚函数相关(虚函数表,虚函数指针),虚函数的实现原理(热门,重要)

    23.实现编译器处理虚函数表应该如何处理

    24.析构函数一般写成虚函数的原因

    25.构造函数为什么一般不定义为虚函数

    26.构造函数或者析构函数中调用虚函数会怎样

    27.纯虚函数

    28.静态绑定和动态绑定的介绍

    29.引用是否能实现动态绑定,为什么引用可以实现

    30. 深拷贝和浅拷贝的区别(举例说明深拷贝的安全性)

    31.对象复用的了解,零拷贝的了解

    32.介绍C++所有的构造函数

    33.什么情况下会调用拷贝构造函数(三种情况)

    34.结构体内存对齐方式和为什么要进行内存对齐?

    35.内存泄露的定义,如何检测与避免?

    36.手写实现智能指针类(34-37我没遇见过)

    37.调试程序的方法

    38.遇到coredump要怎么调试

    39.内存检查工具的了解

    40.模板的用法与适用场景

    41.成员初始化列表的概念,为什么用成员初始化列表会快一些(性能优势)?

    42.用过C11吗,知道C11新特性吗?(有面试官建议熟悉C11)

    43.C++的调用惯例(简单一点C++函数调用的压栈过程)

    44.C++的四种强制转换

    参考资料

    1.守望者1208
    2.浅谈new/delete和malloc/free的用法和区别

    相关文章

      网友评论

          本文标题:2.C++面试问题汇总

          本文链接:https://www.haomeiwen.com/subject/nwparktx.html