文章目录
C++问题汇总:
(1)继承与多态的区别?
继承:类与类之间可以共用代码,可实现代码重用。
多态:子类重写父类的方法,使得子类具有不同的实现,并且运行时,根据实际创建的对象动态决定使用哪个方法。
C++中实现多态的前提条件:
- (1)有继承
- (2)重写父类方法
- (3)该方法要被virtual修饰
- (4)父类指针或者引用指向子类对象
☆ 多态的实现要求必须是共有继承
☆ 在继承关系中,父类更通用,子类更具体。父类具有一般的特征和行为,子类除了具有父类的特征和行为,还有自己特殊的行为与特征。
☆ 继承关系中,并不要求基类方法一定是虚函数。但多态要求基类方法必须是虚函数。
(2)什么是多态?
定义:一个接口多个方法,只有程序在运行时才决定调用的函数
目的:多态的目的是为了实现接口重用,而封装的目的是使代码更模块化,继承则是可以扩展已经实现的代码,他们的目的都是为了代码重用。
用法:声明基类的指针,利用该指针指向任意一个子类对象,调用相应的虚函数,可以根据指向的子类的不同而实现不同的方法。
(3)重载和重写的区别
1、定义不同:重载是定义相同的方法名、参数不同,重写是子类重写父类的方法。
2、范围不同:重载是在一个类中,重写是子类与父类之间的。
3、多态不同:重载是编译时的多态性,重写是运行时的多态性
4、参数不同:重载的参数个数、参数类型、参数的顺序可以不同;重写父类子方法参数必须相同。
5、修饰不同:重载对修饰范围没有要求,重写要求重写方法的修饰范围大于被重写方法的修饰范围。
PS:多态是一个类需要表现出多种形态,子类重写父类的方法,使子类具有不同的方法实现。
(4)静态成员函数的作用。
class X
{
public:
void MethodA();
static void MethodB();
}
当想要调用MethodA()时,需要先生成类对象才能调用:具体步骤:
X x;
x.MethodA();
但是想要调用MethodB()是,就可以直接调用:
X::MethodB();
静态函数不需要实例化就可以被调用。
(5)STL?
介绍:
长久以来,软件界一直希望建立一种可重复利用的东西,以及一种得以制造出“可重复运用的东西”的方法。C++从函数、函数库、类别库、各种组件、模块设计到面向对象,目的就是提升代码的复用性。
STL(标准模板库)是惠普实验室开发的一系列软件的统称,现在主要出现在C++中,但其实这个概念很早就出现了。
六大组件简介:
1、容器,将运用最广发的一些数据结构实现出来;常用的数据结构:数组、链表、树、栈、队列、集合和映射表等。
2、算法,各种常用的算法,如sort,find,copy,for_each等。
3、迭代器
4、仿函数:行为类似函数,可作为算法的某种策略;从实现的角度看,仿函数是一种重载了operator()的class或者class template
5、适配器:一种用来修饰融合或者仿函数或迭代器接口的东西
6、控制配置器:负责空间的配置与管理,实现动态空间配置、空间管理与空间释放。
(6)C++中堆和栈的区别?
堆是程序员自己操作的控件,如new对象,delete。频繁的new/delete会产生大量的内存碎片,降低程序效率。
栈是系统自己分配的,先进后出的连续空间,所以比较大。进出一一对应,不会产生碎片。
静态存储区存储全局对象,还有静态的局部对象。
(7)内联函数和宏定义的区别
内联函数:inline int max(int a, int b);
宏定义:#define max(a, b) (a > b ? a : b)
内联函数是一个函数,有参数类型检查,比较安全,宏定义不属于函数,没有类型函数检查,不安全。
(8)什么时候要有虚析构函数
通过父类的指针来删除子类的对象时,其析构函数也应该是虚的。一般情况下,父类的析构函数只能删除父类的对象,并不能删除从父类继承来的子类对象,这样容易造成内存泄漏。
(9)STL实现了哪些排序算法?
将元素放在内存中,按照元素多少分为内部排序(元素少)和外部排序。
内部排序:
- 1、插入排序(直接插入、希尔排序);
- 2、交换排序(冒泡排序、快速排序);
- 3、选择排序(简单选择排序、堆排序);
- 4、归并排序