1.C++编译器自动为类产生的四个缺省函数是什么?
答:默认构造函数、拷贝函数、析构函数、赋值运算符函数和取地址运算符函数
2.请简述C++中栈空间和堆空间的主要区别是什么?
答:1)申请方式不同,在C++中栈空间是系统自动分配的,堆空间是用户自己申请空间并且需要自己释放。
2)系统响应方式不同
3)空间大小不同,栈空间小,堆空间大。
4)生长方式不同,堆由低向高,栈是由高向低。
5)效率不同,栈空间的效率比较高,堆空间的效率比较低
3.为什么析构函数建议加virtual属性?
答:当发生基类指针指向派生类的时候,如果基类析构函数不加virtual,程序结束,将导致无法调用派生类的析构函数,发生内存泄漏。
4.简单说明面向对象的特性及重要性。
答:面向对象的特性分为:封装、继承和多态。
封装:把过程和数据包围起来,保护模块的独立性,程序维护和修改更容易。
继承:派生类继承基类中的属性和函数,提高代码的复用性。
多态:试图使用不变的代码完成可变的算法,允许不同类的对象对同一消息作出响应,能够体现出灵活、抽象,还体现出良好的扩展性。
5.描述观察者模式及其实现过程,并举例说明你是怎样使用观察模式的?
答:每一个虚函数的类都是一个与之对应的虚函数表,存放虚函数对应的指针,包括新声明的虚函数和重写的虚函数,系统会分配一个指针,我们用子类重写父类中的虚函数,然后我们当父类指针指向子类的时候会查找虚函数表中的虚函数地址,对虚函数进行调用,从而实现多态。
6.为什么类的静态成员函数不能直接访问类的非静态成员变量?
答:因为类的静态成员函数不依赖类先于对象存在,而非静态成员变量依赖于类存在,并且后于对象存在。所以说类的静态变量当然不能直接访问类的非静态成员变量。
7.请简述深拷贝和浅拷贝的定义。
答:浅拷贝:在对象复制时,只是对对象中的成员进行简单的赋值,不是申请一个空间,而是共用一块空间。
深拷贝:当成员变量是指针的时候,不是简单的赋值而是重新申请一块空间。