简答题
指针和引用的区别
- 区别:
A.引用定义时必须初始化。指针没有要求
B.引用一旦引用了某个实体,不能再引用其他实体。指针可以在任何时候改变指向。
C.没有NULL引用,但是有NULL指针。
D.sizeof可以获取指针存储空间的大小,而sizeof引用获取的是引用对象的存储空间的大小。
E.没有多级引用,但有多级指针。
F.访问实体的方式不一样,指针需要显式解引用。
G.引用比指针使用起来更安全
封装、继承、多态
- 封装定义:
封装就是将抽象对象的属性和行为特征结合。形成类,数据(属性)和函数(行为 特征)都是类的成员。目的是让类的设计者和使用者分开,提高软件的维护性。
封装特性:
a.结合性:属性和方法结合
b.隐蔽性:利用接口机制隐藏内部实现。只留接口给外部使用
c.实现代码的可实用性。
- 继承定义:
指新类从原有类那里得到已有的特性,原有类成为基类或父类,产生的新类为子类或派生类。
- 多态
静态多态:是编译器在编译期间完成的,编译器根据函数实参(可能会进行隐式类型转换)确定调用哪个函数。静态多态有两种实现方式,分别是函数重载和函数模板。
动态多态:在程序执行期间(非编译时期)判断所引用的对象的实际类型,然后根据其实际的类型调用相应的方法。动态多态是通过继承+虚函数实现的。即在基类 中将子类需要重新实现的方法使用virtual修饰为虚函数。然后在子类中进行重写。 最后用指向子类对象的父类指针调用该虚函数,将进行动态绑定调用子类重写后的方法。
总结:封装可以使得代码模块化,继承可以扩展已存在的代码,他们的目的都是为了代码重用。而多态的目的则是为了接口重用。
虚函数和纯虚函数的作用
虚函数:虚函数的主要作用就是“运行时多态”,父类中提供默认的函数实现,子类可以重写父类的虚函数从而实现子类的特殊化。
纯虚函数:
- 包含纯虚函数的类称为抽象类。抽象类不能进行实例化,只有实现了这个虚函数的子类才能实例化。
- 在基类中为其派生类保留一个函数的名字,以便派生类根据需要对它进行定义。从而实现“运行时多态”
- 纯虚函数作为接口而存在。纯虚函数不具备函数的功能,一般不能直接被调用。
重写、重载、重定义(隐藏)的定义和区别
- 重载:重载是应用于相同作用域的同名函数,由于参数列表不同而产生不同实现的 函数。
- 重写:子类重新定义父类中有相同名称和参数的虚函数。函数特征相同,但是实现 不同,主要是在继承关系中产生的。