实例介绍
计算机研究生复试问题,包含c++,计算机网络,操作系统等等,都是网上搜集来整理的。准备得充分一点复试的时候比较有底
BSS是Unⅸ链接器产生的未初始化数据段。其他的段分别是包含程序代码的"text 段和包含已初始化数据的data"段。BSS段的变量只有名称和大小却没有值。此名后来 被许多文件格式使用,包括PE。N以符号开始的块″指的是编译器处理未初始化数据的地 方。BSS节不包含任何数据,只是简单的维护开始和结束的地址,以便内存区能在运行 时被有效地清岺。BSS节在应用程序的二进制映象文件中并不存在 教据廒:数据段( data segment)通常是指用来存放程序中已初始化的全局变量的块内仔区域。数据段属于静 态内存分配。静态变量存放在data段中 代码段:代码段( code segment/ text segment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的 大小在程序运行前就已经确定,并且内存区域通常属于只读,某些架构也允许代码段为可写,即允许修改程序。在 代码段中,也有可能包含些只读的常数变量,例如字符串常量等。代码段是存放了程序代码的数据,假如机器 中有数个进程运行相同的一个程序,那么它们就可以使用同一个代码段。 堆(加eap):堆是用于存放进稈运行中被动态分配的内存段,它的人小并不固定,可动态扩张或缩减。当进稈调 用 malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时, 被释放的内存从堆中被剔除(堆被缩减) (stacκk栈乂称堆栈,是用户存放程序临时创建的局部变量,也就是说我们函数括弧"{}"中定义的变量(但 不包括 static声明的变量, static意味着在数据段中存放变量)。除此以外,在函数被调用时,其参数也会被压入 发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由于栈的先进先出特点,所以栈 特别方便用来保存/恢复调用现场。从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。 4、友元关系的利与弊 如果将个函数或个类声明为另个类的友元,那么它就可以直接存取这个类对象中的各种数据,而不必在 意这些数据的封装级别,即无论是 private的, protected的,还是 public的,有钱同使,有难同当。 关于友元利弊的分析:面向对象程序设计的一个基本原则是封装性和信息隐蔽,而友元却可以访问其他类中的私 有成员,不能不说这是对封装原则的一个小的破坏。但是它能有助于数据共享,能提高程序的效率,在使用友元时, 要注意到它的副作用,不要过多地使用友元,只有在使用它能使程序精炼,并能大大提高程序的效率时才用友元。 为什么有些操作符重载(<<,>>)必须要用友元函数而不能用成员函数? 如果是重载双目操作符(即为类的成员函数),就只要设置一个参数作为右侧运算量,而 左侧运算量就是对象本身。 而>>或<左侧运算量是cin或cout而不是对象本身,所以不满足后面一点。。。。c。 就只能申明为友元函数了。。 5、C++多态的实现 1.用 virtual关键字申明的函数叫做虚函数,虚涵数肯定是类的成员函数。 2.存在虚函数的类都有一个一维的虚函数表叫做虚表。类的对象有一个指向虚表开始的虚指针。虚表是和类对应的, 虚表指针是和对象对应的。 3.多态性是一个接口多种实现,是面向对象的核心。分为类的多态性和函数的多态性。 4.多态用函数来实现,结合动态绑定。 5.纯虚函数是虚函数再加上=0 6.抽象类是指包括至少一个纯虚函数的类。 http://blog.csdnnet/tujiaw/article/details/6753498 基类1的对 家所占内存 派牛类对象 所卢内存 派生类对自身 增加的部 构造函数顺序: 基类构造函数→派牛类构造数 前面输岀旳结果是因为绵译器在编译的时候,就口经确定了对象调用的函数的地址,要解决这个问题就要使用迟绑 定( 技术。当编译器使用迟绑定时,就会在运行时再去确定对象的类型以及正确的调用函数。而要 让编译器采用迟绑定,就要在基类中声明函数吋使用关键字(注意,这是必须的,很多学员就是因为没有使 用虚函数而写出很多错误的例子),这样的函数我们称为虚函数。一日某个函数在基类中声明为 ,那么在所有 的派生类中该函数都是 而不需要再显式地声明为 前面输出的结果是因为编详尜在编详的时候,就已经确定∫对象调用的函数的地址,要解决这个问题就要使用迟绑 定( )技术。当编译器使用迟绑定时,就会在运行时再去确定对象的类型以及正确的调用函数。而要让 编译器采用迟绑定,就要在基类中声明函数时使用关键字(注意,这是必须的,很多学员就是因为没有使用 虚函数而写出很多错误的例子),这样的函数我们称为虚函数。一旦某个函数在基类中声明为 ,那么在所有的 派生类中该函数都是 而不需要再显式地声明为 编译器在编译的时候,发现基类中有虚函数,此时编译器会为每个包含虚函数的类创建一个虚表(即),该 表是·个·维数组,在这个数组中存放每个虚函数的地址 基英的 vtable &animai: breath.eo annmal:breathed 继承的vte 基类和继手类的虚 & fish: breathe(l fish: breathed 表 那么如何定位虚表呢?编译器另外还为每个类的对象提供了一个虚表指针(即),这个指针指向了对象所属 类的表。在稈序运行时,根据对象的类型去初始化,从而让正确的指向所属类的虚表,从而在调用虚函 数时,就能够找到正确的函数。对于例的程序,由于实际指向的对象类型是,因此指向的类 的 ,当调用 时,根据虚表中的函数地址找到的就是类的 函数 那么虚表指针在什么时候,或者说在什么地方初始化呢? 答案是在构造函数中进行虚表的创建和虚表指针的初始化。还记得构造凶数的调用顺序吗,在构造子类对象 时,要先调用父类的构造函数,此时编译器只“看到了”父类,并不知道后面是否后还有继承者,它初始化父类对象 的虚表指针,该虚表指针指向父类的虚表。当执行子类的构造函数时,子类对象的虚表指针被初始化,指向自身的 虚表。对于例的程序来说,当类的对象构造完毕后,其内部的虚表指针也就被初始化为指向类的 虚表。在类型转换后,调用 由于实际指向的是类的对象,该对象内部的虚表指针指向的 是类的虚表,因此最终调用的是类的 凶数。 要注意:对于虚函数调用来说,每一个对象内部都有一个虚表指针,该虚表指针被初始化为本类的虚表。所以在程 序中,不管你的对象类型如何转换,但该对象内部的虚表指针是固定的,所以呢,才能实现动态的对象函数调用, 这就是多态性实现的原理。 6、SIL是什么?组成部分和核心作用 标准模板库(英文 ,缩写 ),是一个软件库,也是 标准程序库的一部分。其中包含个组件,分别为算法、容器、迭代器、函数、适配器。容器即物之所 属:算法是解决问题的方式;迭代器是对容器的访问逻辑的抽象,是连接算法和容器的纽带,通过添加 了一种间接层的方式实现了容器和算法之间的独立。本文从应用的角度对的方方面面进行了简单的 介绍。 模板是程序设计语言中的一个重要特征,而标准模板库正是基于此特征。标准模板库使得 编程语言在有了同 样强大的类库的同时,侏有了更大的可扩展性。 标准模板库于1994年2月年正式成为ANS/SOC++的一部份,它的岀现,促使C++程序员的思维方式更朝向泛型编 程( generic program)发展。 7、阐述C++在什么情况下必须进行运算符重载。 8、为什么说“继承是C++面向对象的一个主要特征之一”,请做一下简要说明。 9、请说明函数模板( Function Template)和函数模板实例化( unction-template specification)的区别和联 系 函数模板实例化 在函数模板为每个类型时首先调用中,编译器创建一个实例化。每个实例化是为该类型的该模板化功能的版本。在中,此函数为类 型时,使用此实例化将调用。如果您有几个相冋的实例化,即使在不同的模块,因此,只有该实例化的一个副本在可执行文件将结 果 凶数参数将所有参数的函数模板允许和参数,对该参数不依赖于模板参数的位置。 函数模板可以通过声明与特定类型的模板显式实例化作为参数 C++中提供了函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来 代表,这个通用函数就成为函数模板。使用模板的好处就是对于那些函数体相同的函数都可以用这个模板来代 替,而不必去定义每个具体的函数去实现。下面通过个简单的具体例了(比较两个数的大小)来说明: #include <iostream> using namespace std template< class t>∥模板声明,T为类型参数 TMax(Ta,Tb)/定义一个通用函数,用T作虚拟的类型名 if (a>b) return a: else return b 模板( )指程序设计语言中的函数模板与类别模板,大体对应于和#中的泛 型。目前,模板已经成为的泛型编程中不可缺少的一部分。 模板定义以关键字 开始,后接模板形参表,模板形参表是用尖括号括住的一个或者多个模 板形参的列表,形参之间以逗号分隔。模板形参可以是表示类型的类型形参,也可以是表示常量表达式 的非类型形参。非类型形参跟在类型说明符之后声明。类型形参跟在关键字 或 之后定 义 模板是程序员绝佳的武器特别是结合了多重继承( )与运算符重载 )之后 的标准库提供许多有用的函数人多结合了模板的观念,如以 及 模板实例化( )是指在编译或链接时生成函数模板或类模板的具体实例源代似。 定义了两种模板实例化方法:隐式实例化(当使用实例化的模板时自动地在当前代码单元之前捅入模 板的实例化代码)、显式实例化(直接声明模板实例化) 10、编译和链接的过程 C CPp+ 源代码 编译器← 汇編代码 编译过程4 L踊器← 其他目标代 库义仁 码 巨标代码 0 群接器 可执行程序 维库 源文件的编详过程包含两个主要阶段,而它们之间的转换是自动的。第一个阶段是顶处理阶段,在正式的编译 阶段之前进行。预处理阶段将根据已放置在文件中的预处理指令来修改源文件的内容。排 include指令就是一个预处 理指令,它把头文件的内容添加到cpp文件中还有其他许多预处理指令 这个在编泽之前修改源文件的方式提供了很大的灵活性,以适应不同的计算机和操作系统环境的限制。一个环 境需要的代码跟另一个环境所需的代码可能有所不同,因为可用的硬件或操作系统是不同的。在许多情况下,可以 把用」不同环境的代码放在同一个文件中,再在预处理阶段修改代码,使之适应当前的环境。 预处理器显示为一个独立的操作,但一般不能独立于编译器来执行这个操作。调用编译器会自动执行预处理过 程,之后才编译代码。 编译器为给定源文件输出的是机器码,执行这个过程需要较长时间。在对象文件之间并没有建立任何连接。对 应于某个源文件的对象文件包含在其他源文件中定义的函数引用或其他指定项的引用,而这些函数或项仍没有被解 析。同样,也没有建立同库函数的链接。实际上,这些函数的代码并不是文件的一部分。这些工作是由链接程序(有 时称为链接编辑器)完成的 链接程序把所有对象文件中的机器码组合在一起,并解析它们之间的交叉引用。它还集成了对象模块所使用的 库函数的代码。这是链接程序的一种简化表小,因为这里假定在可执行模块中,模块之间的所有链接都是静态建立 的。实际上有些链接是动态的,即这些链接是在程序执行时建立的。 链接程序静态地建立函数之间的链接,即仨程序执行之前建立组成程序的源文件中所包含的函数链接。动态建 立的函数之闩的链接(在程序执行过程中建立的链接)将函数编译并链接起来,创建另一种叫执行模块—一动态链接 库或大享库。动态链接库中的函数链接是在稈序调用函数时才建立的,在程序调用之前,该链接是不存在的。 动态链接库有几个重要的优点。一个主要的优点是动态链接库中的函数可以在几个并行执行的程序之间共享, 这将节省相同函数占用的内存空间。另一个优点是动态链接库在调用其中的函数之前是不会加载到内存中的。也就 是说,如果不使用给定动态链接库中的凶数,该动态链接库就不会占用内存空间 11、解释“优先级队列”这一抽象数据类型及实现方法 如果我们给每个元素都分配一个数字来标记其优先级,不妨设较小的数字具有较高的优先级,这样我们就可以 在一个集合中访问优先级最高的元素并对其进行査找和删除操作了。这样,我们就引入了优先级队列这种数据结 构 缺省情况下,优先级队列利用一个最大堆完成 函数列表: empty()如果优先队列为空,则返回真 pop()删除第一个元素 push)加入一个元素 sze()返回优先队列中拥有的元素的个数 top()返回优先队列中有最高优先级的元素 用途就不用多说了吧,例如 Huffman编码、分支限界、A*启发式都需要用到优先队列存放信息 12、逆波兰式用什么数据结构算法的效率比较高,为什么 逆波兰式就是后缀表达式!用栈结构来搞算法效率比较高。 下面以 为例子进行说明 的逆波兰式为,假设计算机把按从左到右的顺序压入栈中,并且按照選到运算符就把栈顶 两个元素出栈,执行运算,得到的结果再入栈的原则来进行处理,那么的执行结果如下 )入栈(位置) )入栈(位置) )遇到运算符“+",将和出栈,执行的操作,得到结果,再将入栈(位置) )入栈(位置) 遇到运算符“*”,将和出栈,执行的操作,得到结果,再将入栈(位置 经过以上运算,计算机就可以得到 的运算结果了。 逆波兰式除了可以实现上述类型的运算,它还可以派生岀许多新的算法,数据结构,这就需要灵活运用」。逆 波兰式只是一种序列体现形式 13、C和C++,C+和Java的区别 是一个结构化语言,如谭老爷子所说:它的重点在于算法和数据结构。程序的设计首要考虑的是如何通过一 个过程,对输入(或坏境糸件)进行运算处理得到输岀(或实现过程(事务)控制),而对于,首要考虑的 是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输 出或实现过稈(事务)控制 所以与的最大区别在于它们的用于解决问题的思想方法不一样。之所以说比更先进,是因为面向对 象设计这个概念凵经被融入到之中”,而就语言本身而言,在中更多的是算法的概念。那么是不是就 不重要了,错!算法是程序设计的基础,好的设计如果没有好的算法,一样不行。而且,C加上好的设计"也能写 出非常好的东西。 对语言本身而言,是的子集,那么是什么样的一个子集?从上文可以看出,实现了中过程化控制及 其它相关功能,而在中的(我称它为C+”),相对于原来的还有所加强,引入了重载、内联函数、异常 处理等等玩艺儿,更是拓展了面向对象设计的内容,如类、继承、虚函数、模板和包容器类等等。 再提高·点,在中,数据封装、类型这些东东已不是什么新鲜事了,需要考虑的是诸如:对象粒度的选择 对象接口的设计和继承、组合与继承的使用等等问题。 所以相对于 包含了更丰富的“设计”的概念,但是的一个自洽子集,也具有强大的功能,同样值得 学习。 C++ Java 指针 有 语言让编程者无法找到指针来 直接访问内存无指针,并且增添了自 动的内存管理功能,从而有效地防止 了/语言中指针操作失误,如 野指针所造成的系统崩溃 多重继承 支持多重继承,这是的一个 不支持多重继承,但允许一个类 特征,它允许多父类派生一个类。尽继承多个接口 管多重继承功能很强,但使用复杂, ,实现了多 而且会引起许多麻烦,编译程序实现|重继承的功能,又避免了中的多 它也很不容易。 重继承实现方式带来的诸多不便。 多重继承的问题,二义性:两个基类解决多重继承的问题:接口中没有实 都有同一个 方法,一个子类现,所以也就没有刚才的间题了 继承了两个基类,并同时 这个方法,那该听谁的? 全局变量 允许 不允许 结构体 自动内存管理 ne完了要显式dete掉 内存垃圾回收 操作符重载 支持 不支持 缺省函数参数( 支持 不支持(不过可以通过 override实现) 语句 支持(不提倡) 不支持(但是保留关键字) 类型转换 支持隐式转换 不支持隐式转换 14、什么是预处理 程序设计中的预处理( Preprocess’程序设计领域,预处珄是在程序源代码被编译之前,由预处理器( PrepσcesΩr) 对程序源代码进行的处理。这个过程并不对程序的源代码进行解析,但它把源代码分割或处理成为特定的符号用来 支持宏调用。 预处理器的主要作用就是把通过预处理的内建功能对一个资源进行等价替换,最常见 的预处理有:文件包含,条件编译、布局控制和宏替换种。 15、堆和栈的区別 栈区( stack)一由编译器自动分配释放,存放函数的参数值,局部变量的值等。其 操作方式类似于数据结构中的栈。 堆区(heap) 般由程序员分配释放,若程序员不释放,程序结束吋可能由OS回 收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵, 堆(英语 亦被称为:优先队列(英语: ),是计算机科学中一类特殊的数据结 构的统称。堆通常是一个可以被看做一棵树的数组对象。在队刎中,调度程序反复提取队刎中第一个作业 并运行,因而实际情况中某些时间较短的任务将等待很长时间才能结束,或者某些不短小,但具有重要性 的作业,同样应当具有优先权。堆即为解决此类问题设计的一种数据结构。 堆栈(英文: ),也可直接称栈。台湾作堆叠,在计算机科学中,是一种特殊的串行形式的 数据结构,它的特殊之处在于只能允许在链结串行或阵列的·端(称为堆栈顶端指标,英文为)进 行加入资料()和输出瓷料()的运算。另外堆栈也可以用一维阵列或连结串行的形式来完 成。堆栈的另外一个相对的操作方式称为伫列。 由于堆栈数据结构只允许在一端进行操作,因而按照后进先出( )的原理运 作 堆栈数据结构使用两种基本操作:推入()和弹出() 16、C,C++分别如何处理调用次数特别高的函数 宏( ),是一种批量批量处理的称 在计算机科学中,内联函数(有时称作在线函数或 编译时期展开函数)是一种编程语言结构,用来建 谓 议编译器对一些特殊函数进行内联扩展(有时称作 计算机科学里的宏是一种抽象 在线扩展):也就是说建议编译器将指定的函数体 它根据一系列预定义的规则替换一定的文本模 插入并取代每一处调用该函数的地方(上下文),从 式。解释器或编译器在遇到宏时会自动进行这 而节省了每次调用函数带来的额外吋间开支。但在 选择仗用内联函数时,必须在程序占用空间和程序 模式替换。对于编译语言,宏展开在编译时发 执行效率之间进行权衡,因为过多的比较复杂的函 生,进行宏展开的工具常称为宏展开器。宏这数进行内联扩展将带来很大的存储资源开支。另外 术语也常常被用于许多类似的环境中,它们是还需要非常注意的是对递归函数的内联扩展可能 源自宏展开的概念,这包括键盘宏和宏语言。绝带来部分编译器的无穷编译。 大多数情况下,“宏”这个词的使用暗示着将小命令 或动作转化为·系列指令 宏的用途在于自动化频繁使用的串行或者是 获得一种更强大的抽象能力——但这常常是一回 事 17、简述在面向对象程序设计中,引入继承和封装的主要作用 继承:代码重用 封装:代码安全 18、简述语言中指针及其作用 19、Java语言的多线程机制 20、简述四种常见的数据逻辑结构 ①集合集合中任何两个数据元素之间都没有逻辑关系,组织形式松散。 ②线性结构线性结构中的结点按逻辑关系依次排列形成一个"锁链″ ③树形结构树形结构具有分支、层次特性,其形态有点象自然界中的树。 ④图状结构图状结构中的结点按逻辑关系互相缠绕,任何两个结点都可以邻接 21、简述在一棵二叉排序树中査找一特定元素的算法过程 二叉排序树( )又称二叉査找树。它或者是一棵空树 或者是具有下列性质的二叉树: ()若左子树不空,则左子树上所有结点的值均小于它的根结点的值; ()若右了树不空,则右了树上所有结点的值均大于它的根结点的值; ()左、右子树也分别为二叉排序树 14 7 13 22、简述快速排序的基本思想,并说明其最不理想情形 分治法通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都 要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有 序序列。 在最坏的情况是,两子数列拥有大各为1和n-1,且调用树( call tree)变成为一个n个嵌套( nested) ∑(m-i)=0(m 调用的线性连串( chain)。第i次调用作了O(n-i)的工作量,且i=0 递归关系式为 T(=(+T(1)+T(n-1)=O()+T(n-1) 这与插入排序和选择排序有相同的关系式,以及它 被解为T(n)=0(n2)。它的最坏情况是很恐怖的,需要 ∑(n-i+1)= 2=D 空间,远比数列本身还多。 23、简述在一带权有向图中寻找关键路径的基木思想 关键路:关键路径是指网络终端元素的元素的序列,该序列具有最长的总工期并决定了整个项目的最短完成时 间。在网中,从始点到终点具有最大路径长度(该路径上的各个活动所持续的时间之和)的路径为关键路径 关键活动:关键路径上的活动称为关键活动。 只有所有关键活动提前完成,整个工程才能提前完成。 最早可能开始时间ve[:从原点到顶点ⅵ最长路径的长度(之前所有事情做完了才可能开始); 最迟允许开始时间v[i]:保证汇点Ⅵn-1在ve[n-1]时刻完成的前提下(整体工期不拖),事件ⅵ最迟 允许的开始时间。V[]= min Vi[k]dur(<Vk>)} 关键活动:松弛时间( slack time All]-Aek]==0的节点。 【实例截图】
【核心代码】
标签:
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论