目录
1.什么是类的继承?
类与类之间的关系:
包含关系:一个类由多个部件类构成,即一个类的成员属性是另一个已经定义好的类
使用关系:一个类使用另外一个类,通过友元或者是传递参数的方式实现
继承关系:关系具有传递性
继承的概念:
一个类继承了另一个类的属性和方法,新类包含了上一个类的属性和方法,被称为子类或者派生类
子类有父类的方法,也可以有父类没有的方法和属性
权限:public,protected,private
2.什么是组合?
一个类里面的数据成员是另一个类的对象,即内嵌其他类的对象作为自己的成员;难点在于:创建组合类时既要对基本类型成员进行初始化也要对内嵌对象进行初始化。创建组合类对象,构造函数的执⾏顺序:先调⽤内嵌对象的构造函数,然后按照内嵌对象成员在组合类中的定义顺 序,与组合类构造函数的初始化列表顺序⽆关。然后执⾏组合类构造函数的函数体,析构函数调⽤顺序相反。
3.构造函数、析构函数可否抛出异常
若在对象的构造函数中发生异常,那么对象的析构函数不会被调用,因此会造成内存泄漏。
用auto_ptr对象取代指针类成员,便对构造函数做了强化,有效避免了抛出异常之后内存泄漏的危机。
如果控制权基于异常的因素离开析构函数,⽽此时正有另⼀个异常处于作⽤状态,C++ 会调⽤ terminate 函数让程 序结束;
如果异常从析构函数抛出,那么这个析构函数的功能就是不完整的。
4.类如何实现只能静态分配和只能动态分配
前者是把 new、delete 运算符重载为 private 属性。 后者是把构造、析构函数设为 protected 属性,再⽤⼦类来动态创建
建立类的方式:
1.静态建立,由编译器为对象在栈空间中分配内存
2.动态建立,用new运算符在堆中分配内存;这个过程分为两步,第⼀步执⾏ operator new() 函数,在堆中搜索⼀块内存并进⾏分配;第⼆步调⽤类构造函数构造对象;
3.只有使⽤ new 运算符,对象才会被建⽴在堆上,因此只要限制 new 运算符就可以实现类对象只能建⽴在栈上。可以将 new 运算符设为私有。
5.何时需要成员初始化列表?过程?
初始化引用成员变量;初始化const成员变量;调用基类构造函数,构造函数拥有一组参数;调用成员类的构造函数,拥有一组参数;
过程:编译器会⼀⼀操作初始化列表,以适当顺序在构造函数之内安插初始化操作,并且在任何显示⽤户代码前。list中的项⽬顺序是由类中的成员声明顺序决定的,不是初始化列表中的排列顺序决定的。
6.程序员定义的析构函数被扩展的过程?
析构函数函数体被执行;如果 class 拥有成员类对象,⽽后者拥有析构函数,那么它们会以其声明顺序的相反顺序被调⽤; 如果对象有⼀个 vptr,现在被重新定义 如果有任何直接的上⼀层⾮虚基类拥有析构函数,则它们会以声明顺序被调⽤; 如果任何虚基类拥有析构函数