c和c++要点.doc_第1页
c和c++要点.doc_第2页
c和c++要点.doc_第3页
c和c++要点.doc_第4页
c和c++要点.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C语言程序的内存布局:1.代码段codeortext2.只读数据段rodata3.已初始化读写数据段rwdata4.未初始化读写数据段bss5.堆heap6.栈stack但有时候也这么说1.栈2.堆3.全局区或静态区4.字符常量区5.程序代码区针对c和c+经常提到的问题,做一些简单的总结,主要是从内存的角度来解释:1、Static关键字都有哪些用法?C和C+中有什么区别?2、虚基类、虚函数、纯虚函数的用法及其区别?3、C和C+如何动态申请内存和释放内存?有什么区别?4、C语言编译的过程?上次腾讯面试还问到个题目,主要是因为我说c因为其结构化特点是万能的,可以实现出任何我们想要的东西。然后主考官问我:web页面用c语言怎么实现?首先,介绍下c语言的编译执行过程,比方说一个main.c的文件执行过程应当如下:cpp(c预处理器)将mian.c处理为main.icc1(c编译器)将main.i编译为main.sas(汇编器)将main.s汇编为main.old(链接器)将main.o链接为可执行文件最后执行即可。而我们平时所使用的gcc和g+往往将这几个过程省略了,导致我们对其具体过程不是很清楚,但是可以通过加选项把一个个中间过程展现出来。那么c语言在具体执行的过程中到底干了些什么?具体是怎么样执行的呢?C语言的代码段顾名思义其实就是程序的代码,以main函数为入口,我们可以通过汇编代码来窥探其具体执行。电脑只是很简单的执行代码段的一条一条的指令而已。我们已经知道,全局变量以及静态变量等都已经存放于字符常量区以及全局区和静态区里了。那么在具体执行的过程中局部变量怎么办?函数那么多,全部载入执行?这个时候就要用到栈,通过栈帧结构来执行一个一个的函数。沿着箭头方向,地址增大。栈增长方向是向下增长的。比方说在main函数(调用者)里调用了一个swap函数(被调用者),首先在main里面一定有swap(x,y)这样的结构。其中参数x和y就被当做参数压入栈中。然后是返回地址,其实就是swap(x,y)后面的下一条指令地址,让程序返回后能接着执行。而真知则为main的帧指针内容,保证正确执行。这样在取参数的时候就能通过帧指针+4的倍数取到传递过来的参数了。在帧指针下面一般开始存储本地一些临时变量什么的。栈指针指向最低处。这样代码段的指令一条条执行,遇到函数则新建一个栈帧,执行完返回后将该栈帧清除掉即可。这样不管多少个函数,栈都是不断增长了又减小了这样的变化着。多少个栈帧结构也是取决于函数调用嵌套的深度而已。因此我们在执行递归调用的时候可想而知,深度太深那得要多少个栈帧结构啊,效率啊!现在回过头来我们想想static的用法。1.局部静态变量2.外部静态变量(全局)/函数声明一个函数只能在本文件内使用,而非其他3.静态数据成员/成员函数其中前两条是c的用法,c+是在前两条的基础上增加了第三条为什么呢?因为static关键字生命的的都是放在全局区的。一般只初始化一次,以后都是不断引用而已。那么c+第三条如何解释呢?因为一个成员被声明为成员之后,就是静态的。而c+的对象往往是是运行的时候才创建,哪里创建呢?当然是在栈上。而static声明的已经在全局区了,当然不需要再重新在栈空间里出现了。所以此类声明的东西都不能为其具体实例所使用,而是为该类所使用。以staticvoidsolve();为例调用形式一般为Aa的话。那么a实例的东西一般是在栈内,所以a.solve()调用形式是不合适的(其实可以),但并不能说明其内在本质。其初始化形式应该为A:solve,最好不要是a.solve()。我们只需要知道,c中static是整个文件内大家的共享,而c+中类成员实现了一个类的所有成员实例的共享。初始化时一般如下: :=这表明: (1) 初始化在类体外进行,而前面不加static,以免与一般静态变量或对象相混淆。 (2) 初始化时不加该成员的访问权限控制符private,public等。 (3) 初始化时使用作用域运算符来标明它所属类,因此,静态数据成员是类的成员,而不是对象的成员。第二个问题虚基类:当在多条继承路径上有一个公共的基类,在这些路径中的某几条汇合处,这个公共的基类就会产生多个实例(或多个副本),若只想保存这个基类的一个实例,可以将这个公共基类说明虚基类.虚基类虚函数:虚函数的作用是实现动态联编,也就是在程序的运行阶段动态地选择合适的成员函数,在定义了虚函数后,可以在基类的派生类中对虚函数重新定义,在派生类中重新定义的函数应与虚函数具有相同的形参个数和形参类型。以实现统一的接口,不同定义过程。如果在派生类中没有对虚函数重新定义,则它继承其基类的虚函数1、必须把动态联编的行为定义为类的虚函数。2、类之间存在子类型关系,一般表现为一个类从另一个类公有派生而来。3、必须先使用基类指针指向子类型的对象,然后直接或者间接使用基类指针调用虚函数。纯虚函数是一种特殊的虚函数,它的一般格式如下:classvirtual()=0;在许多情况下,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做。这就是纯虚函数的作用。下面从内存角度分析下virtual关键字在c+到底是如何工作的。virtual关键字用于修饰方法、属性、索引器或事件声明,并且允许在派生类中重写这些对象。对c+了解都应该知道虚函数(virtualfunction)是通过一张虚函数表(virtualtable)来实现的,简称v-table。假设有如下所示的一个继承关系:请注意,在这个继承关系中,子类没有重载任何父类的函数。那么,在派生类的实例中,其虚函数表如下所示:对于实例:Derived;的虚函数表如下:我们可以看到下面几点:1)虚函数按照其声明顺序放于表中。2)父类的虚函数在子类的虚函数前面。一般继承(有虚函数覆盖)覆盖父类的虚函数是很显然的事情,不然,虚函数就变得毫无意义。下面,我们来看一下,如果子类中有虚函数重载了父类的虚函数,会是一个什么样子?假设,我们有下面这样的一个继承关系。为了让大家看到被继承过后的效果,在这个类的设计中,我只覆盖了父类的一个函数:f()。那么,对于派生类的实例,其虚函数表会是下面的一个样子:我们从表中可以看到下面几点,1)覆盖的f()函数被放到了虚表中原来父类虚函数的位置。2)没有被覆盖的函数依旧。多重继承(无虚函数覆盖)下面,再让我们来看看多重继承中的情况,假设有下面这样一个类的继承关系。注意:子类并没有覆盖父类的函数。对于子类实例中的虚函数表,是下面这个样子:我们可以看到:1)每个父类都有自己的虚表。2)子类的成员函数被放到了第一个父类的表中。(所谓的第一个父类是按照声明顺序来判断的)而一般的虚基类、纯虚函数应该都是通过编译器来判断执行器修改内容的。回到第三个问题。我们知道c和c+都是在堆(heap)这个结构内来申请内存、释放内存的。c使用malloc和free,c+则是new和delete。申请释放都差不多,那么它们之间到底是否有差别呢?C语言的malloc()和free()并不会调用析构函数和构造函数。C+的new和delete操作符是类意识,并且当调用new的时候会调用类的构造函数和当delete调用的时候会调用析构函数。注意:混合用malloc和delete或者混合用new和free是不正确的。C+的new和delete是C+用构造器分配内存,用析构函数清除使用过的内存。new/delete优点:new/delete调用constructor/destructor.Malloc/free不会.new不需要类型强制转换。.Malloc要对放回的指针强制类型转换.new/delete操作符可以被重载,malloc/free不会new并不会强制要求你计算所需要的内存(不像malloc)注意:malloc:用于申请一段新的地址calloc:用于申请N段新的地址realloc:realloc是给一个已经分配了地址的指针重新分配空间free:通过指针释放内存c申请返回的是一个指针,而c+返回的是一个副本。C+中注意: 如果删除操作符被应用在基类中,并且其析构函数并不是虚函数,这将会引起内存泄露,因为只有基类的内存被释放掉。 基类的析构函数不是虚函数,将不能被作为基类而实现。 类的析构函数可以不是virtual 总结如下:1.C语言的malloc()和free()并不会调用析构函数和构造函数。C+的new和delete操作符是类意识,并且当调用new的时候会调用类的构造函数和当delete调用的时候会调用析构函数。2.c函数返回一个指针,c+返回一个副本3.C+虚析构函数中应当注意的4.C+自身的保护机制第四个问题已经讲过了。而用c怎么实现web页面。我答得是必须把它做一个clicklistener的监听器,就是一个对象。把web页面的每一个词

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论