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是在编译的时候处理的。