算法面经总结(17)C++

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)”这一结论成立

 以上内容均来源于各个版主、牛客网总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值