1)NUL用于结束一个ACSII字符串;NULL用于表示什么也不指向的空指针。
2)break语句事实上跳出的是最近的那层循环语句或者switch语句。
3)广义地说,软件是指系统中的程序以及开发,使用程序所需要的所有文档的集合。
4)软件开发过程分为五个阶段:分析、设计、编码、测试、维护。
5)软件设计思路和方法的一般过程:
设计软件的功能和实现的算法和方法,
软件的总体结构设计和模块设计,
编程和调试,
程序联调和测试以及编写,
提交程序。
6)设计流程:
向相关系统分析员和用户了解初步需求,然后列出要开发系统的大体功能模块,每个大功能模块有哪些小功能模块,对于有些需求比较明确相关的界面,初步定义好少量的界面;
深入了解和分析用户需求,做出文档系统功能需求文档,清楚描述大致的模块以及界面功能;
再次确认需求;
采用迭代方式,根据需求实现系统的概要设计;
系统分析员将概要设计文档交予程序员,编写程序代码;
测试系统,交付用户使用,由用户确认各项功能,完成验收。
7)基本测试流程:拟定测试计划=>编制测试大纲=>根据测试大纲设计和生成测试用例=>实施测试=>生成测试报告。
8)软件测试方法:
人工测试(代码审查——个人复查、抽查、会审);
机器测试(黑盒测试——功能测试;白盒测试——结构测试)。
9)目前常用的调试方法:试探法、回溯法、对分查找法、归纳法、演绎法。
10)测试的目的在于希望以最少的人力和时间发现潜在的各种错误和缺陷。
11)软件测试步骤:
单元测试(模块接口、局部数据结构、重要的执行路径、出错处理、边界条件);
组装测试/集成测试(非增量式集成——先单独,再整体;增量式集成——逐个加入组合);
确认测试(有效性测试、软件配置审查、验收测试);
系统测试(恢复测试、安全性测试、强度测试、性能测试、可靠性测试、安装测试);
12)一份完整的系统分析报告应该包括的内容:
组织情况概述;
现行系统概述;
系统逻辑模型;
新系统在各个业务处理环节拟采用的管理方法、算法或模型;
与新的系统相配套的管理制度和运行体制的建立;
系统设计与实施的初步计划;
用户方负责人审批意见。
13)面向对象(OO,Object-Oriented)=对象+分类+继承+通过消息的通信
14)对象是基本的运行时的实体,既包括数据(属性),也包括作用于数据的操作(行为)。
15)一个对象通常可由对象名、属性和操作组成。
16)消息:对象间进行通信的一种构造。
17)一个类定义了一组大体上相似的对象,一个类所包含的方法和数据描述一组对象的共同行为和属性。
18)类是在对象之上的抽象;对象是类的具体化,是类的实例。
19)继承:父类和子类之间共享数据和方法的机制。
20)多态:不同的对象收到同一个消息可以产生完全不同的结果。
21)绑定:把过程调用和响应调用所需要执行的代码加以结合的过程。
22)对象之间通过消息传递方式进行通信。
23)Java不支持参数多态。
24)类库是一种预先定义的程序库,可以由开发人员自己扩充。
25)面向对象分析(OOA)包含5个活动:认定对象、组织对象、描述对象间的相互作用、定义对象的操作、定义对象的内部信息。
26)面向对象设计(OOD)的含义是设计分析模型和实现相应的源代码,在目标代码环境中这种源代码可以被执行。
27)程序调试步骤是从最底层开始,从单元测试、综合测试到系统测试。
28)OMT(对象建模技术)定义了3种模型:对象模型、动态模型、功能模型。
29)OMT方法的4个步骤:分析、系统设计、对象设计、实现。
30)C++中struct和class的区别:
默认继承权限不同,class默认为private,struct默认public;
成员的默认访问权限不同,class默认为private,struct默认为public;
class是面向对象的,可以封装各种函数,而且有自己的构造和析构函数,它是struct类型的自然延伸;
struct是建立用于声明变量的一种新的数据结构,编译器不为struct定义保留内存空间,但却为class分配。
31)Error和Exception都继承自Throwable,区别在于:
Errors(背离公认代码行为的操作或者实例)总是“不可控制的”,经常用来表示系统错误或低层资源错误,应该尽可能在系统级被捕捉;
Exceptions(在程序执行过程中发生的中断指令正确流程的事件)可以是“可被控制的”或“不可控制的”,表示一个由程序员导致的错误,应该在应用程序级被处理。
32)Error属于编译时错误,根本不会编译通过,不会生成.class文件;
Exception属于运行时错误,只有在调用时才会报错,比如空指针或者数组下标越界等。
33)软件测试用例常用设计方法包括:等价类划分、边界值分析法、因果图法、判定表驱动测试、正交实验设计法、功能图法、流程分析法、状态迁移法、界面覆盖法、逐级细分法、错误差测法等。
34)int *const p,定义了一个指针常量,p不能重新赋值指向另一个新地址;
int const *p,定义了一个常量指针,指针的内容不可变;
int const* const p,定义了一个指向常量的指针常量,指针的内容和指向地址皆不可变。
35)开放式系统互连参考模型OSI/RM
注1:简称OSI参考模型,是计算机网路结构发展的产物,为实现开放系统互连所建立的通信功能分层模型。其目的是为异种计算机互连提供一个共同的基础和标准框架,并为保持相关标准的一致性和兼容性提供共同的参考。它从低到高分别是:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
36)Debug和Release编译方式的本质区别:
Debug通常称为调试版本,包含有调试信息,并且不做任何优化,便于程序员调试代码;
Release称为发布版本,往往经过各种优化,使得程序在代码大小和运行速度上均为最优,以便于用户使用。
37)死锁的4个必要条件:互斥条件、不可剥夺条件、部分分配、循环等待。
38)“copy constructor”在对象创建时调用,这时没有资源需要释放;
“assignment operator”在资源创建完成后调用,这时从别的对象拷贝资源时有可能需要先释放自身已有的资源。
39)“serialization”序列化,将对象状态转换为可以保持或传输的格式的过程。Serialization是.NET中一种实现对象持久性的机制,它是一个将对象中的数据转换成一个单一元素的过程。
40)Reflection是JAVA程序开发语言的特性之一,它允许运行中的JAVA程序对自身进行检查,或者说“自审”,并能够直接操作程序的内部属性。
41)Switch语句中,JAVA只对byte、char、short、int,需要break跳出,不然会依次执行,而C#则可对enum、string等类型。
42)面向过程是围绕功能进行的,用一个函数实现一个功能,使用时依次调用相应的功能函数;
面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述某个事物在解决整个问题的步骤中的行为。
43)垃圾收集器的工作目标是回收已经无用的对象的内存空间,从而避免产生内存泄漏,节省内存资源,避免程序代码的崩溃。
注1:常用的内存泄露检测工具有Memory Analyzer Tool、Heap Snap Shot、Heap Viewer。
44)覆盖:在基类中定义了一个非虚函数,然后在派生类中又定义了一个同名同参数同返回类型的函数。
在派生类对象上直接调用这个函数名,只会调用派生类中的那个。
45)重载:在基类中定义了一个非虚函数,然后在派生类中定义一个同名,但具有不同参数表的函数。
在派生类对象上调用时,用不同的参数会调用到不同的函数,有可能会直接调用到基类中的那个。
46)多态:在基类中定义了一个虚函数,然后在派生类中定义了一个同名同参数表的函数。
多态采用动态绑定技术,即通过一个基类的指针来操作对象,如果对象是基类对象,则调用基类中的那个函数,如果是派生类对象,则调用派生类中的那个。
调用哪个函数不是由函数的参数表决定,而是由函数的实际类型决定。
47)重载时也可以不涉及到基类,只要在类定义中同时给出两个方法的定义即可。
48)OS执行的管理功能:进程管理、内存管理、设备管理、文件管理。
49)new动态分配内存空间,delete释放分配的内存空间,两者配对使用,以防止内存泄漏(申请分配到的内存空间无法释放,一直处于占用状态)。
50)JAVA中的String对象是不变对象,连接、取子串等操作会生成新的对象,旧对象可能被回收;
StringBuffer则是可变对象,上述操作将在原对象上进行。
51)JAVA中,“==”用于比较两个对象的引用(内存地址)是否相等;
equals用于比较两个对象的值(内存地址存放的内容)是否相等。
52)C语言是结构化和模块化的语言,是面向过程的。
53)C++对C的增强:在原来面向过程的机制基础上,对C语言的功能加以扩充;增加了面向对象机制。
54)C语言中对文件的存取是以字节为单位的,对一个C文件的输入和输出是一个字节流。
55)C语言中,函数的参数传递包括:将变量名作为实参;传递变量的指针。
C++则增加了传递引用。“引用”是C++的一种新变量类型,用于为变量定义一个别名,&是引用声明符。
56)当&a前面有类型符时(如int &a),它必然是对引用的声明;否则是取变量的地址。
57)C语言中利用库函数malloc和free分配和释放内存空间,调用形式为:malloc(size)和free(),size是字节数。
C++中扩充了两个运算符new和delete,使用格式为:new 类型[初值]和delete [] 指针变量。
58)一个对象应该包括两个要素:数据和需要进行的操作。对象就是包含数据以及这些数据相关操作的集合。
59)面向对象程序设计方法(OOP)的一个重要特点就是“封装性”,把数据和操作代码封装在一个对象中。程序设计者的任务包括两个方面:一是设计对象,即决定把哪些数据和操作封装在一起;二是在此基础上怎样通知有关对象完成所需的任务。
60)类是用来定义对象的一种抽象数据类型,或者说它是产生对象的模板。它的性质和其它数据类型相同。
一般将成员函数作为对外界的接口,类的成员包括private(外界无法调用)和public(外界可以调用)。
类中的成员函数称为方法,是对数据的操作,一个方法对应于一个操作,外界通过发送消息来激活相应的方法。
所谓“消息”其实是一个由程序语句来实现的命令。
61)用union声明的类,如果不做private或者public声明,系统将其成员默认为public,且无法改变。
62)构造函数不需要用户发送消息来激活,而是在建立对象时自动执行,只能执行一次,其可以重载。
63)析构函数不能带任何参数,也没有返回值(包括void类型),只能有一个析构函数,且不能重载。
64)封装:把数据值和相关函数打包到一个对象中。
65)数据隐藏:在一般情况下,不允许访问对象的数据值。
66)在类声明外部定义函数,必须指定类名。函数首行的形式为:函数类型 类名::函数名(形参列表)。
67)内联函数采用空间换取时间的思路,在编译时将所调用的函数代码嵌入到主调函数中。
宏替换是在编译前由预处理程序进行预处理,只做简单的字符替换,而不做语法检查。
而内联函数是在编译时处理的,编译程序能够识别内联函数,并进行语法检查。
使用内联函数可以节省运行时间,但会增加目标程序的长度。
68)C++中,继承是在一个已存在的类的基础上建立一个新的类。
派生类继承了基类的所有数据成员和成员函数,并可以增加新的成员。
69)由protected声明的成员为保护成员,其不能被外界引用,但可以被派生类成员函数引用。
70)如果想在派生类中引用基类的成员,可以将基类的成员声明为protected。
71)基类的保护成员对类的外界不可引用,但是对于派生类等同于私有成员,可以通过成员函数引用。
72)基类的构造函数是不能继承的,在建立派生类的对象时,系统只执行派生类的构造函数,而不会自动执行基类的构造函数,以致于基类的变量未能初始化。
73)在建立一个对象时,先调用基类的构造函数,再执行派生类的构造函数。
在派生类对象消失时,先执行派生类析构函数,再执行其基类的析构函数。
74)数组名代表数组首地址,它的值是不能改变的。