- 简述面向对象三大特性
- 封装:封装是把客观事物抽象成类,并且把自己的属性和方法提供给可信的类或对象操作,对不可信的隐藏。通过封装,对象的内部具体操作的实现细节被隐藏,只有特定的接口暴露给外部。
- 继承:继承允许一个类继承另一个类的属性和方法。子类可以重用父类的代码,并且可以添加新的属性和方法或覆盖父类的方法。继承支持代码重用,提高了代码的可维护性和扩展性。
- 多态:多态是指通过类的继承,使得同一个函数可以根据调用它的对象不同而做出不同的反应。多态是指用一个相同的函数名定义不同的函数实现,调用这些函数执行不同操作,但是有相似的行为,即用同样的接口访问不同的函数实现。多态性提高了代码的灵活性和可扩展性,使得程序更容易扩展和维护。
- 简述友元函数的利与弊
- 利:在实现类之间数据共享的时候,减少系统开销,提升效率。因为普通函数无法访问私有的成员,而友元函数 可以方便、快捷的访问私有成员
- 弊:由于友元能够直接访问到私有成员,所以它破坏了面向对象的封装机制,所以在实际开发中,要减少使用友元函数。
- 简述一下内联函数
内联函数是C++中的一种函数特性,通过在函数定义前面加上关键字“inline”实现。
内联函数告诉编译器在每个调用点上直接插入函数体,而不是生成函数调用的过程,这样就可以减少函数调用的开销,提高函数运行的效率。
同时内联函数最初的目的是用于代替部分的#define宏定义,之所以要代替宏定义,是因为宏的编写有很多限制,且宏没有类型检查,无论对或错都是直接替换。而内联函数完美的解决了这些问题。
内联函数适用于函数体较小且频繁调用的情况,但不是所有标记为“inline”的函数都会被内联,最终到底会不会进行内联,还是要由编译器决定。
- 简述指针和引用的区别
- 相同点:都是有关地址的概论,指针指向一个变量在内存中的地址,而引用则是地址的别名
- 不同点:
- 引用必须被初始化,但是不分配存储空间
- 引用被初始化后不能被改变,但是指针可以改变所指对象
- 不存在指向空值的引用,但是存在指向空值的指针
- 简述一下指针数组和数组指针
- 指针数组
- 指针数组是一个数组,它的每一个元素都是指针
- 其中每个指针可以指向不同类型的数据或相同类型的数据
- 可以通过索引来访问数组中的每一个指针,并可以通过指针来访问其所指向的数据
- 数组指针
- 数组指针是一个指针,它指向数组的首元素
- 它可以指向数组中的任何位置,并可以通过算术运算来访问数组中的其他元素
- 数组指针的声明中必须指定数组的类型和维度
- 指针数组
- 简述一下什么是类
类是面向对象编程中的基本概念,用来描述具有相同的属性和方法的对象的集合。类定义了对象的属性和行为,并且提供了对这些属性和行为的访问控制,其中包括公有、私有以及保护。类是对象的抽象、对象是类的实例。
- 结构体和共用体的异同
- 同:
- 它们都是用来组织多个数据成员的数据结构
- 它们的成员都是通过成员选择运算符’.’进行访问
- 异
- 结构体的所有成员在内存中是按顺序存储的,而共用体是全部成员共享一块内存空间
- 结构体的内存占用是全部成员所占内存大小之和,而共用体的内存占用取决于最大成员所占用内存空间大小
- 结构体可以为每个成员分别赋初值,而共用体只能给第一个成员赋值。
- 同:
- 简述一下构造函数和析构函数
- 构造函数
构造函数是一种特殊的成员函数,在对象被创建时自动调用,用于初始化数据成员;构造函数的名称与类名相同,没有返回类型,void都没有;构造函数可以进行函数重载,所以我们可以定义构造函数;构造函数可以具有参数,称为形参,用于在创建对象时向对象传递初始值。
-
- 析构函数
析构函数同样是一个特殊的成员函数,在对象销毁时自动调用,用于清理对象所分配的资源。析构函数的名称用“~”开头,没有返回类型和参数。与构造函数不同,析构函数不能重载,每个类只能存在一个析构函数。
- 简述一下静态数据成员
静态数据成员是指属于类本身而不是类的特定对象的数据成员,类的所有对象共享静态数据成员。
它具有以下特性和用法
-
- 共享性
- 一次分配
- 通过类名访问
- 常用于共享状态和全局设置
- 不依赖实例化
- 简述c++的动态内存分配
在编程的过程中,我们无法预知具体需要多少内存,所需内存的大小需要在运行的时候才能确认,这个时候我们就可以使用c++的动态内存分配机制,用new运算符为给定类型变量在运行时分配内存,这会返回所分配的空间地址,若不再需要动态分配的内存空间,可以使用delete运算符,清空之前由new运算符分配的内存。