我也来做外国网站购物,郑州七彩网站建设公司 评论,英语网站建设公司,厦门建设服务管理中心网站1.面向对象的特征 封装封装#xff0c;也就是把客观事物封装成抽象的类#xff0c;并且类可以把自己的数据和方法只让可信的类或者对象操作#xff0c;对不可信的进行信息隐藏。继承继承是指这样一种能力#xff1a;它可以使用现有类的所有功能#xff0c;并在无需重新编写…1.面向对象的特征 封装封装也就是把客观事物封装成抽象的类并且类可以把自己的数据和方法只让可信的类或者对象操作对不可信的进行信息隐藏。继承继承是指这样一种能力它可以使用现有类的所有功能并在无需重新编写原来的类的情况下对这些功能进行扩展。通过继承创建的新类称为“子类”或“派生类”被继承的类称为“基类”、“父类”或“超类”继承的过程就是从一般到特殊的过程要实现继承可以通过“继承”Inheritance和“组合”Composition来实现。在某些 OOP 语言中一个子类可以继承多个基类。但是一般情况下一个子类只能有一个基类要实现多重继承可以通过多级继承来实现。 继承概念的实现方式有三类实现继承、接口继承和可视继承。实现继承是指使用基类的属性和方法而无需额外编码的能力接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力可视继承是指子窗体类使用基窗体类的外观和实现代码的能力。在考虑使用继承时有一点需要注意那就是两个类之间的关系应该是“属于”关系。例如Employee 是一个人Manager 也是一个人因此这两个类都可以继承 Person 类。但是 Leg 类却不能继承 Person 类因为腿并不是一个人。抽象类仅定义将由子类创建的一般属性和方法创建抽象类时请使用关键字 Interface 而不是 Class。OO开发范式大致为划分对象→抽象类→将类组织成为层次化结构(继承和合成) →用类与实例进行设计和实现几个阶段。 多态多态性polymorphisn是允许你将父对象设置成为和一个或更多的他的子对象相等的技术赋值之后父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说就是一句话允许将子类类型的指针赋值给父类类型的指针。实现多态有二种方式覆盖重载。覆盖是指子类重新定义父类的虚函数的做法。重载是指允许存在多个同名函数而这些函数的参数表不同或许参数个数不同或许参数类型不同或许两者都不同。其实重载的概念并不属于“面向对象编程”重载的实现是编译器根据函数不同的参数表对同名函数的名称做修饰然后这些同名函数就成了不同的函数至少对于编译器来说是这样的。如有两个同名函数function func(p:integer):integer;和function func(p:string):integer;。那么编译器做过修饰后的函数名称可能是这样的int_func、str_func。对于这两个函数的调用在编译器间就已经确定了是静态的记住是静态。也就是说它们的地址在编译期就绑定了早绑定因此重载和多态无关真正和多态相关的是“覆盖”。当子类重新定义了父类的虚函数后父类指针根据赋给它的不同的子类指针动态记住是动态的调用属于子类的该函数这样的函数调用在编译期间是无法确定的调用的子类的虚函数的地址无法给出。因此这样的函数地址是在运行期绑定的晚邦定。结论就是重载只是一种语言特性与多态无关与面向对象也无关引用一句Bruce Eckel的话“不要犯傻如果它不是晚邦定它就不是多态。”封装可以隐藏实现细节使得代码模块化继承可以扩展已存在的代码模块类它们的目的都是为了——代码重用。而多态则是为了实现另一个目的——接口重用多态的作用就是为了类在继承和派生的时候保证使用“家谱”中任一类的实例的某一属性时的正确调用。 2.描述下编译阶段 源代码 (source code) → 预处理器 (preprocessor) → 编译器 (compiler) → 汇编程序 (assembler) → 目标代码 (object code) → 连接器 (Linker) → 可执行程序 (executables)  1词法分析 词法分析器根据词法规则识别出源程序中的各个记号token每个记号代表一类单词lexeme。源程序中常见的记号可以归为几大类关键字、标识符、字面量和特殊符号。词法分析器的输入是源程序输出是识别的记号流。词法分析器的任务是把源文件的字符流转换成记号流。本质上它查看连续的字符然后把它们识别为“单词”。  2 语法分析 语法分析器根据语法规则识别出记号流中的结构短语、句子并构造一棵能够正确反映该结构的语法树。  3 语义分析 语义分析器根据语义规则对语法树中的语法单元进行静态语义检查如果类型检查和转换等其目的在于保证语法正确的结构在语义上也是合法的。  4 中间代码生成(系统编译的方式) 中间代码生成器根据语义分析器的输出生成中间代码。中间代码可以有若干种形式它们的共同特征是与具体机器无关。最常用的一种中间代码是三地址码它的一种实现方式是四元式。三地址码的优点是便于阅读、便于优化。  5中间代码优化 优化是编译器的一个重要组成部分由于编译器将源程序翻译成中间代码的工作是机械的、按固定模式进行的因此生成的中间代码往往在时间和空间上有很大浪费。当需要生成高效目标代码时就必须进行优化。  6目标代码生成 目标代码生成是编译器的最后一个阶段。在生成目标代码时要考虑以下几个问题计算机的系统结构、指令系统、寄存器的分配以及内存的组织等。编译器生成的目标程序代码可以有多种形式汇编语言、可重定位二进制代码、内存形式。  7 符号表管理 符号表的作用是记录源程序中符号的必要信息并加以合理组织从而在编译器的各个阶段能对它们进行快速、准确的查找和操作。符号表中的某些内容甚至要保留到程序的运行阶段。  8 出错处理 用户编写的源程序中往往会有一些错误可分为静态错误和动态错误两类。所谓动态错误是指源程序中的逻辑错误它们发生在程序运行的时候也被称作动态语义错误如变量取值为零时作为除数数组元素引用时下标出界等。静态错误又可分为语法错误和静态语义错误。语法错误是指有关语言结构上的错误如单词拼写错、表达式中缺少操作数、begin和end不匹配等。静态语义错误是指分析源程序时可以发现的语言意义上的错误如加法的两个操作数中一个是整型变量名而另一个是数组名等。 3.线程与进程的区别 (1)地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间(2)资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源(3)线程是处理器调度的基本单位,但进程不是(4)二者均可并发执行。 4.堆和栈的区别 4.1申请方式 stack: 由系统自动分配。 例如声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间 heap: 需要程序员自己申请并指明大小在c中malloc函数 如p1  (char *)malloc(10); 在C中用new运算符 如p2  new char[10]; 但是注意p1、p2本身是在栈中的。 4.2 申请后系统的响应 栈只要栈的剩余空间大于所申请空间系统将为程序提供内存否则将报异常提示栈溢出。 堆首先应该知道操作系统有一个记录空闲内存地址的链表当系统收到程序的申请时会遍历该链表寻找第一个空间大于所申请空间的堆结点然后将该结点从空闲结点链表 中删除并将该结点的空间分配给程序另外对于大多数系统会在这块内存空间中的 首地址处记录本次分配的大小这样代码中的delete语句才能正确的释放本内存空间。 另外由于找到的堆结点的大小不一定正好等于申请的大小系统会自动的将多余的那部分重新放入空闲链表中。 4.3申请大小的限制 栈在Windows下,栈是向低地址扩展的数据结构是一块连续的内存的区域。这句话的意 思是栈顶的地址和栈的最大容量是系统预先规定好的在WINDOWS下栈的大小是2M也有 的说是1M总之是一个编译时就确定的常数如果申请的空间超过栈的剩余空间时将提示overflow。因此能从栈获得的空间较小。 堆堆是向高地址扩展的数据结构是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的自然是不连续的而链表的遍历方向是由低地址向高地址。堆的大小 受限于计算机系统中有效的虚拟内存。由此可见堆获得的空间比较灵活也比较大。4.4申请效率的比较 栈由系统自动分配速度较快。但程序员是无法控制的。 堆是由new分配的内存一般速度比较慢而且容易产生内存碎片,不过用起来最方便. 另外在WINDOWS下最好的方式是用VirtualAlloc分配内存他不是在堆也不是在栈是 直接在进程的地址空间中保留一块内存虽然用起来最不方便。但是速度快也最灵活。4.5堆和栈中的存储内容 栈 在函数调用时第一个进栈的是主函数中后的下一条指令函数调用语句的下一条可 执行语句的地址然后是函数的各个参数在大多数的C编译器中参数是由右往左入栈的然后是函数中的局部变量。注意静态变量是不入栈的。 当本次函数调用结束后局部变量先出栈然后是参数最后栈顶指针指向最开始存的地址也就是主函数中的下一条指令程序由该点继续运行。 堆一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容由程序员安排。 4.6存取效率的比较 char s1[]  aaaaaaaaaaaaaaa; char *s2  bbbbbbbbbbbbbbbbb; aaaaaaaaaaa是在运行时刻赋值的 而bbbbbbbbbbb是在编译时就确定的 但是在以后的存取中在栈上的数组比指针所指向的字符串(例如堆)快。 比如 #include void main() { char a  1; char c[]  1234567890; char *p 1234567890; a  c[1]; a  p[1]; return; } 对应的汇编代码 10: a  c[1]; 00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh] 0040106A 88 4D FC mov byte ptr [ebp-4],cl 11: a  p[1]; 0040106D 8B 55 EC mov edx,dword ptr [ebp-14h] 00401070 8A 42 01 mov al,byte ptr [edx1] 00401073 88 45 FC mov byte ptr [ebp-4],al 第一种在读取时直接就把字符串中的元素读到寄存器cl中而第二种则要先把指针值读到edx中再根据edx读取字符显然慢了。 5.并发和并行 并发和并行的区别就是一个处理器同时处理多个任务和多个处理器或者是多核的处理器同时处理多个不同的任务。前者是逻辑上的同时发生simultaneous而后者是物理上的同时发生。并发性(concurrency)又称共行性是指能处理多个同时性活动的能力并发事件之间不一定要同一时刻发生。并行(parallelism)是指同时发生的两个并发事件具有并发的含义而并发则不一定并行。  转载于:https://www.cnblogs.com/siliconvalley/archive/2013/06/06/3121321.html