chunlanse2014

导航

笔试面试知识点转载

C/C++部分

 

1、结构体字节对齐 2、堆和栈的区别 3、动态内存的传递 4、assert()函数用法总结 5、字符串指针与字符数组的区别
 6、函数指针和指针函数  7、static的作用  8、虚析构函数  9、三维数组的动态申请与释放  10、C++中的隐藏、重载、覆盖(重写)
 11、内联函数        

 

1、下列关于虚函数的说法正确的是()
A、在构造函数中调用类自己的虚函数,虚函数的动态绑定机制还会生效。
B、在析构函数中调用类自己的虚函数,虚函数的动态绑定机制还会生效。
C、静态函数不可以是虚函数
因为静态成员函数没有this,也就没有存放vptr的地方,同时其函数的指针存放也不同于一般的成员函数,其无法成为一个对象的虚函数的指针以实现由此带来的动态机制。静态是编译时期就必须确定的,虚函数是运行时期确定的。
D、虚函数可以声明为inline
inline函数和virtual函数有着本质的区别,inline函数是在程序被编译时就展开,在函数调用处用整个函数体去替换,而virtual函数是在运行期才能够确定如何去调用的,因而inline函数体现的是一种编译期机制,virtual函数体现的是一种运行期机制。
因此,内联函数是个静态行为,而虚函数是个动态行为,他们之间是有矛盾的。
函数的inline属性是在编译时确定的, 然而,virtual的性质则是在运行时确定的,这两个不能同时存在,只能有一个选择,文件中声明inline关键字只是对编译器的建议,编译器是否采纳是编译器的事情。
我并不否认虚函数也同样可以用inline来修饰,但你必须使用对象来调用,因为对象是没有所谓多态的,多态只面向行为或者方法,但是C++编译器,无法保证一个内联的虚函数只会被对象调用,所以一般来说,编译器将会忽略掉所有的虚函数的内联属性。

相关知识点:什么函数不能声明为虚函数?
一个类中将所有的成员函数都尽可能地设置为虚函数总是有益的。 
设置虚函数须注意: 
1:只有类的成员函数才能说明为虚函数; 
2:静态成员函数不能是虚函数; 
3:内联函数不能为虚函数; 
4:构造函数不能是虚函数; 
5:析构函数可以是虚函数,而且通常声明为虚函数。

 

2、说明指针与引用的区别。
答:●指针是一个实体,而引用仅是个别名;
●引用只能在定义时被初始化一次,之后不可变;指针可变;引用“从一而终”,指针可以“见异思迁”;
●引用没有const(没有int &const a这种形式的引用),指针有const(有int *const a这种形式),const的指针不可变;
●引用不能为空,指针可以为空;
●“sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身的大小;
●指针和引用的自增(++)运算意义不一样;
●引用是类型安全的,而指针不是 (引用比指针多了类型检查);
从内存分配上看:程序为指针变量分配内存区域,而引用不分配内存区域。指针:指向另一个内存空间的变量,我们可以通过它来索引另一个内存空间的内容,本身有自己的内存空间。

 

2、列出C++类型转换操作符,并分别举例。
dynamic_cast: 在多态类型转换时使用,用来执行继承体系中"安全的向下转型或跨系转型动作",就是子类对象指针转化为父类对象指针。实现在运行时,并进行运行时检测,如果转换失败,返回值是NULL。
static_cast:与dynamic_cast相反,static_cast是在编译时转换类型的,故称为static_cast,它可以用在值类型转换中。
const_cast:一般用于去除const, volatile等修饰属性上.
reinterpret_cast:特意用于底层的强制转型,这个操作符能够在非相关的类型之间转换。操作结果只是简单的从一个指针到别的指针的值的二进制拷贝。在类型之间指向的内容不做任何类型的检查和转换。

 

3、写个简单的函数,用于判断CPU的字节序(little endian/big endian)

 1 //若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1。
 2 int checkCPU(void)
 3 {
 4     union
 5     {
 6         int a;
 7         char b;
 8     }c;
 9     c.a = 1;
10     return (c.b == 1);
11 }

 

 

 

数据结构部分

排序算法

经典排序算法集锦

1、冒泡排序  2、快速排序  3、直接插入排序  4、希尔排序 5、选择排序 
 6、归并排序        

链表

1、轻松搞定面试中的链表题目        
         

其他

1、从头到尾彻底理解KMP        
         

 

 

 

1、下面属于构造散列函数的方法是()
A、直接定址法
B、数字分析法
C、乘余取整法
D、平方取中法 

哈希函数的构造方法:1、直接定址法(A) 2、数字分析法(B) 3、平方取中法(D) 4、折叠法 5、除留余数法 6、随机数法

7、乘余取整法(C):使用此方法时,先让关键码key乘上一个常数A (0< A < 1),提取乘积的小数部分。然后,再用整数n乘以这个值,对结果向下取整,把它做为散列的地址。散列函数为: hash ( key ) = _LOW( n × ( A × key % 1 ) )。 其中,“A × key % 1”表示取 A × key 小数部分,即: A × key % 1 = A × key - _LOW(A × key), 而_LOW(X)是表示对X取下整。

8、基数转换法:将关键码值看成另一种进制的数再转换成原来进制的数,然后选其中几位作为散列地址。

9、ELFhash字符串散列函数 

处理冲突的方法:1、开放定址法 2、再哈希法 3、链地址法 4、建立一个公共溢出区

 

 

TCP/IP部分

 

1、在使用浏览器打开一个网页的过程中,浏览器会使用的网络协议包括()
A、DNS         B、TCP        C、HTTP            D、Telnet

DNS:DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。DNS协议运行在UDP协议之上,使用端口号53。

 

操作系统部分

1、为何使用多线程

 2、浅谈进程同步和互斥的概念

     
         

 

1、列出几种你了解的IPC机制
答:共享内存:是一片指定的物理内存区域,这个区域通常是在存放正常程序数据区域的外面, 它允许两个或多个进程共享一给定的存储区,是针对其他通信机制运行效率较低而设计的。使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。
套接口(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上。
消息队列(MessageQueue)是一个结构化的排序内存段表,这个队列是进程存放或检索数据的地方,是一个消息的链表,可以被多个进程所共享。

 

2、列举一种死锁发生的场景,并给出解决方案。
答:最经典的场景就是生产者/消费者,生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。消费者线程从缓冲区中获得物品,然后释放缓冲区。由于生产者/消费者都在操作缓冲区,容易导致死锁的发生。
可以通过添加锁的保护来对缓冲区进行互斥的访问,保证某一时刻只有一个线程对缓冲区进行操作,当缓冲区满的时候,生产者线程就会挂起,同时通知消费者线程。而缓冲区空的时候,消费者线程就会挂起,同时通知生产者线程。

 

3、列举编写一个TCP的服务器端程序可能需要用到的socket API,如果这些API的调用有先后关系,请按先后关系列出。

 

posted on 2015-08-14 14:10  chunlanse2014  阅读(258)  评论(0编辑  收藏  举报