资源预览内容
第1页 / 共38页
第2页 / 共38页
第3页 / 共38页
第4页 / 共38页
第5页 / 共38页
第6页 / 共38页
第7页 / 共38页
第8页 / 共38页
第9页 / 共38页
第10页 / 共38页
亲,该文档总共38页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
目录C+2概念理论2C+特性2多态2构造与析构函数3类型转换3内存管理3基本点4static的用法和作用?4指针和引用4Fork函数4Extern “c”5RTTI5C/C+语言怎么函数调用5回调函数5方法调用原理5STL5STL5map、set是怎么实现的,红黑树是怎么能够同时实现这两种容器? 为什么使用红黑树?5STL中的allocator, deallocator6STL迭代器删除元素6vector与list的区别与应用?6迭代器的作用:6STL中resize和reserve的区别6编译与底层6C+源文件从文本到可执行文件经历的过程6Include和“”6类和数据抽象7面向对象与泛型编程7C+11有哪些新特性?7可变参数模板7右值引用7Lambda表达式:8操作系统8基本知识8进程和线程8进程描述符及任务结构8进程有哪几种状态?8多路复用IO:主要实现:select/poll/epoll11线程同步的方式有哪些?11进程的通信方式有哪些?11什么是缓冲区溢出?有什么危害?其原因是什么?11什么是死锁?死锁产生的条件?11分页和分段有什么区别?11进程同步有哪几种机制?11死锁的处理基本策略和常用方法?11Linux11计算机网络11网络7层、4层、5层模型(体系结构)11IP头部12TCP头部12UDP头部12数据库15基础知识151.事务15算法与数据结构18设计模式18项目相关18C+概念理论java与c+异同1. c+比java快(1) c+编译器直接将源码编译成机器可以执行的二进制代码,java编译器将源码解析成字节码,字节码被JVM加载然后编译成可执行二进制代码;java可以在不同的机器上执行,但是损失了效率。(2) 对象的创建:java中一切皆对象,通过new实现,对象保存在堆中,栈中保存了对象的引用,因此在获得对象的时候是间接寻址,因此比较慢。C+中有一些局部变量和对象的创建是直接存在栈中的,可以直接访问,比较快。(3) 检查机制:Java虚拟机本身在执行时会对程序进行很多检查,检查数组越界,检查类型错误,检查空指针,检查对象是否回收,保证了程序的安全性和稳定性,但是也浪费了检查的时间。C+需要程序员自己检查。2. 指针Java找不到指针直接访问内存,并且添加了自动的内存管理功能,防止了c+中指针操作的失误3. 多重继承4. 数据类型及类:java中所有函数和对象必须是类的一部分,c+允许将函数和对象定义在类外,5. 自动管理内存:java的自动内存回收6. 操作符重载:c+支持操作符重载7. 预处理功能:8. C+支持缺省函数参数9. C+有goto语句10. C+自动强制类型转换指针的作用:(1)引用大的数据结构(2)动态分配内存(3)复杂数据结构C和C+1. 面向过程和面向对象自顶向下(步骤划分):面向过程就是分析解决问题的步骤,按照步骤一步步实现;高度实物抽象化(功能划分):面向对象就是将问题分解成多个对象,描述实物在整个解决问题的步骤中的行为。优缺点:面向过程:优点:性能高,因为类调用需要实例化,开销较大,比较耗费资源,在比如单片机、嵌入式开发、Linux/unix一般采用面向过程开发,性能是最重要的因素。缺点:没有面向对象易维护、易复用、易扩展。面向对象:优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态的特性,可以设计出低耦合的系统,使系统更加灵活、易维护。缺点:性能比面向过程低。C+由四个部分组成:c语言部分,面向对象部分,泛型编程部分,STL库2. 具体语言关键字不同:struct, malloc, struct继承方式后缀名不同:.c和.cpp输入输出:printf, cout返回值:默认int,必须指定参数列表:缺省参数:函数默认值:C语言不支持函数默认值,C+支持函数默认值,且遵循从右向左赋初值;函数重载:C语言中函数符号产生是根据名称产生的,不存在重载的概念,C+生成函数符号则考虑了函数名、参数个数、参数类型。Inline内联函数:C89没有,C+在调用点直接展开,不生成符号,没有栈帧的开辟回退问题,仅在release版本下生效,写在头文件中。Const:c的const叫只读变量,只是无法作为左值,c+的const是真正的常量作用域:c中只有局部,全局,c+中有局部、类、名字空间作用域。Malloc/free, new/delete: 库函数、关键字(运算符);需要指定大小,类型转换,不需要指定;不调用构造析构函数,调用。类型转换:指针和引用:C+特性C是面向过程的,C+是面向对象的封装继承多态,类型转换,支持范式编程,函数模板等封装:把方法和数据包装起来,隐藏具体的实现细节,外部通过接口访问。继承:依据一个类定义另一个类,提高重用性。多态:一个接口,多种实现,同一事物多种形态。用父类型别的指针指向子类的实例,通过父类的指针调用实际子类的成员函数,父类的指针具有多种形态,是一种泛型技术。把一系列具体事物的共同点抽象出来,在通过这个抽象的事物,与不同的具体事物进行对话。提高代码的扩展性,前期定义的代码可以使用后期的内容。多态重载和覆盖(重写)在同一个作用域,两个函数名相同,参数不同,重写:子类继承父类,父类中是虚函数,子类中重新定义这个虚函数,多态和虚函数多态的实现包括静态多态和动态多态,静态多态主要是重载,在编译的时候已经确定,动态多态是用虚函数机制实现,在运行期间动态绑定,虚函数的实现:在有虚函数的类中,类的最开始部分是一个虚函数表的指针,这个指针指向一个虚函数表,表中放了虚函数的地址,实际的虚函数在代码段,当子类继承父类的时候也会继承其虚函数表,当子类重写父类中虚函数的时候,会将其继承到的虚函数表中的地址替换为重写的函数地址,使用了虚函数,会增加访问内存开销,降低效率。虚函数的代价:带有虚函数的每个类都会产生一个虚函数表,用来存储虚成员函数的指针;每个带有虚函数的类都会有一个指向虚函数表的指针。哪些函数不是虚函数:构造函数、内联函数、静态函数、友元函数、类外普通函数虚函数和纯虚函数的区别:纯虚函数只有定义,没有实现,虚函数既有定义又有实现;含有纯虚函数的类不能定义对象,含有虚函数的类可以定义对象。虚函数和虚函数表:虚函数表是编译时就确定了,而类对象的虚函数指针是在运行阶段确定的,虚函数的调用时在运行时才确定的。构造与析构函数析构函数的作用对象结束生命周期时,自动执行析构函数,不能重载,编译系统会自动生成一个缺省的析构函数,如果类中有指针且在使用过程中动态申请了内存,最好显示在析构函数销毁类之前,释放掉申请的内存空间,避免内存泄漏。类析构的顺序:派生类本身的析构函数,对象成员析构函数,基类析构函数析构函数为什么必须是虚函数将可能被继承的父类的析构函数设置为虚函数,可以保证当new一个子类时,使用基类指针指向子类对象,释放基类指针时可以释放掉子类的空间,防止内存泄漏。通过子类对象的虚函数表指针找到子类对象的虚函数表,通过虚函数表找到虚析构函数,执行子类析构函数的释放。构造函数为什么不能为虚函数:创建一个对象必须知道类型,虚函数在运行时才能根据对象的类型确定调用哪一个类型的虚函数。虚函数指针必须在构造函数中初始化。类型转换C语言的强制类型转换:显式和隐式对于内置类型,低精度的变量给高精度的变量赋值时会发生隐式类型转换,Static_cast: 基本数据类型转换、父子类型转换(上行转换安全,下行转换不安全)、空指针转换成目标类型的空指针,任何类型的表达转换成void类型,没有运行时检查保证转换的安全性。Dynamic_cast: 运行时处理,并且进行类型检查,指针或引用,基类中一定要有虚函数Const_cast: 修改const变量的方式,只能是指针或引用Reinterpret_cast: 改变指针或引用的类型,指针或引用与整型的相互转化。dynamic_cast:怎么进行类型检查向上转换就像赋值操作一样,并没有耗费多少资源,dynamic_cast用来解决编译时无法知道转换是否正确的场景,要求操作对象是指向一个多态类型(含有虚函数)的指针或引用,来进行downcast或crosscast。检查虚函数表中type_info信息,运行时通过vptr取得,比较是否吻合,返回。内存管理C+中,内存分为5个区:堆、栈、自由存储区、全局/静态区、常量存储区栈:存放函数参数及局部变量堆:new分配的内存块,自由存储区:malloc分配的内存块全局变量/静态:global和static常量存储区:constC+内存管理代码段、数据段、BSS段、堆区、文件映射区、栈区代码段:存储代码和字符串常量数据段:存储已初始化的全局变量和静态变量BSS:存储未初始化的全局变量和静态变量,以及所有被初始化未0的堆区:动态分配内存文件映射:存储动态链接库以及调用mmap函数及进行的文件映射。栈区:存储函数的返回地址、参数、局部变量、返回值。C+函数栈空间的最大值:1M常量存放在内存的哪个位置局部对象、常量存放在栈区,全局对象、常量存放在全局/静态存储区,对于字面值常量存在在常量存储区。智能指针为什么要使用智能指针,管理内存泄漏。将普通指针封装成一个栈对象,智能指针是一个类,当超出类的作用域时,会自动调用析构函数,释放内存。auto_ptr:采用所有权模式,不能复制和赋值对象,运行时容易报错unique_ptr:严格的拥有概念,比auto_ptr安全,直接赋值会编译报错,可以使用std:move转移所有权, shared_ptr:共享式拥有概念,采用引用计数实现,多个智能体指针可以指向相同的对象,在最后一个引用被销毁时释放。Use_count返回引用计数的个数weak_ptr:控制对象生命周期的智能指针,指向shared_ptr管理的对象,提供了对管理对象的一个访问手段,配合shared_ptr,构造或者析构不会引起计数的增减。引用计数有一个问题是相互引用形成环,这样两个指针指向的内存都无法释放,使用weak_ptr配合shared_ptr同时引用一块内存,当所有的shared_ptr被析构后,内存就会被释放不管weak_ptr。New/delete和malloc/free的区别New/delete是关键字,malloc/free是库函数,后者使用时必须指明申请内存空间的大小,对于类类型的对象,后者不会调用构造函数和析构函数。Malloc需要指定申请内存的大小,返回的指针需要强制转换,new会调用构造函数,不用指定内存大小,返回的指针不会强转。New是按照数据类型分配,返回对象的指针,malloc返回void*,malloc 的管理内存的方式,内部的结构,通过哪些系统调用如何判断内存泄漏由于疏忽或错误造成了程序未能释放掉不再使用内存的情况。使用检查工具,添加内存申请和释放的统计功能。分类:堆内存泄漏,系统资源泄漏,父类的析构函数未定义为虚函数。Public, protected,
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号