我整理和收集了计算机面试常问的基础知识集锦。看这篇日志进行复习,肯定会事半功倍的。这些基础知识散落在C++ Primer, Effective C++, C++ stl 还有其他的书之中。我对这些问题进行了整理和总结,方便找工作的同学复习,以便达到事半功倍的效果。
1. c++的cast函数及他们的作用。
c++共有4种cast函数。其中包括dynamic_cast, static_cast, interpret_cast, const_cast。四种cast函数,其实也很容易理解的。
2. c++虚函数及其作用,c++虚拟析构函数及其作用。
3. tcp数据包和ip数据包的大小,他们的格式。TCP3次握手过程描述。
4. 熟悉的设计模式。设计模式简介。写出单例模式。
设计模式包括单例模式、工厂模式、观察者模式、装饰者模式、
5. 操作符重载:直接给出简单的示例。
示例数据结构:
Point{
int x,y;
}
1) 单目操作符:
Point Point::operator++(int x);//有数字先加加
Point Point::operator++();
2) 双目操作符:
Point Point::operator=(Point b);
6. MySql面试:
时间转化为年、月、日的区间判断。to_char(retime,
'yyyy-mm'
)=
'2010-05'
查询固定年月的事件。
7.GDB常用调试指令:
首先编译加上-g参数,通知编译器将符号表存储到可执行文件之中。这样调试时才能引用源代码之中的符号。
常用命令:
调试a.out gdb a.out
退出 quit 或者Ctrl + d
执行程序 run
查看栈帧 frame num
向上向下 up down。
查看变量 print/p var
显示整个栈 backtrace
断点:
设置断点: b/break line_num
条件断点: condtion break_num exp,例如nbreak 30 if i=20
临时断点: gdb nreak 30 if i==20
删除断点: clear, delete break_num
禁用/启用断点: disable/enable breakpoing-list
7 vi编辑指令:
8 c++基础程序题目atoi实现:
int atoi(const char *s)
{
char *p=s;
char c;
int i=0;
while(c=*p++)
{
if(c>='0'&&c<'9')
i=i*10+(c-'0');
}
else
return -1;
}
return -1;
}
9 深拷贝与浅拷贝:
1) 什么时候使用拷贝构函数?
a. 对象以值传递的方式传入函数体。对象以值得方式从函数返回。
b. 对象需要通过另外一个对象进行初始化。
2)深拷贝与浅拷贝:
很显然如果使用默认拷贝A=B。此时如果B的成员变量指针已经申请了内存,俺么A的那个变量也指向同一块内存的。这里就出问题了,把B的内存释放了,A的内存就是野指针了。出现运行错误。
区别:当一个类拥有资源时,当这个类的对象发生复制过程的时候,资源重新分配,这个过程就是深拷贝。反之没有重新分配资源,就是浅拷贝。
10 指针与引用的区别:
★ 相同点: 都是地址的概念;
指针指向一块内存,它的内容是所指内存的地址;引用是某块内存的别名。★ 区别: 1. 指针是一个实体,而引用仅是个别名; 2. 引用使用时无需解引用(*),指针需要解引用; 3. 引用只能在定义时被初始化一次,之后不可变;指针可变; 4. 引用没有 const,指针有 const,const 的指针不可变; 5. 引用不能为空,指针可以为空; 6. “sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身(所指向的变量或对象的地址)的大小; 7. 指针和引用的自增(++)运算意义不一样;特别的例子:对于如下的代码是不安全的:
int *p=0;
int "e=p;
11 什么是可重入函数:
可重入函数,即为多线程安全函数,它有如下要求:必须持有非静态或者非const的数据。必须不反悔地址到静态非const数据。必须只操作调用函数传递过来的数据,必须依赖锁来保证单例的调用。必须不能修改自己的代码。必须不能调用非可重入的函数。
12 指向数组的指针和指向指针的数组:
注意[]的结合型比*要高,所以写出 int *a[10]优先理解为数组,数组的每个元素是指针。 可以int b[10]; a[0]=b;
int (*a)[10]它优先是一个指针,然后指向的是一个数组(首地址)。 可以 a=&b;
13 Mutex与semaphore还有spinlock区别。
最简单也最浅显的区别:Mutex二值,只能用于保护一段代码或者一个资源。Semaphore是多值的可以用于多个资源的调度。
Mutex的锁只能由自己来释放,而Semaphore可以由其他的进程释放。因此我们对临界区使用Mutex,而对于Semaphore多用在变量或者同步。
Spin lock是一个强的等待,spin lock会让cpu处于busy waiting,并且不会运行其他的代码(貌似会相应中断irq)。
15 数据库正确执行的4个基本要素。
ACID,原子性、一致性、隔离性、持久性。
struct默认权限全部是public,class默认权限是protected的。纯虚函数是指定基类不可实例化,函数要留到之类继承实现的,像java的接口。虚函数不能使用static修饰,因为一个是编译前绑定,一个是编译后绑定,生命周期不同。
16 将数组打乱顺序:
random_shuffle(vec.begin(),vec.end());
17 第一范式、第二范式、第三范式:
第一范式:数据库中表的每一列都是不可分割的基本数据项。
第二范式:非主属性非部分依赖于主关键字
第三范式:属性不依赖于其它非主属性。
18 进程通信方式:
信号、信号量、共享内存、消息队列、套接字、管道。
19 linux系统常见的锁有哪几种。
原子操作、信号量、读写信号量和自旋锁的API,另外一些同步机制,包括大内核锁、读写锁、大读者锁、RCU (Read-Copy Update,顾名思义就是读-拷贝修改),和顺序锁
20 C语言修改对齐方式。
#pragma pack(n)
21 为什么基类的虚构函数是虚函数?
在实现多态时,当用基类操作派生类,在析构时防止只析构基类而不析构派生类的状况发生。
22 strncpy memcpy memmove有什么区别?
memcpy是存储块内容复制,存储块的大小适用size_t衡量。
void * memcpy ( void * destination, const void * source, size_t num );
strcpy是字符内容复制,存储的大小使用char衡量。
memmove保证地址有重叠的时候,依然得到正确结果。所以memmove的效率稍低一些。
22 select 和 epoll有什么区别?
1. C++虚析构函数: http://www.cnblogs.com/lixiaohui-ambition/archive/2012/07/13/2589716.html
2. 需不需要基类虚拟析构函数?http://blog.csdn.net/duanwuqing/article/details/6937525