目录
9.你是如何理解C++同时具有面向对象和面向过程语言的特性的?
1. 程序的编译执行流程?
- 编译:对源程序进行语法检查,在检查无误后,把代码翻译为二进制目标代码。
- 链接:将源程序与其它库函数及相关程序链接起来,生成可执行文件。
- 执行:执行生成的可执行文件。
2. C++浅拷贝和深拷贝的区别?
简单理解
假如B复制A,如果改变A,则B也被改变,就是浅拷贝。
假如B复制A,A改变,则B不变,就是深拷贝。
详细解释
对于浅拷贝来说,只是增加了一个指针指向已经存在的内存。当浅拷贝复制引用属性时,仅仅复制指针值,没有复制指向的对象。
对于深拷贝来说,它复制了该属性指向的对象,也就是在增加了一个指针的同时并且申请了一块新的内存,使这个增加的指针指向这片新的内存。
3. C++虚函数?
虚函数是被 virtual 关键字修饰的成员函数。虚函数的作用,就是实现多态。通俗的讲,就是以共同的方法,但因个体差异,而采用不同的策略。
在基类的函数前加上 virtual 关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数,如果对象类型是派生类,就调用派生类的函数,如果对象类型是基类,就调用基类的函数。
比如说有个动物数组,里面有很多种动物(猫、狗、鸟)。现在动物类有一个发出叫声的函数,而不同动物的叫声是不一样的,那我们每个动物就可以去重写这个发出叫声的函数。那咱们在遍历这个数组的时候,就统一调用这个发出叫声的函数,而不需要去管它到底是哪种动物。
把子类对象用父类类型来声明,在子类里面重写父类里的函数,调用方法的时候执行的是子类里面的函数。
4. 指针和引用的区别?
指针和引用都是一种内存地址的概念,区别呢,指针是一个实体,引用只是一个别名。
指针它指向一块内存,指针的内容是所指向的内存的地址。所以说,指针包含的内容是可以改变的,允许拷贝和赋值,有 const 和非 const 区别,甚至可以为空,sizeof 能够获得指针类型的大小。
引用它只是一块内存的别名,所以引用必须而且只能在定义时被绑定到一块内存上,后续不能更改,也不能为空,也没有 const 和非 const 区别。
5. C++中内存分配情况?
栈:由编译器管理分配和回收,存放局部变量和函数参数。
堆:由程序员管理,需要手动 new malloc delete free 进行分配和回收,空间较大,但可能会出现内存泄漏和空闲碎片的情况。
全局/静态存储区:分为初始化和未初始化两个相邻区域,存储初始化和未初始化的全局变量和静态变量。
常量存储区:存储常量,一般不允许修改。
代码区:存放程序的二进制代码。
6. 面向对象与面向过程
面向对象编程(Object-Oriented Programming, OOP)和面向过程编程(Procedural Programming)是两种不同的编程范式。
面向对象编程(OOP):
- 核心思想:将程序中的数据(对象)和操作数据的方法(函数)组合成为一个对象,通过对象之间的交互来完成任务。
- 特点:封装(Encapsulation)、继承(Inheritance)、多态(Polymorphism)是面向对象编程的三大特性。
- 重点:注重数据的封装性、代码的复用性和扩展性,更加灵活和易于维护。
面向过程编程:
- 核心思想:将问题划分为一个个小的步骤,然后使用函数来一步步地解决问题。
- 特点:强调程序的执行顺序和流程,将问题按照执行顺序分解成一个个步骤,然后写出实现每个步骤的函数。
- 重点:适合解决简单的问题,代码的可复用性较低,随着程序规模的增大,容易导致代码的复杂性和维护难度增加。
比较:
- 抽象程度:面向对象更加抽象,通过对象的概念来组织和设计程序;面向过程更直接地按照步骤解决问题。
- 复用性:面向对象因为可以通过继承和多态实现代码的复用,更加灵活;面向过程通常需要重复编写相似的功能代码。
- 维护性:面向对象因为封装性好,可以降低代码的耦合度,提高代码的可维护性;面向过程因为较少的抽象层次,维护相对较困难。
选择面向对象还是面向过程取决于项目的需求和复杂度。大多数现代编程语言都支持面向对象编程,因为它更符合复杂软件系统的开发和维护要求。
7. 堆和栈的区别?
栈
由编译器进行管理,在需要时由编译器自动分配空间,在不需要时候自动回收空间,一般保存的是局部变量和函数参数等。
堆
由程序员管理,需要手动 new malloc delete free 进行分配和回收,如果不进行回收的话,会造成内存泄漏的问题。
8. 面向对象的三大特性?
- 封装就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让信任的类或者对象操作,对不可信的进行信息隐藏。一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体。在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问。通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。
- 继承
一个类继承了另一个类,就具有了该类所有非私有的属性和方法。就可以像调用自己的属性和方法一样去调用。被继承的类叫父类,继承父类的类叫子类。比喻:儿子可以去使用父亲的资源,然后儿子也可以拥有自己独立的发展。
3.多态
多态指的是一个对象可以体现出多种形态,比如猫类继承了动物类,那么猫可以体现出两种形态,一种是猫,一种是动物。具体到代码里面通常指的是把子类对象用父类类型来声明,在子类里面重写父类里的方法,调用方法的时候执行的是子类里面的方法。
9.你是如何理解C++同时具有面向对象和面向过程语言的特性的?
10. 重载与覆盖的区别?
- 覆盖是父类与子类之间的关系,是垂直关系;重载是同一类中方法之间的关系,是水平关系。
- 覆盖只能由一个方法或一对方法产生关系;重载是多个方法之间的关系。
- 覆盖要求参数列表相同;重载要求参数列表不同。
- 覆盖中,调用方法体是根据对象的类型来决定的,而重载是根据调用时实参表与形参表来对应选择方法体。
- 重载方法可以改变返回值的类型,覆盖方法不能改变返回值的类型。