1、封装、继承和多态(面向对象的三大特性)
- 封装:使数据和操纵数据的方法封装为一个整体,把对象的设计者和使用者分开,使用者不必知道其内部细节。增加了安全性。
- 继承:一个类可以继承其他类的全部属性和方法,并且可以修改和扩充。增强了代码的复用性。
- 多态:同一消息被不同的对象接收会产生不同的行为。增加了扩展性。
2、指针和变量的自增自减有什么区别?
- 变量:一个具体的数值。
- 指针:一个变量的地址。
- 指针自增自减改变的是指针指向的地址;变量自增自减改变的是变量的值。
3、宏定义和操作符
- 操作符:编程语言中定义的对数据进行某种操作的特殊字符。
- 宏定义:c语言中的预处理命令,起替换作用,不做任何计算,不占用内存空间和编译时间。
4、虚函数和纯虚函数
- 虚函数:在某个基类中被声明为virtual,并在某个派生类中被重新定义的成员函数。
- 纯虚函数
- 一种特殊的虚函数。
- 用来定义暂时没有意义的操作,需要派生类在继承时给出具体定义。
- 含有纯虚函数的类被称为抽象类,它不能生成对象。
5、引用和值传递的区别
- 值传递传递的是一个值的副本,函数对形参进行操作不会改变实参的值。
- 引用传递的是引用对象的内存地址,函数对形参进行操作就是对实参进行操作。
6、指针和引用的区别
- 引用在定义时被初始化后,就不能改变了;指针可以改变。
- 引用不能为空;指针可以为空。
- 程序不需要为引用分配内存空间;程序需要为指针分配内存空间。
- 指针自增是指针变量的自增;引用自增是变量值的自增。
7、面向对象和面向过程的区别
- 面向过程
- 是一种以过程为中心的编程思想,强调事件的流程和顺序。
- 思想:需要实现一个功能的时候,看重的是开发的过程和步骤,每一个步骤都需要自己亲力亲为。
- 例如:吃饭。需要买菜、洗菜、切菜、煮饭、炒菜...
- 程序=算法+数据
- 面向对象
- 是一种以对象为中心的编程思想,强调事件的角色和主体。
- 思想:需要实现一个功能的时候,看重的并不是过程和步骤,而是关心的是对象,对象能做什么。
- 例如:吃饭。找饭店,饭店提供饭菜,我们不需要关心煮饭做菜的过程。
- 程序=对象+消息
8、类与结构体的区别
- 结构体是一种值类型;类是一种引用类型。值类型用于存储数据的值;引用类型用于存储对实际数据的引用。
- 结构体使用栈存储;类使用堆存储。
- 结构体是一种包含了不同类型数据的包装;类是一种反应现实事物的抽象。
- 结构体没有析构函数;类有析构函数。
- 结构体不可以继承;类可以继承。
10、C++覆盖与隐藏
- 覆盖:子类在继承时,对父类中的虚函数进行重写,父类中的该函数就会被覆盖。
- 隐藏:子类在继承时,对父类中的普通函数进行重写,父类中的该函数就会被隐藏。
11、C++支持参数个数不确定的函数吗?
- 可以通过隐藏参数机制来支持参数个数不确定的函数。
- 用...代替未知的参数,调用时只处理所知道的参数。
12、内联函数
- 程序在编译时,被调用的内联函数会直接被其函数体给替代。
- 内联函数中不允许有循环语句和switch语句。
13、静态函数
- 静态函数是static修饰的函数,只属于类,不属于对象。
- 静态函数只能访问静态成员变量。
- 可以通过类名直接访问。
14、重载和重写
- 重载:在同一个类中,有多个名称相同,但是参数列表不同的函数。减轻了程序员记忆功能相似的不同函数名字。
- 重写:子类对从父类继承的方法进行改造。
15、函数模板
- 函数模板不是一个具体的函数,没有指明确定的返回值类型和形参类型,而用一个虚拟的类型来表示。
- 函数模板只是一个对函数功能框架的描述。
- 当它在具体执行时,将根据传递的实际参数类型决定其功能。
16、类模板
- 一个通用类,其数据成员的类型,成员函数的返回值类型和形参类型不具体指定,而用一个虚拟的类型来表示。
- 使用类模板定义对象时,系统会根据实参的类型来取代类模板中的虚拟类型,从而实现不同类的功能。
17、泛型编程
- 以独立于特定类的方式编写代码,针对不同的类型提供通用的方法。
- 实现方法:函数模板和类模板。
18、#define和typedef的区别
- 两个都是起别名,但#define是在预编译的时候处理的;typedef是在编译的时候处理的。