计算机基础知识面试

      我整理和收集了计算机面试常问的基础知识集锦。看这篇日志进行复习,肯定会事半功倍的。这些基础知识散落在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次握手过程描述。

    

  • 源端口号,目的端口号,顺序号,确认号,TCP 报头长度,保留位,控制位,URG ,ACK ,PSH ,RST,SYN,FIN ,窗口大小,校验和,紧急指针,选项:最常见的可选字段是最长报文大小,又称为 MSS(Maximum Segment Size),数据。
  • 3次握手的格式待续。

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

你可能感兴趣的:(基础知识C++)