计算机保研复习-C++和JAVA
C++和JAVA
首先应该清楚,Java 是由 C++发展而来的,保留了 C++的大部分内容。但 Java 的句法更清晰、规模更小、更易学。
1. 解释对编译
Java是一种解释性语言,其在执行时会被“翻译”为二进制形式,也就是jvm去解释它。而C++则是编译语言,意味着程序只能在特定操作系统上编译并在特定系统上运行,也就是说C++一步到位成机器语言的。
2. 指针
Java 没有指针的概念。在 C/C++中,指针操作内存时,经常会出现错误。而在Java中是没有指针这一概念的,因此也有效地防止了一系列由指针引起的操作层失误(如指针悬空所造成的系统崩溃),更有利于 Java 程序的安全。
3. 内存安全
Java是一种内存安全型语言,意味着大家可以为给定数组分配任意参数,即使超出范围也只会返回错误提示。C++更为灵活,但代价是一旦分配的参数超出资源范围,则会引起错误甚至严重崩溃。
4. 多重继承
Java不支持多重继承。多重继承,它允许多父类派生一个子类。也就是说,一个类允许继承多个父类。尽管多重继承功能很强,但使用复杂,而且会引起许多麻烦,编译程序实现它也很不容易。所以 Java不支持多重继承,但允许一个类实现多个接口。可见,Java 既保留了 C++多重继承的功能,又避免了C++的许多缺陷。
5. 数据类型
Java 是完全面向对象的语言,所有方法和数据都必须是类的一部分。除了基本数据类型之外,其余类型的数据都作为对象型数据。例如,对象型数据包括字符串和数组。类将数据和方法结合起来,把它们封装在其中,这样每个对象都可实现具有自己特点的行为。
而 C++将函数和变量定义为全局的,然后再来调用这些函数和变量,从而增加了程序的负担。此外,Java 还取消了 C/C++中的结构和联合,使编译程序更加简洁。
6. 自动内存管理
Java 自动进行无用内存回收操作,不再需要程序员进行手动删除。Java 程序中所有的对象都是用 new操作符建立在堆栈上的,这个操作符类似于 C++的“new”操作符。当 Java 中一个对象不再被用到时,无须使用内存回收器,只需要给它添加删除标签,无用内存的回收器便利用空闲时间在后台运行。而C++中必须由程序释放内存资源,这就增加了程序员的负担。
7. 操作符重载
Java 不支持操作符重载,操作符重载被认为是 C++的突出特征。操作符重载,就是把操作符(比如'+,-,,/'这些运算符)赋于新的意义, 来完成更为细致具体的运算等功能。操作符重载还是比较繁琐的。Java语言是走“简洁风”的,因此为了保持Java语言的简洁性,便毅然抛弃了操作符重载这一功能,但是为了避免舍本逐末的情况,Java语言还是可以通过类*来实现操作符重载所具有的功能的。
8. 类型转换
在 C 和 C++中,有时会出现数据类型的隐含转换,这就涉及了自动强制类型转换问题。例如,在 C++中可将一个浮点值赋予整型变量,并去掉其尾数。Java 不支持 C++中的自动强制类型转换,如果需要,必须由程序显式进行强制类型转换。
9. 程序的编译执行过程
- 第一步,预处理. 这一步处理 头文件、条件编译指令和宏定义。
- 第二步,编译. 将第一步产生的文件连同其他源文件一起编译成汇编代码。
- 第三步,汇编。将第二步产生的汇编源码转换为 object file.
- 第四步,链接. 将第三步产生的一些object file 链接成一个可执行的文件。
10. 指针和引用的区别
- 引用必须被初始化,但是不分配存储空间;指针不声明时初始化,在初始化的时候需要分配存储空间。
- 引用初始化后不能被改变,指针可以改变所指的对象。
- 不存在指向空值的引用,但是存在指向空值的指针。
- 指针可以多级访问,即指针的访问目标可以是指针,比如二维数组;而引用不能多级引用。
MVC模式
使用MVC模式有很多优势,例如:简化后期对项目的修改、扩展等维护操作;使项目的某一部分变得可以重复利用;使项目的结构更直观
视图(View):负责界面的显示,以及与用户的交互功能,例如表单、网页等。
控制器(Controller):可以理解为一个分发器,用来决定对于视图发来的请求,需要用哪一个模型来处理,以及处理完后需要跳回到哪一个视图。即用来连接视图和模型。
模型(Model):模型持有所有的数据、状态和程序逻辑。模型接受视图数据的请求,并返回最终的处理结果。
在MVC模式中,视图View可以用JSP/HTML/CSS实现,模型Model可以用JavaBean实现,而控制器Control就可以用Servlet来实现。
设计模式
工厂模式:spring IOC就是使用了工厂模式,对象的创建都交给一个工厂去创建。
单例模式:只有一个实例
黑盒测试与白盒测试
- 黑盒测试又称为功能测试,主要检测软件的每一个功能是否能够正常使用。在测试过程中,将程序看成不能打开的黑盒子,不考虑程序内部结构和特性的基础上通过程序接口进行测试,检查程序功能是否按照设计需求以及说明书的规定能够正常打开使用。
- 白盒测试也称为结构测试,主要用于检测软件编码过程中的错误。程序员的编程经验、对编程软件的掌握程度、工作状态等因素都会影响到编程质量,导致代码错误。
冯诺依曼体系结构
是一种将程序指令存储器和数据存储器合并在一起的存储器结构。程序指令存储地址和数据存储地址指向同一个存储器的不同物理位置,因此程序指令和数据的宽度相同,提出了计算机制造的三个基本原则,即采用二进制逻辑、程序存储执行以及计算机由五个部分组成(运算器、控制器、存储器、输入设备、输出设备)
- 单处理机结构,机器以运算器为中心;
- 采用程序存储思想;
- 指令和数据一样可以参与运算;
- 数据以二进制表示;
- 将软件和硬件完全分离;
- 指令由操作码和操作数组成;
- 指令顺序执行。
软件开发方法
结构化法:
即面向过程的开发方法。其基本思想是“自上而下,逐步求精”,把一个复杂的系统拆分,化繁为简,形成一个个的构件。其讲究的是用户至上,系统开发过程工程化、文档化、以及标准化。严格的区分来工作阶段,每个阶段都有明确的任务和应得额成果。
面向对象方法:
面向对象的开发方法是自底而上的,主要表现为和现实事物结合起来,把世间万物抽象出来,形成一个个的抽象对象。相比结构化法有更好的复用性,分析、设计、实现三个阶段界限不明确,其关键点在于建立一个全面的、合理的、统一的模型。
面向服务方法
原型法: 其适用于需求不明确的场景,包括抛弃型原型和演变型原型。快速开发模型
软件开发模型
瀑布模型:
瀑布模型也称之为生命周期法,是结构方法中最常用的开发模型,其讲究的是从需求获取到开发到测试像瀑布样顺流而下。
缺点是不灵活比较死板,其适用于需求明确或二次开发的场景下使用。
增量与螺旋模型:增量模型采用随时间的线性序列,每一个线性序列产生一个可交付的产品,慢慢的迭代以达到最终的要求。
V模型:V模型是以测试驱动的模型,测试贯穿的整个始终。
喷泉模型:
喷泉模型主要支持面向对象的开发方法,系统某部分常常重复工作多次,相关功能在每次迭代中完善,其主要体现了迭代和无间隙性特征。所谓无间隙指的是在开发活动中,分析、设计、和编码没有明确的界限。
统一过程(UP/RUP)
是基于构件的。统一过程是一个通用的过程框架,可以用于各种各样的软件项目。
特点:用例驱动、以基本架构为中心、迭代和增量。
初始,细化,构建,交互阶段
敏捷开发
适用于中小型项目,理论上是不适用大型项目。但是在实际开发中,往往我们会把大型项目拆分为多个小型项目,然后使用敏捷开发方法。
极限编程(XP):是所有敏捷型方法中最引人瞩目的方法,提出了四大价值观、五大原则、12大最佳实践。在对一些费用控制很严格的公司最为适用。
自适应方法
水晶法
逆项工程
逆向工程讲的是把整个过程逆转过来,一般的用在已有系统的大版本迭代以及重做场景中。
C和C++
C 编程语言不支持面向对象编程。作为一种面向对象的语言,C++ 支持多态性和继承。
由于 C 语言不允许封装,数据变得可访问,其他实体可以破坏它。然而,C++ 支持封装,可以保护数据结构并根据需要使用它。
C 编程语言鼓励自顶向下的方法,首先定义一个通用问题,然后将其分解为较小的任务。另一方面,C++ 鼓励自底向上的方法。这涉及首先识别和定义类,然后使用它们执行最初的任务。
I/O:cin » cout
方法覆盖允许子类重新定义从其祖先继承的函数。重载允许同一个函数有多个版本,每个版本具有唯一的参数。C 不支持这两者,但 C++ 支持。
C编程依赖于两个关键函数——calloc()和malloc()——用于内存分配。相应的free()函数用于内存释放。C++使用new运算符进行动态内存分配,使用delete运算符进行释放。
堆和栈的区别
分配方式:堆程序员手动分配和释放内存,栈编译器自动分配和释放
管理方式:堆是程序员管理负责申请追踪的,不需要显示释放内存,栈内存由编译器自动处理
存储特点:堆内存的分配是无序的,生存周期由程序员控制。栈内存分配时有序的,生存周期和函数的调用和返回有关
内存中堆和栈的区别
堆区是用于分配程序员申请的内存空间
堆是在程序执行的过程中动态分配的,它最大的特性就是动态性。堆就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
栈是由系统自动分配和回收的内存
就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。
问题
插值和拟合的区别
一个编译好的程序的地址是什么地址(逻辑地址)
业界有名的计算机视觉的书
- 《计算机视觉:算法与应用》
- 《OpenCV3》
解释什么是边缘概率密度?在多维概率分布中,对某个或某些变量进行积分或求和后得到的单个变量的概率密度函数
操作系统中的页表是干啥用的
每个进程都有自己的虚拟内存空间,当运行一个进程的时候,cpu是先看到进程的虚拟内存上的数据,然后在通过页表的映射关系找到物理内存中代码和数据,而页表就是将虚拟地址和物理地址建立起映射关系。
- 感谢你赐予我前进的力量