C++⾯试集锦(⾯试被问到的问题)
1. C 和 C++ 区别
2. const 有什么⽤途
主要有三点:
1:定义只读变量,即常量
2:修饰函数的参数和函数的返回值
3:修饰函数的定义体,这⾥的函数为类的成员函数,被const修饰的成员函数代表不修改成员变量的值
3. 指针和引⽤的区别
1:引⽤是变量的⼀个别名,内部实现是只读指针
2:引⽤只能在初始化时被赋值,其他时候值不能被改变,指针的值可以在任何时候被改变
3:引⽤不能为NULL,指针可以为NULL
4:引⽤变量内存单元保存的是被引⽤变量的地址
5:“sizeof 引⽤" = 指向变量的⼤⼩, "sizeof 指针"= 指针本⾝的⼤⼩
6:引⽤可以取地址操作,返回的是被引⽤变量本⾝所在的内存单元地址
7:引⽤使⽤在源代码级相当于普通的变量⼀样使⽤,做函数参数时,内部传递的实际是变量地址
4. C++中有了malloc / free , 为什么还需要 new / delete
1,malloc与free是C++/C语⾔的标准库函数,new/delete是C++的运算符。它们都可⽤于申请动态内存和释放内存。
2,对于⾮内部数据类型的对象⽽⾔,光⽤maloc/free⽆法满⾜动态对象的要求。
对象在创建的同时要⾃动执⾏构造函数,对象在消亡之前要⾃动执⾏析构函数。
由于malloc/free是库函数⽽不是运算符,不在编译器控制权限之内,不能够把执⾏构造函数和析构函数的任务强加于malloc/free。
3,因此C++语⾔需要⼀个能完成动态内存分配和初始化⼯作的运算符new,以⼀个能完成清理与释放内
存⼯作的运算符delete。注意new/delete不是库函数。
5. 编写类String 的构造函数,析构函数,拷贝构造函数和赋值函数
6. 多态的实现
7. 单链表的逆置
8. 堆和栈的区别
⼀个由c/C++编译的程序占⽤的内存分为以下⼏个部分
1、栈区(stack)―由编译器⾃动分配释放,存放函数的参数值,局部变量的值等。其操作⽅式类似于数据结构中的栈。
2、堆区(heap)―⼀般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。
注意它与数据结构中的堆是两回事,分配⽅式倒是类似于链表,呵呵。
3、全局区(静态区)(static)―,全局变量和静态变量的存储是放在⼀块的,
初始化的全局变量和静态变量在⼀块区域,未初始化的全局变量和未初始化的静态变量在相邻的另⼀块区域。 - 程序结束后有系统释放
4、⽂字常量区―常量字符串就是放在这⾥的。程序结束后由系统释放
5、程序代码区―存放函数体的⼆进制代码。
10. 不调⽤C/C++ 的字符串库函数,编写strcpy
char * strcpy(char * strDest,const char * strSrc)
{
if ((strDest==NULL)||strSrc==NULL))
return NULL;
char * strDestCopy=strDest;
while ((*strDest++=*strSrc++)!='\0');
*strDest = '\0';
return strDestCopy;
}
11. 关键字static的作⽤
1.  函数体内 static 变量的作⽤范围为该函数体,不同于 auto 变量,该变量的内存只被分配⼀次,因此其值在下次调⽤时仍维持上次的值
2.  在模块内的 static 全局变量可以被模块内所有函数访问,但不能被模块外其他函数访问
3.  在模块内的static 函数只可被这⼀模块内的其他函数调⽤,这个函数的使⽤范围被限制在声明它的模块内
4.  在类的static 成员变量属于整个类所拥有,对类的所以对象只有⼀份拷贝
5.  在类中的 static 成员函数属于整个类所拥有,这个函数不接收 this 指针,因⽽只能访问类的 static 成员变量
介绍它最重要的⼀条:隐藏。(static函数,static变量均可) --> 对应上⾯的2、3项
当同时编译多个⽂件时,所有未加static前缀的全局变量和函数都具有全局可见性。
举例来说明。同时编译两个源⽂件,⼀个是a.c,另⼀个是main.c。
//a.c
char a = 'A';              // global variable
void msg()
{
printf("Hello\n");
}
//main.c
int main()
{
extern char a;      // extern variable must be declared before use
printf("%c ", a);
(void)msg();
return 0;
}
程序的运⾏结果是:
A Hello
为什么在a.c中定义的全局变量a和函数msg能在main.c中使⽤?
前⾯说过,所有未加static前缀的全局变量和函数都具有全局可见性,其它的源⽂件也能访问。此例中,a是全局变量,msg是函数,并且都没有加static前缀,
因此对于另外的源⽂件main.c是可见的。
如果加了static,就会对其它源⽂件隐藏。例如在a和msg的定义前加上static,main.c就看不到它们了。
利⽤这⼀特性可以在不同的⽂件中定义同名函数和同名变量,⽽不必担⼼命名冲突。static可以⽤作函数和变量的前缀,对于函数来
讲,static的作⽤仅限于隐藏
12. 在c++程序中调⽤被C编译器编译后的函数,为什么要加extern“C”
C++语⾔⽀持函数重载,不⽀持函数重载,函数被C++编译器编译后在库中的名字与C语⾔的不同,
假设某个函数原型为:
1.          void foo(int x, inty);
该函数被C编译器编译后在库中的名字为:  _foo
⽽C++编译器则会产⽣像: _foo_int_int  之类的名字。
为了解决此类名字匹配的问题,C++提供了C链接交换指定符号 extern "C"。
13. 头⽂件种的ifndef/define/endif 是⼲什么⽤的
防⽌头⽂件被重复包含
14. 线程和进程的联系和区别
blog.csdn/wolenski/article/details/7969908
15. 线程有哪⼏种状态
blog.csdn/wolenski/article/details/7969908
16. 进程间的通信⽅式
管道、有名管道、信号、共享内存、消息队列、信号量、套接字、⽂件.
17. 线程同步和线程互斥的区别
blog.csdn/wolenski/article/details/7969908
18. 线程同步的⽅式
:  互斥锁、条件变量和信号量
blog.csdn/zsf8701/article/details/7844316
19. ⽹络七层
20. TCP和UDP有什么区别
TCP---传输控制协议,提供的是⾯向连接、可靠的字节流服务。
当客户和服务器彼此交换数据前,必须先在双⽅之间建⽴⼀个TCP连接,之后才能传输数据。
TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从⼀端传到另⼀端。
UDP---⽤户数据报协议,是⼀个简单的⾯向数据报的运输层协议。
UDP不提供可靠性,它只是把应⽤程序传给IP层的数据报发送出去,但是并不能保证它们能到达⽬的地。
由于UDP在传输数据报前不⽤在客户和服务器之间建⽴⼀个连接,且没有超时重发等机制,故⽽传输速度很快
21. 编写socket套接字的步骤
22. TCP三次握⼿和四次挥⼿, 以及各个状态的作⽤
hi.baidu/suxinpingtao51/item/be5f71b3a907dbef4ec7fd0e?qq-pf-to=pcqq.c2c
23. HTTP协议
http(超⽂本传输协议)是⼀个基于请求与响应模式的、⽆状态的、应⽤层的协议,常基于TCP的连接⽅式,
HTTP1.1版本中给出⼀种持续连接的机制,绝⼤多数的Web开发,都是构建在HTTP协议之上的Web应⽤。
TCP 和 HTTP区别: blog.csdn/lemonxuexue/article/details/4485877
24. 使⽤过的 shell 命令
cp , mv , rm , mkdir , touch , pwd , cd  , ls , top , cat , tail , less , df , du , man , find , kill , sudo , cat
25. 使⽤过的 vim 命令
wq!, dd , dw , yy , p , i , %s/old/new/g , /abc 向后搜索字符串abc ,?abc向前搜索字符串abc
26. 使⽤过的 gdb 命令
blog.csdn/dadalan/article/details/3758025
27. 常见
快速排序、堆排序和归并排序
堆排序: blog.csdn/xiaoxiaoxuewen/article/details/7570621
快速排序、归并排序: blog.csdn/morewindows/article/details/6684558
稳定性分析 baike.baidu/link?url=ueoZ3sNIOvMNPrdCKbd8mhfebC85B4nRc-7hPEJWi-hFo5ROyWH2Pxs9RtvLFRJL
28. C库函数实现
29. 静态链表和动态链表的区别
blog.csdn/toonny1985/article/details/4868786
31. ⼤并发( epoll )
优点:
blog.csdn/sunyurun/article/details/8194979
实例:
wwwblogs/ggjucheng/archive/2012/01/17/2324974.html
32. 海量数据处理的知识点,(hash表, hash统计)
hash表: hi.baidu/05104106/item/62736054402852c09e26679b
海量数据处理⽅法: blog.csdn/v_july_v/article/details/7382693
33. 什么时候要⽤虚析构函数
通过基类的指针来删除派⽣类的对象时,基类的析构函数应该是虚的。否则其删除效果将⽆法实现。
⼀般情况下,这样的删除只能够删除基类对象,⽽不能删除⼦类对象,形成了删除⼀半形象,从⽽千万内存泄漏。
原因:
在公有继承中,基类对派⽣类及其对象的操作,只能影响到那些从基类继承下来的成员。
如果想要⽤基类对⾮继承成员进⾏操作,则要把基类的这个操作(函数)定义为虚函数。
那么,析构函数⾃然也应该如此:如果它想析构⼦类中的重新定义或新的成员及对象,当然也应该声明为虚的。
注意:
如果不需要基类对派⽣类及对象进⾏操作,则不能定义虚函数(包括虚析构函数),因为这样会增加内存开销。
34. c++怎样让返回对象的函数不调⽤拷贝构造函数
拷贝构造函数前加 “explicit” 关键字
35. 孤⼉进程和僵⼫进程
wwwblogs/Anker/p/3271773.html
各⼤计算机公司笔试及⾯试题⽬
blog.csdn/huyfaeng/article/category/880022
⾯试题有难有易,不能因为容易,我们就轻视,更不能因为难,我们就放弃。我们⾯对⾼薪就业的态度永远不变,那就是坚持、坚持、再坚持。出现问题,原因;遇到困难,想办法。我们⼀直坚信只有在坚持中才能看到希望,⽽不是看到希望才去坚持。
⼈⽣没有如果,只有结果和后果。既然选择了,就不后悔。年轻就是资本,年轻就要吃苦,就要历练。就要学会在坚持中成长。如此感慨,⾄深的⼼得体会,绝对的经验之谈。
OK,进⼊正题,下⾯就是《必须掌握的20道技术⾯试题》。
问1:请⽤简单的语⾔告诉我C++ 是什么?
答:C++是在C语⾔的基础上开发的⼀种⾯向对象编程语⾔,应⽤⼴泛。C++⽀持多种编程范式--⾯向对象编程、泛型编程和过程化编程。其编程领域众⼴,常⽤于系统开发,引擎开发等应⽤领域,是最受⼴⼤程序员受⽤的最强⼤编程语⾔之⼀,⽀持类:类、封装、重载等特性!
问2:C和C++的区别?
答:c++在c的基础上增添类,C是⼀个结构化语⾔,它的重点在于算法和数据结构。C程序的设计⾸要考虑的是如何通过⼀个过程,对输⼊(或环境条件)进⾏运算处理得到输出(或实现过程(事务)控制),⽽对于C++,⾸要考虑的是如何构造⼀个对象模型,让这个模型能够契合与之对应的问题域,这
样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。
问3:什么是⾯向对象(OOP)?
答:⾯向对象是⼀种对现实世界理解和抽象的⽅法、思想,通过将需求要素转化为对象进⾏问题处理的⼀种思想。
问4:什么是多态?printf函数原型在什么头文件里
答:多态是指相同的操作或函数、过程可作⽤于多种类型的对象上并获得不同的结果。不同的对象,收到同⼀消息可以产⽣不同的结果,这种现象称为多态。
问5:设计模式懂嘛,简单举个例⼦?
答:设计模式(Design pattern)是⼀套被反复使⽤、多数⼈知晓的、经过分类编⽬的、代码设计经验的总结。
⽐如单例模式,保证⼀个类仅有⼀个实例,并提供⼀个访问它的全局访问点。
适⽤于:当类只能有⼀个实例⽽且客户可以从⼀个众所周知的访问点访问它时;当这个唯⼀实例应该是通过⼦类化可扩展的,并且客户应该⽆需更改代码就能使⽤⼀个扩展的实例时。
⽐如⼯⼚模式,定义⼀个⽤于创建对象的接⼝,让⼦类决定实例化哪⼀个类。Factory Method 使⼀个类的实例化延迟到其⼦类。
适⽤于:当⼀个类不知道它所必须创建的对象的类的时候;当⼀个类希望由它的⼦类来指定它所创建的对象的时候;当类将创建对象的职责委托给多个帮助⼦类中的某⼀个,并且你希望将哪⼀个帮助⼦类是代理者这⼀信息局部化的时候。
问6:STL库⽤过吗?常见的STL容器有哪些?算法⽤过哪⼏个?
答:STL包括两部分内容:容器和算法。(重要的还有融合这⼆者的迭代器)
容器,即存放数据的地⽅。⽐如array等。