1、指针和引用的区别
(1)指针有自己的一块空间,引用就只是一个别名
(2)使用sizeof看指针的大小为4字节,而引用则是被引用对象的大小
(3)指针可以初始化为NULL,而引用必须初始化为一个已有对象的引用
(4)如果返回动态分配内存的对象或者内存,必须使用指针,引用可能引起内存泄漏
2、堆、栈的区别
栈:由os自动分配释放,存放函数的参数值,局部变量的值等,类似于数据结构的栈
堆:由程序员分配释放,若不释放,介绍时可能os回收,类于链表
速度上:栈是编译时分配空间,堆是动态分配(运行时),所以栈更快
3、new和delete与malloc和free
属性上:new、delete是C++关键字,需要编译器支持,malloc和free是库函数,需要头文件支持
参数:new申请内存不需要指明大小,malloc需要
返回:new返回的是对象类型的指针,更安全,malloc返回void*,需要类型转换
分配失败:new抛异常,malloc返回NULL
重载:允许重载new、delete
内存区域:new从自由存储区动态分配内存空间,malloc从堆上
4、define和const区别
起作用阶段:#define是在编译的预处理阶段,而const是在编译、运行的时候起作用
作用方式:const常量有数据类型,而宏常量没有
存储方式:#define只是进行展开,有多少使用,就替换多少次
5、static和const
static为整个类服务而非某个对象,且不破坏封装性
修饰全局变量
修饰局部变量
修饰静态函数
修饰类的静态成员:必须显示初始化
修饰类的静态函数:只能使用上述变量
const
修饰类成员:不能在类定义处初始化,只能通过构造函数
修饰类函数
6、重载和重写的区别
重载:是指同一可访问区内被声明的几个具有不同参数列表(参数类型,个数,顺序不同)的同名函数,根据参数列表确定调用哪个函数
重写:指派生类中存在重新定义的函数。其函数名,参数列表,返回值类型,所有都必须同基类中被重写的函数一致。只有函数体不同,要有virtual修饰
7、智能指针
自动释放所指向的对象,auto_ptr,shared_ptr,weak_ptr,unique_ptr
8、多态作用,机制
接口的多种不同实现方式即为多态,当发出一条命令时,不同对象接收到同样的命令后所作出的动作是不同的。
机制:子类继承父类(extends),对父类方法进行改写
类实现接口(implements),对接口方法的实现
声明的总是父类类型或者接口,创建的是实际类型
9、虚函数(实现类的多态性)
定义为虚函数是为了允许用基类的指针来调用子类的这个函数
基类定义虚函数,子类重写,在派生类中对基类定义的虚函数进行重写时,需要声明该方法为虚函数
基类中 virtual void A()
派生类中 void A()
注:C++调用虚函数比普通函数慢:普通地址在编译期间指定,单纯的寻址调用。虚函数调用,首先要找虚函数表,然后找偏移地址调用
10、纯虚函数
在基类中声明的虚函数,基类中无定义,在派生类中都要定义实现方式。
基类中 virtual void A()=0
派生类 void A(){实现}
与虚函数的区别:含有纯虚函数的类称为抽象类,只含有虚函数的不能称为抽象类,虚函数可以直接使用或子类重载后使用,纯虚函数必须在子类实现才可以使用,纯虚函数在基类中只有声明没有定义,虚函数必须实现
11、继承
一个对象直接使用另一对象的属性及方法,C++支持多继承
12、三特性
封装、继承、多态
13、红黑树
每个结点要么是红的要么是黑的。
根结点是黑的。
每个叶结点(叶结点即指树尾端NIL指针或NULL结点)都是黑的。
如果一个结点是红的,那么它的两个儿子都是黑的。
对于任意结点而言,其到叶结点树尾端NIL指针的每条路径都包含相同数目的黑结点。
正是红黑树的这5条性质,使一棵n个结点的红黑树始终保持了logn的高度,从而也就解释了上面所说的“红黑树的查找、插入、删除的时间复杂度最坏为O(log n)”这一结论成立
以上内容均来源于各个版主、牛客网总结