文章目录
-
- Question One:请你来说一下C++中的智能指针
- Question Two:为什么基类的析构函数必须是虚函数?为什么C++默认的析构函数不是虚函数?
- Question Three:请你来说一下函数指针
- Question Four:请你来说一下静态函数和虚函数的区别
- Question Five:请你说一说你理解的虚函数和多态
- Question Six:请你来回答一下const修饰成员函数的目的是什么?
- Question Seven:以下四行代码的区别是什么? const char * arr = "123"; char * brr = "123"; const char crr[] = "123"; char drr[] = "123";
待会儿又要模拟面试了,再准备一波。
Question One:请你来说一下C++中的智能指针
虽然天天跟人家扯皮说智能指针,但是让我真刀真枪的干,我只能说,还没干过。
C++里面有四种智能指针:auto_ptr(已弃用),shared_ptr, weak_ptr, unique_ptr
- unique_ptr:顾名思义,这个指针是独一无二的,属于独占式指针,同一时间内指向同一资源的最多只有一个指针而已。它对于避免资源泄露非常有用。
unique_ptr<string> p1(new string ("unique"));
unique_ptr<string> p2;
p2 = p1;//此时会报错!!
编译器认为这种写法是非法的,避免了p1指向无效资源的问题。
- shared_ptr
和unique相对的,shared实现的是共享式拥有。同一时间可以有多个智能指针指向同一资源。该资源会在最后一个指向其的指针销毁时被释放。通过计数机制来纪录当前有多少指针指向同一资源,可以通过成员函数use_count()来查看资源的所有者个数。
当我们调用release()时,当前指针会释放资源所有权,计数减一。当计数等于0时,资源会被释放。
- weak_ptr
weak_ptr 设计的目的是为配合 shared_ptr 而引入的一种智能指针来协助 shared_ptr 工作,它只可以从一个 shared_ptr 或另一个 weak_ptr 对象构造,它的构造和析构不会引起引用记数的增加或减少。weak_ptr是用来解决shared_ptr相互引用时的死锁问题。
其可以检测到所管理的对象是否已经被释放,从而避免非法访问。
注意的是我们不能通过weak_ptr直接访问对象的方法,比如A对象中有一个方法print(),我们不能这样访问,pa->pb_->print(); 英文pb_是一个weak_ptr,应该先把它转化为shared_ptr,如:shared_ptr p = pa->pb_.lock(); p->print();
Question Two:为什么基类的析构函数必须是虚函数?为什么C++默认的析构函数不是虚函数?
如果基类的析构函数不是虚函数,那么当使用基类指针指向子类对象的时候,会造成子类对象无法释放,造成内存泄漏。
默认析构函数是虚函数啊,因为虚函数会使用到虚表,是要占用内存的。能省就省吧。
Question Three:请你来说一下函数指针
这题我自我感觉答得还不错了。毕竟之前给人家上课的时候因为这个点尴尬了一会儿。
函数指针本身首先是一个指针,该指针指向一个具体的函数。
在调用函数指针时,是不能再函数指针名后带上括号的,所以函数指针所需参数也需要作为参数传入调用函数中。
Question Four:请你来说一下静态函数和虚函数的区别
我是真不知道这俩还有啥共同点?
静态函数在编译的时候就已经确定运行时机,虚函数在运行的时候动态绑定。虚函数因为用了虚函数表机制,调用的时候会增加一次内存开销。
Question Five:请你说一说你理解的虚函数和多态
多态的实现主要分为静态多态和动态多态,静态多态主要是重载,在编译的时候就已经确定;动态多态是用虚函数机制实现的,在运行期间动态绑定。
Question Six:请你来回答一下const修饰成员函数的目的是什么?
表明函数调用不会对对象做出任何更改,事实上,如果确认不会对对象做更改,就应该为函数加上const限定,这样无论const对象还是普通对象都可以调用该函数。
Question Seven:以下四行代码的区别是什么? const char * arr = “123”; char * brr = “123”; const char crr[] = “123”; char drr[] = “123”;
这题是真的比较绕一些了。
const char * arr = “123”;
//字符串123保存在常量区,const本来是修饰arr指向的值不能通过arr去修改,但是字符串“123”在常量区,本来就不能改变,所以加不加const效果都一样
char * brr = “123”;
//字符串123保存在常量区,这个arr指针指向的是同一个位置,同样不能通过brr去修改"123"的值
const char crr[] = “123”;
//这里123本来是在栈上的,但是编译器可能会做某些优化,将其放到常量区
char drr[] = “123”;
//字符串123保存在栈区,可以通过drr去修改