面试问题积累:
C++:
问题:指针和引用的区别
答:指针是c和c++的概念。引用是c++的概念。
指针可以不赋初值,指针可以指向NULL,指针可以改变它的指向。
引用必须赋初值,引用不可以为NULL,引用一直指向最初的对象。
理解:引用就像张三的小名狗剩,一旦声明了,叫狗剩就是叫张三。
问题:构造和析构 virtual
1、构造函数是不允许virtual的。否则,编译无法通过。它不能指望派生类去帮你实现,必须基类中就给出。
2、为了可继承:基类与派生类的析构函数建议应该为虚(即加virtual关键字)。这样可以根据派生的对象来动态绑定。
问题:stl是否熟悉。这个要学习
问题:A a。 a++ 和++a的效率区别
但若自加/减变量的类型是一个自定义的结构那就可能会有很大差别了,
因为n++的方式多了一个构造函数和析构函数的开销
引用 3 楼 zljintan 的回复:
引用 1 楼 pengzhixi 的回复:
引用楼主 zljintan 的回复:
初学c++,请教高手:
为什么在重载++时,前缀++返回的是对象的引用,而后缀++返回的就是对象??
你有没有注意到 后缀返回的是自增前的对象。另外你要知道是不能返回一个局部变量的引用或指针的。
我知道后缀自增不能返回引用,但是为什么前缀自增就要返回引用??
因为c++允许这样的代码出现
C/C++ code
int i;
(++i)=5;
所以前缀++必须返回引用
问题:try catch throw 的使用。catch里面用对象?引用?指针? throw出一个对象?
throws XXXException 表示该方法会抛出异常由使用者处理(当然当前声明以后的地方就不用处理异常了),在调用该方法时必须被捕获
throw 表示手动抛出了一个异常,当然必须是Exception的派生类,并由catch捕获处理,注意只有try大括号句括的内容才能使用throw
try{} 表示该大括号名括的语句有可能抛出异常,如果捕捉到的异常,则由catch(...)进行识别并处理
catch(){} 识别try抛出的异常并进行处理
finally(){} 有无异常均会执行这里的语句,用于释放异常情况下未释放的资源操作等
throw丢出的异常是个引用。
问题:深copy和浅copy
默认的copy构造和赋值韩式都是浅copy。在指针中,使得a、b指向同一对象。而深copy,则要手工给a申请空间,copy内容。
shell类:
问题:ln 链接 硬链接
通俗理解:
软连接像是一个快捷方式的文件。内容是那个文件的目录信息。
文件移动走了,软连接就像找不到目标的快捷方式。
硬链接像是一个文件指针,实实在在的指向文件节点。
文件移动走了,硬链接还是会指向这个文件。
硬链接必须是同一个文件系统的。
硬连结的意思是一个档案可以有多个名称,而软连结的方式则是产生一个特殊的档案,该档案的内容是指向另一个档案的位置。硬连结是存在同一个档案系统中,而软连结却可以跨越不同的档案系统。
区别:
1.硬链接原文件/链接文件公用一个inode号,说明他们是同一个文件,而软链接原文件/链接文件拥有不同的inode号,表明他们是两个不同的文件;
2.在文件属性上软链接明确写出了是链接文件,而硬链接没有写出来,因为在本质上硬链接文件和原文件是完全平等关系;
3.链接数目是不一样的,软链接的链接数目不会增加;
4.文件大小是不一样的,硬链接文件显示的大小是跟原文件是一样的。而这里软链接显示的大小与原文件就不同了,BBB大小是95B,而BBBsoft是3B。
总之,建立软链接就是建立了一个新文件。当访问链接文件时,系统就会发现他是个链接文件,它读取链接文件找到真正要访问的文件。
当然软链接也有硬链接没有的缺点,因为链接文件包含有原文件的路径信息,所以当原文件从一个目录下移到其他目录中,再访问链接文件,系统就找不到了,而硬链接就没有这个缺陷,你想怎么移就怎么移;还有它要系统分配额外的空间用于建立新的索引节点和保存原文件的路径。
操作系统类:
问题:说说信号量、锁
有名信号量、无名信号量。
无名一般用于线程之间。用前等待或占有,用后释放。
有名一般用于进程之间。信号量的id常放在共享内存或各个进程协商知道的地方。
问题:说说管道
使用:a|b,a的输出是b的输入
作为shell的程序,看到a|b,a是啊fork一个子进程,b是fork一个子进程,|则调用pipe。这个pipe被a、b继承。
a关闭入端,打开出端,定向输出到pipe输出。b关闭出端,打开入端。定向输入为pipe输入
作为操作系统。pipe会给出一个内存buffer,一组信号量控制读写同步。
如果pipe满,读数为0.阻塞写一直等,非阻塞写返回。类似对应pipe空,写数为0.
oracle:
问题:join的类型
left join,right join,inner join
left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的。换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为: A.aID = B.bID)。B表记录不足的地方均为NULL。
问题:union的注意事项
union 会排除重复的记录
union all 不会排除重复的记录
union all 比union 速度快很多,建议在相同的情况下用 union all
注意:union用法中,两个select语句的字段类型匹配,而且字段个数要相同。
问题:聚合语句 group having count sum max min
1)COUNT 2)SUM, 3)MIN, MAX 4)AVG 5)MEDIAN
6)RANK
1)用法1:RANK OVER
语法:RANK( ) OVER ([ PARTITION BY column1 ] ORDER BY column2 [ASC|DESC])
为分析函数,为每条记录产生一个序列号,并返回。
参数:column1为列名,指定按照哪一列进行分类(分组)
column2为列名,指定根据哪列排序,默认为升序;
若指定了分类子句(PARTITION BY),则对每类进行排序(每个分类单独排序)
返回:返回一个数值类型数据,作为该记录的序号!
作用:为分析函数,对记录先按column1分类,再对每个分类进行排序,并为每条记录分配一个序号(每个分类单独排序)
注意:排序字段值相同的记录,分配相同的序号。存在序号不连续的情况
SQL> select rank() over(partition by KEMU order by FENSHU desc) as sort,student.* from student;
SORT NAME ID KEMU FENSHU
---------- ---------- ---------------- ------------ ----------
1 Zhang 0113098 物理 90
2 Li 0113101 物理 80
2 Luo 0113011 物理 80
4 Wang 0113077 物理 70
1 Li 0113101 高数 90
2 Luo 0113011 高数 80
2 Zhang 0113098 高数 80
4 Wang 0113077 高数 70
由返回记录可了解,对排序列的值相同的记录,rank为其分配了相同的序号(SORT NAME列)。
并且之后的记录的序号是不连续的。
若获取每科前两名,只需对排序后的结果增加二次查询即可
select * from
(select rank() over(partition by KEMU order by FENSHU desc) as sort_id,student.* from student) st
where st.sort_id<=2;
2)用法2:RANK WITHIN GROUP
语法: RANK( expr1 ) WITHIN GROUP ( ORDER BY expr2 )
为,返回一个值。
参数:expr1为1个或多个常量表达式;
expr2为如下格式的表达式:
expr2的格式为'expr3 [ DESC | ASC ] [ NULLS { FIRST | LAST } ]'
其中,expr1需要与expr2相匹配,
即:expr1的常量表达式的类型、数量必须与ORDER BY子句后的expr2表达式的类型、数量相同
实际是expr1需要与expr3相匹配
如:RANK(a) WITHIN GROUP (ORDER BY b ASC NULLS FIRST);
其中,a为常量,b需要是与相同类型的表达式
RANK(a,b) WITHIN GROUP (ORDER BY c DESC NULLS LAST, d DESC NULLS LAST);
其中,a与b都为常量;c是与a类型相同的表达式、d是与b类型相同的表达式;
返回:返回数值型数据,该值为假定记录在表中的序号。
作用:确定一条假定的记录,在表中排序后的序号。
如:假定一条记录(假设为r1)的expr2指定字段值为常量expr1,则将r1插入表中后,
与原表中的记录,按照ORDER BY expr2排序后,该记录r1在表中的序号为多少,返回该序号。
注释: NULLS FIRST指定,将ORDER BY指定的排序字段为空值的记录放在前边;
NULLS LAST指定,将ORDER BY指定的排序字段为空值的记录放在后边;
实例:假设一个员工的薪水为1500,求该员工的薪水在员工表中的排名为多少?
已知员工表如下:
SQL> select * from employees;
EMP_ID EMP_NAME SALARY
---------- -------------------- ---------------
10001 ZhangSan 500
10002 LiSi 1000
10003 WangWu 1500
10004 MaLiu 2000
10005 NiuQi 2500
s nvV ^%q-V0
SQL> select rank(1500) within group (order by salary) as "rank number" from employees;
rank number
-----------
3
由结果可知,薪水为1500的员工,在表中按升序排序,序号为3
7)FIRST、LAST
语法:agg_function(e1) KEEP (DENSE_RANK FIRST ORDER BY e2 [NULLS {FIRST|LAST}]) [OVER PARTITION BY e3 ]
agg_function(e1) KEEP (DENSE_RANK LAST ORDER BY e2 [NULLS {FIRST|LAST}]) [OVER PARTITION BY e3 ]
参数:agg_function为一个聚合函数,可以为 MIN、MAX、SUM、AVG、COUNT、VARIANCE或STDDEV
e2指定以哪个字段为依据,进行排序;
e3指定以哪个字段为依据,进行分类(分组);
当指定OVER PARTITION BY子句后,针对分类后的每个类单独排序;
DENSE_RANK为排序后的记录分配序号,并且序号为连续的。
NULLS {FIRST|LAST}指定排序字段e1的值若为空,则拍在序列前边(NULLS FIRST)或者后边(NULLS LAST)
DENSE_RANK后的FIRST/LAST确定选取通过DENSE_RANK排好序后的序列中,序号最小/最大的记录。序号相同时,返回多条记录
当序号相同,返回多条记录时,agg_function(e1)聚合函数继续对这多条记录的e1字段做聚合操作。
作用:如果agg_function为min(e1),获取排序后的FIRST或LAST的多条记录中,某字段e1的最小值
该字段不是排序关键字段e2
实例:
已知员工表有薪水字段,奖金字段。要求获取薪水最低的员工中,奖金最高的员工的记录。
已知表内容如下:
SQL> select * from employees order by salary;
EMP_ID EMP_NAME SALARY COMMISSION
---------- ---------------------------- ------------ ------------
10001 ZhangSan 500 200
10002 LiSi 500 300
10003 WangWu 500 100
10004 MaLiu 2000 500
10005 NiuQi 2500 200
10006 ShangDuo 2500 300
10007 BaiQi 2500 400
SQL> select max(commission) keep(dense_rank first order by salary asc) as commission from employees;
COMMISSION
----------
300
首先,按salary排序后,获取薪水最低的记录,分别为员工10001、10002、10003三条记录。
聚合函数max(commission)对3条记录获取奖金最高的为员工10002,奖金为300。
问题:oracle的锁。一条update语句update第三行,其它的读、写是否都会被锁。
sqlserver、sybase没有这个特性,
oracle特性:一条update语句,不影响其它读,也不影响insert。update对update冲突,看是否在同一块。因为oracle锁的是块。
可以理解oracle有个版本管理,读正在update的数据可以先读影像。
问题:oracle的连接方式
方法1:监听。服务器开监听,客户端配置tnsname