国企笔试计算机类基础问题由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“计算机基础知识笔试题”。
计算机类面试专业问题 2007-12-11 00:011、java
因为我投的职位主要是java相关的,所以这方面积累的经验比较多一下。这部分考
查的重点主要有:java基本语法,多线程,异常处理,抽象类,匿名类,接口,MVC架构,设计模式,Servlet,Struts,Spring,J2EE。以下是我遇见过的面试问题: 1)transient和volatile是java关键字吗?(瞬联)2)抽象类和接口有什么区别?(瞬联)3)能说一下java的反射机制吗?(瞬联)4)在java中怎样实现多线程?(瞬联)
5)你用过哪种设计模式?(瞬联,IBM,aspenTech)6)请说一下MVC架构(瞬联,IBM,aspenTech)
7)如果类a继承类b,实现接口c,而类b和接口c中定义了同名变量,请问会出现什么问题?(瞬联)
8)请说一下java中为什么要引入内部类?还有匿名内部类?(瞬联,IBM)9)请说一下final,finally和finalize的区别?(瞬联)10)请说一下HTTP请示的基本过程(IBM)
11)java中存在内存泄漏问题吗?请举例说明?(IBM)
12)请说一下java中的内存回收机制所采用的算法(IBM,瞬联)
13)请说一下System.gc()函数的作用。什么什么时候可以调用垃圾回收器?(瞬联)
14)你做过的项目中采用了什么安全认证机制?(IBM)15)Math.round()什么作用?
2、C
C语言考查的重点一般是:指针、结构体、条件编译、全局变量/局部变量。以下是 我遇见过的面试问题:
1)请说一下extern C的作用(汉略)2)请说一下#ifdef...的作用(汉略)
3)C语言里,哪些变量是存放在堆里,哪些是存放在栈里?(普天)4)C语言里的static关键词是什么含义?(普天)5)进程和线程有什么区别?(普天)
3、C++
C++语言考查的重点主要有:多继承,抽象类,虚函数,拷贝构造函数,析构函数,动态联编,多态,const,static。以下是我面试中遇到的问题: 1)你听说过拷贝构造函数吗?能具体说一下它的作用吗?(汉略)2)析构函数必须是虚函数吗?为什么?(汉略)3)你听说过钻石结构吗?请具体说一下(aspenTech)
4)什么是深拷贝?什么是浅拷贝?他们有什么区别?(aspenTech)5)什么是虚函数,什么是纯虚函数?为什么引入虚函数和纯虚函数?(汉略,aspenTe ch,普天)
6)请说一下面向对象的基本特性。(aspenTech)
7)C++中的const关键定代表什么含义?跟C语言中的const有什么区别?(aspenTech)8)C++中的static关键定代表什么含义?跟C语言、Java中的static有什么区别?(普天)
4、数据结构
这是面试中几乎必考的部分。考查的重点有:链表,二叉树前序、中序、后序遍历
(递归,非递归),二叉树结点、层次的计算,树转二叉树,各种排序算法(冒泡排序,快速排序,堆排序是重点)。以下是我在面试中遇到过的问题: 1)请编写程序,将一个链表倒置。(联发)2)请编写二叉树的中序遍历非递归算法。(新华社)3)请编写一个程序,实现将树转化成二叉树。(华为)
4)一棵满二叉树有x个结点,请问整棵二叉树有多少结点?(新华社,中国信保)
5)请编程实现一个堆排序算法/快速排序算法。(汉略)
5、数据库
这也是面试重点内容。主要考查点有:范式,1、2、3范式,事务,内连接,外连接,关系代数,数据库设计。以下是我遇到过的面试问题:
1)什么是范式、1范式、2范式、3范式?(百度,中航信,新华社,中国信保)2)事务具有哪些特性?(中航信)
3)请说说什么是外连接、左外连接、右外连接?(aspenTech)4)请说说关系代表中的几种基本运算?(中航信)
5)请对一个论坛进行数据库设计,并说说你设计的数据库满足哪个范式(百度)6)给你一个数据库需求,请对数据库进行设计,并根据要求写出查询语句(中国信保)
6、网络
这也是常考的部分。主要考查点有:OSI参考模型,TCP/IP参考模型。以下是我遇到
过的具体面试问题:
1)请解释一下OSI参考模型。(中国信保)2)请解释一下TCP/IP参考模型。(中国信保)
3)为什么现在的网络最后采用了TCP/IP参考模型而没用OSI参考模型?(中国信保)Java 1)transient和volatile是java关键字吗
不常用到的关键字有:const,goto,native,strictfp,transient,volatile。
const和goto为java中的保留字。
1.native
native是方法修饰符。Native方法是由另外一种语言(如c/c++,FORTRAN,汇编)实现的本地方法。因为在外部实现了方法,所以在java代码中,就不需要声明了,有点类似于借口方法。Native可以和其他一些修饰符连用,但是abstract方法和Interface方法不能用native来修饰。
Example:代码
public interface TestInterface {
void doMethod();
}
public cla Test implements TestInterface {
public native void doMethod();
private native int doMethodB();
public native synchronized String doMethodC();
static native void doMethodD();
}
render_code();
为什么需要使用native method?请参考:
http://</form-error-page>
</form-login-config>
</login-config>
登录表单必须包含输入用户姓名和口令的字段,它们必须被分别命名为j_username和j_paword,表单将这二个值发送给j_security_check逻辑名字。
下面是一个该表单如何在HTML网页中实现的例子:
<form method=“POST” action=“j_security_check”>
<input type=“text” name=“j_username”>
<input type=“paword” name=“j_paword”>
</form>
除非所有的连接都是在SSL上实现的,该表单能够透露用户名和口令。当受保护的Web资源被访问时,Web容器就会激活为该资源配置的认证机制。
为了实现Web应用程序的安全,Web容器执行下面的步骤:
1、在受保护的Web资源被访问时,判断用户是否被认证。
2、如果用户没有得到认证,则通过重定向到部署描述符中定义的注册页面,要求用户提供安全信任状。
3、根据为该容器配置的安全领域,确认用户的信任状有效。
4、判断得到认证的用户是否被授权访问部署描述符(web.xml)中定义的Web资源。
象基本的安全认证机制那样,在Web应用程序的部署描述符中,基于表单的认证不指定安全区域。也就是说,它不明确地定义用来认证用户的安全区域类型,这就会在它使用什么样的安全区域认证用户方面引起混淆。
要对用户进行验证,Web窗口需要完成下面的步骤:
1、判断该容器配置的安全区域。
2、使用该安全区域进行认证。
由于数据库和LDAP在维护信息方面提供了更大的灵活性,因此大多数组织都会希望继续使用它们维护安全认证和授权信息。
许多Web窗口都支持不同类型的安全区域:数据库、LDAP和定制区域。例如,在Tomcat Web容器中,server.xml将数据库配置为其安全区域。
<Realm
claName=“org.apache.catalina.realm.JDBCRealm”
debug=“99”
driverName=“oracle.jdbc.driver.OracleDriver”
connectionURL=“jdbc:oracle:thin:@::”
connectionName=“{DB Username}”
connectionPaword=“”
userTable=“users”
userNameCol=“username”
userCredCol=“paword”
userRoleTable=“user_roles”
roleNameCol=“rolename”
/>
Tomcat的server.xml的<Realm>标志定义了窗口用来识别一个用户的安全区域的类型。注意,容器对Web应用程序使用该区域,应用程序的认证机制是基于表单的。
授权
一旦用户被识别后,容器就会得到认证用户的安全角色,看用户是否属于在部署描述符中的<auth-constraint>标志中定义的安全角色之一。如果用户不属于任何一个安全角色,则容器会返回一个错误。
部署描述符(web.xml)的<security-constraint>标志定义了被保护的Web资源和能够访问这些资源的安全角色清单。
<security-constraint>
<web-resource-collection>
<web-resource-name>AdminPages</web-resource-name>
<description> acceible by authorised users </description>
<url-pattern>/admin/*</url-pattern>
<http-method>GET</http-method>
</web-resource-collection>
<auth-constraint>
<description>These are the roles who have acce</description>
<role-name>manager</role-name>
</auth-constraint>
</security-constraint>
Web窗口在网页层次上执行认证。然而,商业性应用程序可能还希望对一个网页内的功能进行认证,这会要求在应用程序中定义一些新的附加的与应用程序有关的安全角色。为了控制对功能的访问,应用程序需要理解角色的权限概念。Web容器标准没有解决权限的问题。
由于授权角色是动态的,开发人员常常会感到迷惑,即这些安全角色是否需要添加到部署描述符中。为了使应用程序充分利用安全支持,Web容器只需要在部署描述符中定义的一个角色。因此,应用程序可以定义一个高层次的角色,然后将所有的用户都指派给该角色。这将使该角色中的所有用户都拥有能够访问Web资源的权限。
另外,应用程序还可以定义额外的角色,执行对一种Web资源中较低层次的功能的授权。由于应用程序已经配置有一个包含应用程序中所有用户的高层次安全角色,这些低层次的安全角色也就不需要在部署描述符中进行定义。这使得Web应用程序能够利用容器的授权支持,实现与指定应用程序有关的授权。
我们可以在部署描述符中为所有用户定义一个高层次的管理员角色,保护管理类Web资源,这使得管理员角色中的所有用户都能够访问管理网页。为了控制管理网页中的其他功能,我们可以在应用程序中创建 sysadmin或appadmin等新的角色。
应用程序可以对这些安全角色进行扩展,使它们拥有一定的权限。然后,应用程序可以使用这些权限来控制对其功能的访问。
尽管与特定应用程序相关的安全角色不是定义在部署描述符中的,这些角色仍然可以在isUserInRole方法中使用,判断用户是否在这些安全角色中。
优点
·Web应用程序无需实现认证机制,简化Web应用程序的配置。
·Web应用程序能够使用getRemoteUser、IsUserInRole和getUserPrincipal方法实现有规划的安全。
·Web应用程序能够将认证信息传播给EJB容器。
在Tomcat中配置数据库安全区域
1、创建用户表。
该数据库表需要有username和paword二个字段。
create table users(username varchar(20)not null, paword(20)not null)
2、创建角色表
该表维护着应用程序中角色的清单,它仅仅有rolename一个字段。
create table roles(rolename varchar(20)not null)
3、创建用户-角色关联表
该表维护着一个用户和各个角色之间的关联,一个用户可以属于一个或多个角色。
create table user_roles(username varchar(20)not null, rolename varchar(20)not null)
4、在表中插入数据
insert into users values('user1', 'paword')
insert into role values('manager')
insert into user_roles values('user1', 'manager')
5、创建用户表。
该数据库表需要有username和paword二个字段。
create table users(username varchar(20)not null, paword(20)not null)
6、创建角色表
该表维护着应用程序中角色的清单,它仅仅有rolename一个字段。
create table roles(rolename varchar(20)not null)
7、创建用户-角色关联表
该表维护着一个用户和各个角色之间的关联,一个用户可以属于一个或多个角色。
create table user_roles(username varchar(20)not null, rolename varchar(20)not null)
8、在表中插入数据
insert into users values('user1', 'paword')
insert into role values('manager')
insert into user_roles values('user1', 'manager')
9、通过将下面的信息拷贝到conf文件夹的server.xml文件中,配置Tomcat。(本例使用了薄客户端驱动程序,Tomcat使用内存区域作为缺省的安全区域。)
<Realm
claName=“org.apache.catalina.realm.JDBCRealm”
debug=“99”
driverName=“oracle.jdbc.driver.OracleDriver”
connectionURL=“jdbc:oracle:thin:@{IP addre}::”
connectionName=“{DB Username}”
connectionPaword=“”
userTable=“users”
userNameCol=“username”
userCredCol=“paword”
userRoleTable=“user_roles”
roleNameCol=“rolename”
/>
15)Math.round()什么作用?
。“四舍 六入法”可以概括为:“四舍六入五考虑,五后非零就进一,五后皆零看奇偶,五前为偶应舍 去,五前为奇要进一。” 四舍六入,5凑偶”,但如果5前为偶数,但5后还有非零数,则还要进位。
C
C语言考查的重点一般是:指针、结构体、条件编译、全局变量/局部变量。以下是
我遇见过的面试问题:
1)请说一下extern C的作用(汉略)
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可
extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。记住,下列语句:
extern int a;仅仅是一个变量的声明,其并不是在定义变量a,并未为a分配内存空间。变量a在所有模块中作为一种全局变量只能被定义一次,否则会出现连接错误。
通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。例如,如果模块B欲引用该模块A中定义的全局变量和函数时只需包含模块A的头文件即可。这样,模块B中调用模块A中的函数时,在编译阶段,模块B虽然找不到该函数,但是并不会报错;它会在连接阶段中从模块A编译生成的目标代码中找到此函数。(一、修饰名(Decorated Name)
C/C++程序中的函数在内部是通过修饰名来标识的。修饰名是在函数定义或原型编译阶段由编译器创建字符串。当你在LINK等工具中要指定一个函数名时,会用到修饰名。
1、使用修饰名:
大多数情况下,你不必知道函数的修饰名是什么。连接器等工具通常都能处理函数未修饰的名字。然而,在有些情况下,你可能需要指定函数的修饰名。对于C++重载函数和特定的成员函数(如:构造函数和析构函数),你必须指定这些函数的修饰名,以便连接器等工具能够匹配名字。同时,你也必须在那些引用c或c++函数名的汇编源文件中使用修饰名。
2、查看修饰名:
如果你编译了一个源文件,该源文件中包含了函数定义或原型,你可以获得函数的修饰名形式。
(1)用编译器列表(compiler listing)来查看:
(i)通过将列表文件类型编译器选项(/FA[c|s])设置为下面中的一种,来产生列表文件:Aembly with Machine Code(/FAc);Aembly with Source Code(/FAs);Aembly, Machine Code, and Source(/FAcs).(ii)在产生的列表文件中,找到包含未经修饰的函数定义的行。
(iii)查找前面一行。PROC NEAR 命令标签前就是函数名经过修饰后的形式。
(2)使用DUMPBIN工具来查看:
在.OBJ或.LIB上运行 DUMPBIN,使用/SYMBOLS选项。在输出中查找未经修饰的函数定义。后面跟着的就是经过修饰的函数名,用圆括号括起来的。
二、替代连接说明:
如果在c++中编写一个程序需要用到c的库,那该如何?如果这样声明一个c函数:
void f(int a,char b);
c++编译器就会将这个名字变成相应的修饰名,比如:?f@@YAXHD@Z。
然而,c编译器编译的库的内部函数名(连接器使用)是完全不同的。这样,当c++连接器连接c的函数库时,将会产生内部使用函数不匹配。
故,c++中提供了一个替代连接说明(alternate linkage specification),它是通过重载extern关键字来实现的。
extern后跟一个字符串来指定想声明的函数的连接类型,后面是函数声明,比如:
extern “C” void f(int a,char b);
这样,就是告诉编译器是c连接,这样就不会转换函数名了。此例中,编译后的内部函数名是_f。
2)请说一下#ifdef...的作用(汉略)
#ifdef的作用大体上是工程功能的切换,通常是根据某些宏是否定义来决定是否启用某些功能。比如网络监控系统,通过宏的切换,可以实现平台的移植,视屏路数的定义,云台、矩阵和透明串口的切换,等等。由于#ifdef的存在,静态配置一下参数即可让firmware实现不同的功能。
1.利用#ifdef/#endif将某程序功能模块包括进去,以向某用户提供该功能。
在程序首部定义#ifdef HNLD:
#ifdef HNLD
include“n166_hn.c”
#endif
如果不许向别的用户提供该功能,则在编译之前将首部的HNLD加一下划线即可。
2.在每一个子程序前加上标记,以便追踪程序的运行。
#ifdef DEBUG
printf(“ Now is in hunan!”);
#endif
3.避开硬件的限制。有时一些具体应用环境的硬件不一样,但限于条件,本地缺乏这种设备,于是绕过硬件,直接写出预期结果。具体做法是:
#ifndef TEST
i=dial();
//程序调试运行时绕过此语句
#else
i=0;
#endif
调试通过后,再屏蔽TEST的定义并重新编译,即可发给用户使用了。
3)C语言里,哪些变量是存放在堆里,哪些是存放在栈里?(普天)
heap area存放程序的动态数据
stack area存放程序的局部数据
1、栈区(stack)— 由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。地址是由高向低减少的
2、堆区(heap)— 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。地址是由低向高增长的 4)C语言里的static关键词是什么含义?(普天)
与extern对应的关键字是static,被它修饰的全局变量和函数只能在本模块中使用。因此,一个函数或变量只可能被本模块使用时,其不可能被extern “C”修饰。
5)进程和线程有什么区别?(普天)
线程的引入:例如,有一个Web服务器要进程的方式并发地处理来自不同用户的网页访问请求的话,可以创建父进程和多个子进程的方式来进行处理,但是创建一个进程要花费较大的系统开销和占用较多的资源。除外,这些不同的用户子进程在执行的时候涉及到进程上下文切换,上下文切换是一个复杂的过程。所以,为了减少进程切换和创建的开销,提高执行效率和节省资源,人们在操作系统中引入了“线程(thread)”的概念。
进程的作用和定义:进程是为了提高CPU的执行效率,减少因为程序等待带来的CPU空转以及其他计算机软硬件资源的浪费而提出来的。进程是为了完成用户任务所需要的程序的一次执行过程和为其分配资源的一个基本单位,是一个具有独立功能的程序段对某个数据集的一次执行活动。
线程和进程的区别:
1、线程是进程的一部分,所以线程有的时候被称为是轻权进程或者轻量级进程。
2、一个没有线程的进程是可以被看作单线程的,如果一个进程内拥有多个进程,进程的执行过程不是一条线(线程)的,而是多条线(线程)共同完成的。
3、系统在运行的时候会为每个进程分配不同的内存区域,但是不会为线程分配内存(线程所使用的资源是它所属的进程的资源),线程组只能共享资源。那就是说,出了CPU之外(线程在运行的时候要占用CPU资源),计算机内部的软硬件资源的分配与线程无关,线程只能共享它所属进程的资源。
4、与进程的控制表PCB相似,线程也有自己的控制表TCB,但是TCB中所保存的线程状态比PCB表中少多了。
5、进程是系统所有资源分配时候的一个基本单位,拥有一个完整的虚拟空间地址,并不依赖线程而独立存在。
进程与程序的区别:
程序是一组指令的集合,它是静态的实体,没有执行的含义。而进程是一个动态的实体,有自己的生命周期。一般说来,一个进程肯定与一个程序相对应,并且只有一个,但是一个程序可以有多个进程,或者一个进程都没有。除此之外,进程还有并发性和交往性。简单地说,进程是程序的一部分,程序运行的时候会产生进程。
总结:
线程是进程的一部分,进程是程序的一部分。
C++
C++语言考查的重点主要有:多继承,抽象类,虚函数,拷贝构造函数,析构函数,动态联编,多态,const,static。以下是我面试中遇到的问题: 1)你听说过拷贝构造函数吗?能具体说一下它的作用吗?(汉略)
为解决防止位拷贝,可通过定义自己的函数来实现。这个函数是什么样的呢? 1)由于是创建一个新的对象,所以应该是一个构造函数;
2)由于是用它来实现从已有对象创建新对象,那怎样把已有对象联系起来呢?可以把已有对象作为源对象作为这个函数的单一参数传递。由于这个源对象不能通过值传递的方式传入构造函数(因为定义这个函数就是为了处理按值传递方式),而按句法传递一个指针是没有意义的,所以就用源对象的引用来传递。
这个函数就是拷贝构造函数。它经常被称为X(X&)(它叫做类X的外在表现)。
这样,有了拷贝构造函数,在用现有的对象创建新对象时,编译器将不再使用位拷贝,而是调用我们的拷贝构造函数。对于使用组合(或继承)的类,如果我们没有定义自己的拷贝构造函数,那么编译器会通过递归调用它所有成员对象(或基类)的拷贝构造函数来自动创建一个拷贝构造函数。编译器获得拷贝构造函数的过程被称为成员方法初始化。
-什么时候会用到拷贝构造函数?
当任何你想复印东西的时候,而不管东西被复印成什么样子。即任何你想利用一个已有的类实例给另一个类实例赋值时,这种赋值可能是显式的,也可能是隐式的 显式:claa_1=cla_2;隐式:函数的形参有用到类对象却没有用引用或传址技术时 函数的返回值是一个对象也没有应用传址技术时 2-什么时候有必要用拷贝构造函数?
上述3种情况,如果没有涉及到深拷贝问题,就没有必要自己来编写拷贝构造函数,编译器有默认的可以很完美的完成任务
还一种情况就是变态的拷贝:在拷内过程中进行缩放,放大等处理,不过没什么用
2)析构函数必须是虚函数吗?为什么?(汉略)
为什么析构函数总是虚函数?如果这是必要的,那么为什么C++不把虚析构函数直接作为默认值?为什么纯虚析构函数可以通过编译,但是不能通过连接?
回答:
编译器总是根据类型来调用类成员函数。但是一个派生类的指针可以安全地转化为一个基类的指针。这样删除一个基类的指针的时候,C++不管这个指针指向一个基类对象还是一个派生类的对象,调用的都是基类的析构函数而不是派生类的。如果你依赖于派生类的析构函数的代码来释放资源,而没有重载析构函数,那么会有资源泄漏。
所以建议的方式是将析构函数声明为虚函数。如果你使用MFC,并且以CObject或其派生类为基类,那么MFC已经为你做了这件事情;CObject的析构函数是虚函数。一个函数一旦声明为虚函数,那么不管你是否加上virtual 修饰符,它在所有派生类中都成为虚函数。但是由于理解明确起见,建议的方式还是加上virtual 修饰符。
C++不把虚析构函数直接作为默认值的原因是虚函数表的开销以及和C语言的类型的兼容性。有虚函数的对象总是在开始的位置包含一个隐含的虚函数表指针成员。如果是对于MFC类CPoint和CSize这样的小型类,增加一个指针就增加了很多内存占用,而且使得其内存表示和基类POINT和SIZE不一致。如果两个类的内存表示一致,那么这样你可以安全地把一个类的指针或数组当作另一个类的指针或数组使用。
3)你听说过钻石结构吗?请具体说一下(aspenTech)
4)什么是深拷贝?什么是浅拷贝?他们有什么区别?(aspenTech)如果一个类中含有指针成员变量,则在利用一个已存在对象构造新的对象时,就会面临两种选择:深拷贝和浅拷贝。
浅拷贝只是将对象间对应的指针成员变量进行简单的拷贝,即拷贝结束后新旧对象的指针指向相同的资源(指针的值是相同的);这种拷贝会导致对象的成员不可用
深拷贝之后,新旧对象的home成员指向的内容的值相同,而其自身的值不同。这样就可避免出现其中之一
destroy 之后,另一对象的home成员不可用。
但是,此种开辟新的内存区域然后赋值拷贝的方法在面临指针成员指向的数据量很大时出现效率低下的问题,因此又有下面的处理方法:为指针保留引用计数(reference counting)。
当类每次拷贝这个指针时,就增加它的计数;对象destroy时检察指针的引用计数,如果为0就删除其指向的资源,否则计数减小。如果指针所指数据相对恒定是,指针引用计数尤为有效。而且在数据量庞大的时候,可以有较高的执行效率。
5)什么是虚函数,什么是纯虚函数?为什么引入虚函数和纯虚函数?(汉略,aspenTech,普天)
6)请说一下面向对象的基本特性。(aspenTech)
7)C++中的const关键定代表什么含义?跟C语言中的const有什么区别?(aspenTech)const修饰符可以把对象转变成常数对象,意思就是说利用const进行修饰的变量的值在程序的任意位置将不能再被修改,就如同常数一样使用!
在C语言中,const的意思是“一个不能被改变的普通变量”,它总是占用存储空间而且它的名字是全局的。C编译器不能把const堪称一个编译器间的常量。所以在C中你可以这么写:
const int bufsize;//不赋值。
但不能这么写:
cosnt bufsize = 100;
char buf[bufsize];//因为bufsize不是常量。
但是在C++里,上面两种情况正好反过来。在C++里const修改的量表示常量,必须在初始化时赋值,并且可以作为数据的维数
8)C++中的static关键定代表什么含义?跟C语言、Java中的static有什么区别?(普天)
一、在面向过程设计中的static关键字
1、静态全局变量
定义:在全局变量前,加上关键字 static 该变量就被定义成为了一个静态全局变量。特点:
A、该变量在全局数据区分配内存。
B、初始化:如果不显式初始化,那么将被隐式初始化为0。
C、访变量只在本源文件可见,严格的讲应该为定义之处开始到本文件结束。
例(摘于C++程序设计教程---钱能主编P103):
file://file1.cpp
#include
void fn();
extern int n;
void main()
{
n=20;
cout
fn();
}
file://file2.cpp
#include
static int n;file://定义静态全局变量,初始化为0;
void fn()
{
n++;
cout
}
文件分别编译能通过,但连接时file1.cpp 中的变量n找不到定义,产生连接错误。
D、文件作用域下声明的const的常量默认为static存储类型。
2、静态局部变量
定义:在局部变量前加上static关键字时,就定义了静态局部变量。特点:
A、该变量在全局数据区分配内存。
B、初始化:如果不显式初始化,那么将被隐式初始化为0。
C、它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或 语句块结束时,其作用域随之结束。
3、静态函数(注意与类的静态成员函数区别)
定义:在函数的返回类型前加上static关键字,函数即被定义成静态函数。特点:
A、静态函数只能在本源文件中使用(这是与普通函数区别)
例(摘于C++程序设计教程---钱能主编P103):
file://file1.cpp
void fn();
void staticFn()
void main()
{
fn();
staticFn();
}
file://file2.cpp
#include
static void staticFn();
void fn();
void fn()
{
staticFn();
cout
}
void staticFn()
{
cout
}
连接时,将产生找不到函数staticFn()定义的错误。
B、主意事项
在文件作用域下声明的inline函数默认为static类型。
二、面象对象中的static关键字(主要指类中的static关键字)
1、静态数据成员 特点:
A、内存分配:在程序的全局数据区分配。
B、初始化和定义:
a、静态数据成员定义时要分配空间,所以不能在类声明中定义。
b、为了避免在多个使用该类的源文件中,对其重复定义,所在,不能在类的头文件中
定义。
c、静态数据成员因为程序一开始运行就必需存在,所以其初始化的最佳位置在类的内部实现。
C、特点
a、对相于 public,protected,private 关键字的影响它和普通数据成员一样,b、因为其空间在全局数据区分配,属于所有本类的对象共享,所以,它不属于特定的类对象,在没产生类对象时其作用域就可见,即在没有产生类的实例时,我们就可以操作它。
D、访问形式
a、类对象名.静态数据成员名
b、类类型名:: 静态数据成员名
E、静态数据成员,主要用在类的所有实例都拥有的属性上。比如,对于一个存款类,帐号相对
于每个实例都是不同的,但每个实例的利息是相同的。所以,应该把利息设为存款类的静态数据成员。这有两个好处,第一,不管定义多少个存款类对象,利息数据成员都共享分配在全局区的内存,所以节省存贮空间。第二,一旦利息需要改变时,只要改变一次,则所有存款类对象的利息全改变过来了,因为它们实际上是共用一个东西。
2、静态成员函数 特点:
A、静态成员函数与类相联系,不与类的对象相联系。
B、静态成员函数不能访问非静态数据成员。原因很简单,非静态数据成员属于特定的类实例。作用:
主要用于对静态数据成员的操作。调用形式:
A、类对象名.静态成员函数名()
B、类类型名:: 静态成员函数名()
4、数据结构
这是面试中几乎必考的部分。考查的重点有:链表,二叉树前序、中序、后序遍历
(递归,非递归),二叉树结点、层次的计算,树转二叉树,各种排序算法(冒泡排序,快速排序,堆排序是重点)。以下是我在面试中遇到过的问题: 1)请编写程序,将一个链表倒置。(联发)
2)请编写二叉树的中序遍历非递归算法。(新华社)3)请编写一个程序,实现将树转化成二叉树。(华为)
4)一棵满二叉树有x个结点,请问整棵二叉树有多少结点?(新华社,中国信保)
5)请编程实现一个堆排序算法/快速排序算法。(汉略)
数据库
1)什么是范式、1范式、2范式、3范式?(百度,中航信,新华社,中国信保)所谓范式就是符合某一种级别的关系模式的集合。通过分解把属于低级范式的关系模式转换为几个属于高级范式的关系模式的集合。这一过程称为规范化。
1、第一范式(1NF):一个关系模式R的所有属性都是不可分的基本数据项。
2、第二范式(2NF):关系模式R属于第一范式,且每个非主属性都完全函数依赖于键码。
3、第三范式(3NF):关系模式R属于第一范式,且每个非主属性都不传递依赖于键码。
4、BC范式(BCNF):关系模式R属于第一范式,且每个属性都不传递依赖于键码。即每个决定因素都包含码。
2)事务具有哪些特性?(中航信)
数据库事务是指作为单个逻辑工作单元执行的一系列操作。事务的:原子性、一致性、分离性、持久性(1)原子性
事务的原子性指的是,事务中包含的程序作为数据库的逻辑工作单位,它所做的对数据修改操作要么全部执行,要么完全不执行。这种特性称为原子性。
事务的原子性要求,如果把一个事务可看作是一个程序,它要么完整的被执行,要么完全不执行。就是说事务的操纵序列或者完全应用到数据库或者完全不影响数据库。这种特性称为原子性。
假如用户在一个事务内完成了对数据库的更新,这时所有的更新对外部世界必须是可见的,或者完全没有更新。前者称事务已提交,后者称事务撤消(或流产)。DBMS必须确保由成功提交的事务完成的所有操纵在数据库内有完全的反映,而失败的事务对数据库完全没有影响。
(2)一致性
事务的一致性指的是在一个事务执行之前和执行之后数据库都必须处于一致性状态。这种特性称为事务的一致性。假如数据库的状态满足所有的完整性约束,就说该数据库是一致的。
一致性处理数据库中对所有语义约束的保护。假如数据库的状态满足所有的完整性约束,就说该数据库是一致的。例如,当数据库处于一致性状态S1时,对数据库执行一个事务,在事务执行期间假定数据库的状态是不一致的,当事务执行结束时,数据库处在一致性状态S2。
(3)分离性
分离性指并发的事务是相互隔离的。即一个事务内部的操作及正在操作的数据必须封锁起来,不被其它企图进行修改的事务看到。
分离性是DBMS针对并发事务间的冲突提供的安全保证。DBMS可以通过加锁在并发执行的事务间提供不同级别的分离。假如并发交叉执行的事务没有任何控制,操纵相同的共享对象的多个并发事务的执行可能引起异常情况。
DBMS可以在并发执行的事务间提供不同级别的分离。分离的级别和并发事务的吞吐量之间存在反比关系。较多事务的可分离性可能会带来较高的冲突和较多的事务流产。流产的事务要消耗资源,这些资源必须要重新被访问。因此,确保高分离级别的DBMS需要更多的开销。
(4)持久性
持久性意味着当系统或介质发生故障时,确保已提交事务的更新不能丢失。即一旦一个事务提交,DBMS保证它对数据库中数据的改变应该是永久性的,耐得住任何系统故障。持久性通过数据库备份和恢复来保证。
持久性意味着当系统或介质发生故障时,确保已提交事务的更新不能丢失。即对已提交事务的更新能恢复。一旦一个事务被提交,DBMS必须保证提供适当的冗余,使其耐得住系统的故障。所以,持久性主要在于DBMS的恢复性能。
3)请说说什么是外连接、左外连接、右外连接?(aspenTech)
内联接(典型的联接运算,使用像
= 或
之类的比较运算符)。包括相等联接和自然联接。
内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。例如,检索
students 和
courses 表中学生标识号相同的所有行。
外联接。外联接可以是左向外联接、右向外联接或完整外部联接。
在FROM 子句中指定外联接时,可以由下列几组关键字中的一组指定:
LEFT JOIN 或
LEFT OUTER JOIN。
左向外联接的结果集包括
LEFT OUTER 子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。
RIGHT JOIN 或
RIGHT OUTER JOIN。
右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。
FULL JOIN 或
FULL OUTER JOIN。