C++面试问题 ☆☆☆☆☆☆

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、归并排序

猜你喜欢

转载自blog.csdn.net/weixin_44463519/article/details/127119327