软件工程复试——编程语言

C和C++

  • C语言面向过程,重点在于算法和数据结构。C程序的设计首先考虑的是如何通过一个过程,对输 入进行运算处理得到输出。
  • C++语言是面向对象语言,首先考虑的是如何构造一个对象模型,让这个模型能够契合与之对应 的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。 它在C的基 础上添加了面向对象、模板等现在程序设计语言的特性。拓展了面向对象设计的内容,如类、继 承、虚函数、模板和容器类等等,使之更加符合现代程序设计的需要。
  • C++是C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点 的基于对象的程序设计(泛型编程),还可以进行以继承和多态为特点的面向对象的程序设计 (面向对象编程),支持类、封装、继承、多态等特性。

面向对象中的类、封装、继承、多态

类:类定义了事物的属性和它可以做到的(它的行为)。一个类的方法和属性被称为“成员”。一个类所 包含的方法和数据描述一组对象的共同属性和行为。类是在对象之上的抽象,对象则是类的具体化,是 类的实例。

封装性:封装使数据和加工该数据的方法(函数)封装为一个整体,把对象的设计者和对象的使用者分 开,使用者不必知晓行为实现的细节,可以增加安全性。

继承性:继承性是子类共享父类之间数据和方法的机制。一个类直接继承其它类的全部描述,同时可修 改和扩充。可以增强代码的复用性。

多态性:对象根据所接收的消息而做出动作。同一消息为不同的对象接受时可产生完全不同的行动,这 种现象称为多态性。使具有不同内部结构的对象共享相同的外部接口。可以增加扩展性。

引用与值传递的区别?

  • 值传递传递的是一个值的副本,函数对形参的操作不会影响实参的值;
  • 引用传递传递的是引用对象 的内存地址,函数对形参的操作会影响实参的值,实参的值会随着形参的值得改变而改变。

指针与引用的区别?

(1)引用无需解引用,指针需要解引用;

(2)引用在定义时被初始化一次,之后不可变,指针可 变;

(3)引用不能为空,指针可以为空;

(4)程序为指针变量分配内存区域,而引用不需要分配内存 区域,所以指针自增操作是指针变量的自增,引用自增操作是变量值的自增。

类与结构体有什么区别?

(1)结构体存储在栈中,类的实例化可以存储在栈中,也可以存储在堆中;

(2)结构体的执行效 率比类要高;

(3)结构体没有析构函数,类有析构函数;

(4)结构体不可以继承,类可以继承。

堆与栈的区别

堆和栈是计算机内存中两种不同的数据存储方式,它们在内存管理、数据存储和访问等方面有着不同的特点和应用场景。

  • 分配方式:栈是由系统自动分配和管理的,内存的分配和释放是由编译器完成的,因此栈的内存管理比较简单。而堆是由程序员手动分配和管理的,因此堆的内存管理比较复杂。
  • 分配效率:栈的分配效率比堆高,因为栈的分配和释放都是由系统完成的,速度较快。而堆的分配和释放需要较多的时间,因为程序员需要手动分配和释放堆内存。
  • 存储内容:栈主要用于存储程序调用的函数参数、局部变量和返回地址等数据,它的大小是固定的。而堆主要用于存储程序动态分配的内存,它的大小是不固定的,可以根据程序的需要动态调整。
  • 内存地址:栈中的数据是按照“先进后出”的顺序存储的,存储的地址是连续的。而堆中的数据是按照程序的需要动态分配的,存储的地址是不连续的。
  • 分配方式:栈是一种后进先出(LIFO)的数据结构,每次分配内存时,栈顶地址会向下移动。而堆是一种没有固定规则的数据结构,内存分配和释放的顺序是不确定的。

总之,栈和堆都是计算机内存中的重要数据存储方式,它们各有优缺点,应根据程序的需要合理选择使用。

C++与Java的区别

JAVA是怎么分配内存的,跟c/c++有什么不同

Java中的内存分配是由垃圾回收器(Garbage Collector)负责的,垃圾回收器会自动管理内存的分配和回收,程序员无需手动管理内存。Java中的内存分配方式与C/C++有很大的不同,具体如下:

1. 对象的动态分配:在Java中,使用`new`运算符动态地分配对象,Java的垃圾回收器会自动回收不再使用的对象所占用的内存,而无需程序员显式地释放内存。在C/C++中,程序员需要手动地分配和释放内存,如果不释放内存,就会出现内存泄漏的问题。

2. 堆内存管理:在Java中,对象都是在堆上分配的,堆是一个动态分配的内存区域,由垃圾回收器负责管理。Java堆的大小是可以动态调整的,而且不需要程序员手动指定。在C/C++中,程序员需要手动管理堆内存,包括分配和释放,而且需要根据实际情况调整堆的大小,否则会出现内存溢出的问题。

3. 栈内存管理:在Java中,基本数据类型和对象的引用是在栈上分配的,栈的大小是固定的,由JVM在启动时指定。在C/C++中,函数的局部变量和函数调用的参数都是在栈上分配的,栈的大小是固定的,由编译器在编译时指定。

总之,Java的内存分配方式与C/C++有很大的不同,Java通过垃圾回收器实现自动内存管理,程序员无需手动管理内存;而C/C++需要程序员手动管理内存,包括分配和释放,否则会出现内存泄漏和内存溢出等问题。

解释一下全局变量

全局变量是定义在程序的所有函数之外,可以被程序中的所有函数所访问的变量。

在C/C++中,全局变量可以在任何函数之外定义,它的作用域从定义处开始,到文件末尾或者被另外一个源文件中的同名变量所覆盖为止。

在Java中,全局变量被称为静态变量或类变量,它们属于类而不是对象,可以被类中的所有方法所访问。

全局变量的好处是可以在程序中多个函数之间共享数据,而无需传递数据,从而简化了程序的编写。另外,全局变量的生命周期通常是整个程序的执行期间,因此它们可以存储程序中的常量或者配置信息,使得这些数据可以被程序的所有部分所共享。

但是,全局变量也存在一些问题。首先,全局变量容易引起命名冲突,尤其是在大型项目中。其次,全局变量的使用容易导致程序的耦合性增加,使得程序的维护和修改变得困难。

此外,全局变量的值可以在程序的任何地方被改变,这可能导致程序的不稳定性和错误。

因此,为了避免全局变量带来的问题,通常应该尽量使用局部变量和参数,避免使用全局变量。如果必须使用全局变量,应该注意给变量取一个有意义的名称,并将其作用域尽量限制在尽可能小的范围内。

局部变量

局部变量是定义在函数或代码块内部的变量,其作用域只限于所在的函数或代码块。在C/C++中,局部变量必须在函数的开头声明,而在Java中,局部变量可以在函数的任何位置声明,但必须在使用之前进行初始化。

局部变量的好处是它们只在需要时存在,节省了内存空间,避免了不必要的内存浪费。此外,局部变量的作用域被限制在函数或代码块内部,不会影响程序的其他部分,从而降低了程序的耦合性,使得程序更加易于维护和修改。

但是,局部变量也存在一些问题。首先,局部变量只能在所在的函数或代码块内部使用,如果需要在其他函数中访问同样的数据,就需要使用参数或全局变量。

数组和指针的区别

数组和指针是C和许多其他编程语言中的重要数据类型,虽然它们有些相似之处,但也有一些重要的区别:

1. 定义方式:数组是由一系列相同类型的元素组成的集合,可以通过下标来访问其中的元素。而指针是一个变量,存储着一个地址,它可以指向任何数据类型的变量。

2. 大小和内存分配:在定义数组时需要指定数组的大小,这样编译器就会为数组分配相应大小的内存空间。而指针变量的大小是固定的,通常是4个字节或8个字节(取决于机器的字长),它所指向的内存空间可以在运行时动态地分配和释放。

3. 访问方式:数组使用下标来访问其元素,而指针使用间接访问运算符“*”来访问所指向的内存单元的内容。

4. 类型检查:数组在定义时必须指定元素类型,而指针可以指向任何类型的变量,这也使得指针的类型检查更加困难。

5. 作为函数参数:当数组作为函数参数时,它会被自动转换为指向第一个元素的指针。而指针作为函数参数时,可以通过传递指针的地址来实现指针本身的修改。

需要注意的是,数组和指针在某些情况下也会存在一些模糊的交叉使用。例如,在数组名的前面加上“&”运算符可以获取指向整个数组的指针,而数组指针也可以被用作数组下标来访问数组元素。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值