整理一些面试过程中可能会被问到的面试题:
1.简单介绍一下项目,项目是否有并发编程设计。
2.静态库和动态库的区别?
答:静态库(.a、.lib)和动态库(.so、.dll)。静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库,因此体积较大。 动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在,因此代码体积较小。 动态库的好处是,不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例。
3.多态的实现,虚函数表是一个类有一个,还是一个对象有一个?(是某个类共享一个表,还是每个对象都有一个表)?
答:C++的多态性是在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。如果对象类型是派生类,就调用派生类的函数;如果对象类型是基类,就调用基类的函数。
多态实现的三个条件是,1.有继承关系2.虚函数重写3.父类指针指向子类对象。
当类中声明虚函数时,编译器会在类中生成一个虚函数表,存在虚函数时每个对象都有一个指向虚函数表的指针。
(重载是相对于一个类之间的,也就是我们之前说的,方法名称相同,但是参数不同;
重写则是在继承关系中出现,也就是在子类和父类之间,一般是子类重写父类的方法)
4.C++空类默认有哪些函数?
答:默认产生:构造函数、拷贝构造函数、析构函数、赋值运算符,以及取址运算符、常量取址运算符。
5.构造函数能是虚函数吗?
答:不能。从存储角度说,虚函数对应一个指向vtable虚函数表的指针,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还没有实例化,也就是内存空间还没有,怎么找vtable呢?所以构造函数不能是虚函数。从使用角度说,虚函数的作用在于通过父类的指针或者引用来调用它的时候能够变成调用子类的那个成员函数。而构造函数是在创建对象时自动调用的,不可能通过父类的指针或者引用去调用,因此也就规定构造函数不能是虚函数。
构造函数可以调用虚函数吗?
答:语法上没问题,但是达不到理想的效果。派生类对象构造期间进入基类的构造函数时,对象类型变成了基类类型,而不是派生类类型。同样,进入基类析构函数时,对象也是基类类型。所以,虚函数始终仅仅调用基类的虚函数(如果是基类调用虚函数),不能达到多态的效果,所以放在构造函数中是没有意义的,而且往往不能达到本来想要的效果。
6.析构函数能是虚函数吗?
答:可以。 析构函数的作用在对象撤销前把类的对象从内存中撤掉,通常系统只会执行基类的析构函数,不执行派生类的析构函数。 将基类的析构函数声明为虚函数,当撤销基类对象的同时也撤销派生类的对象,这个过程是动态关联完成的。 析构函数设为虚函数的原因是为了防止内存泄露。所以建议的方式是将析构函数声明为虚函数。
7.引用和指针的区别,引用和指针使用的时候需要注意什么,有什么区别?初始化引用能否修改指向的对象?
答:本质:引用是别名,指针是地址,具体的:1、引用必须初始化,指针可以任何时候初始化 2、引用后不能再引用其他对像,指针则可以 3、引用不能为空,指针可以为空。
(引用就是个别名,不一定占用运行时的内存。是否占用编译器可以根据实际情况来处理)
8.智能指针?
智能指针的作用是管理一个指针,防止申请的空间在函数结束时忘记释放,造成内存泄漏。因为智能指针就是一个类,当超出了类的作用域是,类会自动调用析构函数,析构函数会自动释放资源。所以智能指针的作用原理就是在函数结束时自动释放内存空间,不需要手动释放内存空间。share_ptr、unique_ptr和weak_ptr;
shared_ptr 实现共享式拥有(shared ownership)概念。多个智能指针指向相同对象,该对象和其相关资源会在 “最后一个 reference 被销毁” 时被释放。为了在结构较复杂的情景中执行上述工作,标准库提供 weak_ptr、bad_weak_ptr 和 enable_shared_from_this 等辅助类。
weak_ptr 是一种不控制对象生命周期的智能指针, 它指向一个 shared_ptr 管理的对象。进行该对象的内存管理的是那个强引用的 shared_ptr, weak_ptr只是提供了对管理对象的一个访问手段。weak_ptr 设计的目的是为配合 shared_ptr 而引入的一种智能指针来协助 shared_ptr 工作, 它只可以从一个 shared_ptr 或另一个 weak_ptr 对象构造,它的构造和析构不会引起引用记数的增加或减少。weak_ptr是用来解决shared_ptr相互引用时的死锁问题,如果说两个shared_ptr相互引用,那么这两个指针的引用计数永远不可能下降为0,资源永远不会释放。它是对对象的一种弱引用,不会增加对象的引用计数,和shared_ptr之间可以相互转化,shared_ptr可以直接赋值给它,它可以通过调用lock函数来获得shared_ptr。
unique_ptr 实现独占式拥有(exclusive ownership)或严格拥有(strict ownership)概念,保证同一时间内只有一个智能指针可以指向该对象。你可以移交拥有权。它对于避免内存泄漏(resource leak)——如 new 后忘记 delete ——特别有用。
9.STL库
9.1常用的容器:array、vector、list、stack、deque、map、multimap、set、multiset、queue、priority_queue、unordered_set、unordered_map。
9.2底层实现:array、vector(数组) ;list、forward_list (链表) ;deque(双端队列) ;queue、stack(deque、list);priority_queue(数组+大根堆)