C++面试题

来源:互联网 发布:pi实时数据库 编辑:程序博客网 时间:2024/06/05 12:46

 一 简答题
1.static有什么用途?(请至少说明两种)

C:
1.修饰局部变量, 延长其生命周期, 分配在静态数据区。(不会随函数结束而消亡)

2.修饰全局变量,则限制该变量作用范围为本文件。允许其他文件中有和它同名的全局变量。

3.修饰函数,同样限制函数为静态函数,作用域限制在同一个模块(文件)中,不能被外部extern使用。允许其他模块有同名的函数?
C++

1. 类当中的静态数据成员。  对于类中的普通数据成员来说, 我们每一次实例化对象时都会为其分配空间。对于每个类对象都有一份拷贝。 但是静态数据成员在程序中只有一份拷贝, 由该类型的所有对象访问。

静态数据成员存储在全局数据区。静态数据成员定义时要分配空间, 故不能在类声明中定义。

由于静态数据成员在全局数据区分配内存,属于本类的所有对象共享,所以, 它不属于特定的类对象,在没有产生类对象时其作用域就可见, 即在没有产生类的实例时,我们可以操作它。

和全局变量相比, 静态数据成员的好处:1.没有进入程序的全局名字空间, 不存在和其它全局名字冲突的可能性。

                                                                          2.可以声明为private属性, 实现对外部的隐藏。

2.静态成员函数。为类的全部服务而不是为某一类的具体对象服务。普通的成员函数一般隐含了一个this指针, this指针指向类的对象本身,普通成员函数总是具体的属于某个类的对象的。通常情况下, this是缺省的。如函数fn()实际上是this->fn()。 但静态函数不与任何对象相联系, 因此它不具有this指针。故它无法访问属于类的非静态数据成员, 也无法访问非静态成员函数,它只能调用静态成员函数和访问静态成员数据。

2.引用与指针有什么区别?
引用仅仅是一份变量的拷贝。即相当于一个固定指向该变量的指针。故它必须初始化并且不能被改变。相当于一个特殊的指针。

3.描述实时系统的基本特性
实时性, 可靠性。

4.全局变量和局部变量在内存中是否有区别?如果有,是什么区别?
全局变量存在于静态数据区。 局部变量存在于栈区。

在ARM中,初始化成非0的全局变量存在于RW区, 初始化为0或者没有初始化的全局变量存在于ZI。
5.什么是平衡二叉树?


6.堆栈溢出一般是由什么原因导致的?
局部变量过多,局部数组过大。函数调用过长?

7.什么函数不能声明为虚函数?
构造函数不能声明为虚函数。

虚函数是执行时多态的体现。即其具体实现只有在执行时才能决定。(具体是哪个子类执行)各个子类都可以对虚函数进行具体实现而不必继承父类虚函数的实现(和普通函数的区别)。

8.冒泡排序算法的时间复杂度是什么?
O(n^2)

9.写出float x 与“零值”比较的if语句。
if(x >-0.00001 && x < 0.00001)。

10.Internet采用哪种网络协议?该协议的主要层次结构?
TCP/IP.

应用层,会话层,表示层,传输层,网络层,数据链路层,物理层

11.Internet物理地址和IP地址转换采用什么协议?
ARP地址解析协议。


12.IP地址的编码分为哪俩部分?
主机号和网络号。

13.用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。写出C程序。
  循环链表,用取余操作做
   


14.写出判断ABCD四个表达式的是否正确, 若正确, 写出经过表达式中 a的值(3分)
int a = 4;
(A)a += (a++); (B) a += (++a) ;(C) (a++) += a;(D) (++a) += (a++);
a = ?

int a=4;
a+=(a++);//9?
printf("a=%d\n",a);


a=4;
a+=(++a);//10?
printf("a=%d\n",a);

//a=4;
//(a++)+=a;//'+=' : left operand must be l-value
//printf("a=%d\n",a);

a=4;
(++a) += (a++);//11?
printf("a=%d\n",a);



15.某32位系统下, C++程序,请计算sizeof 的值(5分).
char str[] = “http://www.ibegroup.com/”
char *p = str ;
int n = 10;
请计算
sizeof (str ) = ?(1)25
sizeof ( p ) = ?(2)4
sizeof ( n ) = ?(3)4


void Foo ( char str[100])
{
请计算
sizeof( str ) = ?(4)4
}

void *p = malloc( 100 );
请计算
sizeof ( p ) = ?(5)4

16.头文件中的 ifndef/define/endif 干什么用?
防止头文件被重复包含。

17. #include< filename> 和 #include “filename.h” 有什么区别?
前者从标准路经下面寻找头文件包含,后者先从本地路经搜索该头文件,如果没有才去系统默认路径搜索。

18.在C++ 程序中调用被 C 编译器编译后的函数,为什么要加 extern “C”声明?
C++不能直接调用C函数,因为函数在C++中编译后的函数名在符号库中名字与C中不同,所以使用extern "C"修饰函数按照C语言的方式编译和连接。

19. switch()中不允许的数据类型是?

float?

20.Void GetMemory(char **p, int num){
*p = (char *)malloc(num);
}
void Test(void){
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
}
请问运行Test 函数会有什么样的结果?


21. void Test(void){
char *str = (char *) malloc(100);
strcpy(str, “hello”);
free(str);
if(str != NULL){
strcpy(str, “world”);
printf(str);
}
}
请问运行Test 函数会有什么样的结果?


22. char *GetMemory(void){
char p[] = "hello world";
return p;
}
void Test(void){
char *str = NULL;
str = GetMemory();
printf(str);
}


23. 编写strcat函数
已知strcat函数的原型是char *strcat (char *strDest, const char *strSrc);
其中strDest 是目的字符串,strSrc 是源字符串。

(1)不调用C++/C 的字符串库函数,请编写函数 strcat

(2)strcat能把strSrc 的内容连接到strDest,为什么还要char * 类型的返回值?


24.MFC中CString是类型安全类么?





25.C++中为什么用模板类。


26.CSingleLock是干什么的。


27.NEWTEXTMETRIC 是什么。


28.程序什么时候应该使用线程,什么时候单线程效率高。


29.Windows是内核级线程么。


30.Linux有内核级线程么。


31.C++中什么数据分配在栈或堆中,New分配数据是在近堆还是远堆中?


32.使用线程是如何防止出现大的波峰。


33.函数模板与类模板有什么区别?


34.一般数据库若出现日志满了,会出现什么情况,是否还能使用?


35.如果数据库满了会出现什么情况,是否还能使用?


36.SQL Server是否支持行级锁,有什么好处?


37.关于内存对齐的问题以及sizof()的输出 



38.int i=20, j=10, k=2; k*=i+j; k最后的值是?


39.对数据库的一张表进行操作,同时要对另一张表进行操作,如何实现?


40.TCP/IP 建立连接的过程?(3-way shake)


41.ICMP是什么协议,处于哪一层?


42.触发器怎么工作的?


43.winsock建立连接的主要实现步骤?


44.动态连接库的两种方式?


45.IP组播有那些好处?


46.软件的开发流程?


47.char str[] = “hello”,sizeof (str ) = ________ strlen ( str ) = __________


48.类和结构的区别?


49.简述下虚拟函数的含义?


50.类中访问权限private,protested,prublic,可以被何种访问?


51.解释下面的含义:
int *pTemp = new int ( 5 );
int *pTemp = new int[5];




二 编程题
题目:有n 个人,他们围成一个圈,从第一个人开始数数(第一个人默认为1号,一直到n 号),数1,2,3,当数到3的人则退出这个圈,后面的继续数,一直进行,问到最后是否只剩一个人,如果是,这个人的编号是多少?


题目:写一个memcpy函数。


题目:写一个双向链表的插入函数。
原型如下:
struct node
{
node *head;
node *end;
int value;
}

void createnode(node **head, node **end, int val);

int main()
{
node *head = NULL;
node *end = NULL;
createnode(head, end, 1);
createnode(head, end, 1);
createnode(head, end, 1);
return 0;
}
 

 

 

 

  

 

 

 

 

 

部分的简答题答案。只做参考用。

一 简答题
1.static有什么用途?(请至少说明两种)
在函数中,一个声明为静态的变量在函数调用的过程中其值不变。
在模块中(函数外),一个声明为静态的变量只能由模块中的函数访问,也就是一个本地的全局变量
在模块中,一个声明为静态的函数只能由模块内的其他函数调用,这个函数被限制在了声明它的模块的本地范围使用。


2.引用与指针有什么区别?
引用要初始化,指针可以不用。
引用不能初始化为空, 指针可以。
引用和指针的自增运算意义不同。
引用初始化后不能改变指向的地址,指针可以。
sizeof引用得到的是引用指向对象的大小,sizeof指针得到的是指针本身的大小。


3.描述实时系统的基本特性
在特定的时间完成特定的任务,具有实时性和可靠性。


4.全局变量和局部变量在内存中是否有区别?如果有,是什么区别?
有区别,全局变量的存储区域是静态存储区,局部变量的存储区域是栈。


5.什么是平衡二叉树?
左右子树都是平衡二叉树,并且左右子树的深度差值的绝对值不大于1。


6.堆栈溢出一般是由什么原因导致的?
没有回收垃圾资源。


7.什么函数不能声明为虚函数?
构造函数。


8.冒泡排序算法的时间复杂度是什么?
0(n ^ 2)。


9.写出float x 与“零值”比较的if语句。
if(x > 0.00001 && x < 0.00001)。


10.Internet采用哪种网络协议?该协议的主要层次结构?
Tcp/Ip协议,网络层、会话层、表示层、传输层、物理层、数据链层、应用层。


11.Internet物理地址和IP地址转换采用什么协议?
ARP地址解析协议。


12.IP地址的编码分为哪俩部分?
主机号和网络号


16.头文件中的 ifndef/define/endif 干什么用?
预处理,防止头文件被反复包含。


17. #include< filename> 和 #include “filename.h” 有什么区别?
#include<filename>搜索的是系统默认目录, #include"filename.h"搜索的是本地目录,如果没有则搜索系统默认目录。


18.在C++ 程序中调用被 C 编译器编译后的函数,为什么要加 extern “C”声明?
C++不能直接调用C函数,因为函数在C++中编译后的函数名在符号库中名字与C中不同,所以使用extern "C"修饰函数按照C语言的方式编译和连接。


19. switch()中不允许的数据类型是?
实型。


24.MFC中CString是类型安全类么?
不是,其他类型的变量可以通过CString中的Format来转换为CString类型。


25.C++中为什么用模板类。
与类型无关,具有很高的复用性。
与平台无关,具有可移植性。
可以创建一个动态增长或者减小的数据结构。
在编译时而不是运行时检查数据类型,保证了类型的安全。
适用基本数据类型。


26.CSingleLock是干什么的。
一种访问机制,在多线程程序中并发的访问一个资源。


27.NEWTEXTMETRIC 是什么。
物理字体结构,设置字体的高宽大小。


28.程序什么时候应该使用线程,什么时候单线程效率高。
耗时的程序中使用多线程,提高程序的响应。
多CPU系统使用多线程,提高CPU的使用率。
改善程序结构时,一个即长有复杂的进程可以考虑分解为多线程,成为一个独立或者半独立的运行部分,便于程序的理解和修改
并发操作时,如C/S中服务端并发响应客户端的请求。
其他情况使用单线程。


29.Windows是内核级线程么。


30.Linux有内核级线程么。


31.C++中什么数据分配在栈或堆中,new分配数据是在近堆还是远堆中?
局部变量、函数的返回值、函数调用的参数、函数的返回地址存储在栈区。
new和malloc申请的内存存储在堆区。


32.使用线程是如何防止出现大的波峰。
使用线程池,可以提高线程同时调用的效率和限制资源使用的好处,当线程池中的线程达到最大数时,其他线程就会排队等候。


33.函数模板与类模板有什么区别?
函数模板的实例化是编译程序在处理函数调用时自动完成,类模板的实例化需要程序员在程序中显实指定。


34.一般数据库若出现日志满了,会出现什么情况,是否还能使用?
只能进行查询等读操作,不能进行更改、备份等写操作,因为任何操作会记录到数据库的日志中。也就是数据库基本属于不能使用的状态。


35.如果数据库满了会出现什么情况,是否还能使用?
只能进行查询等读操作,不能进行更改、备份等写操作,因为任何操作会记录到数据库的日志中。也就是数据库基本属于不能使用的状态。


36.SQL Server是否支持行级锁,有什么好处?
支持,锁机制是为了对并发操作进行控制,对干扰操作进行了封锁,保证了数据的一致性和准确性。行级锁确保用户取得被更新的行到该行进行更新这段时间不会被其他用户所修改。因而行级锁保证了数据的一致性又能提高数据操作的并发性。


37.关于内存对齐的问题以及sizof()的输出 
内存自动对齐的是为了提高程序的性能,数据结构应该尽量在自然边界上,原因在于处理器访问未对齐的内存需要做两次内存访问,访问对齐的内存只需要访问一次。


39.对数据库的一张表进行操作,同时要对另一张表进行操作,如何实现?
将多个表的操作放到事物中处理。


40.TCP/IP 建立连接的过程?(3-way shake)
采用三次握手建立一个连接。
第一次握手:建立连接时,客户端发送SYN(ack = j + 1)到服务端,并进入到SYN_SEND状态,等待服务端确认。
第二次握手:服务端收到SYN(ack = j + 1)并确认,同时发送一个SYN + ACK包到客户端,然后进入SYN_RECV状态。
第三次握手:客户端收到SYN+ACK包后,向服务端发送确认包ACK(ack = k + 1)完毕后,客户端和服务端进入已确认状态,完成三次握手。


41.ICMP是什么协议,处于哪一层?
Internet控制报文协议,处于网络层。


42.触发器怎么工作的?
将多个表的操作放到事物中处理。


43.winsock建立连接的主要实现步骤?
务端:建立套接字socket(),绑定bind(),监听(listen()),然后等待客户端连接accept()。
客户端:建立套接字socket(),连接服务器connect(),连接上后使用send()和recv()在套接字上做读写操作,直到数据交换完毕后用closesocket()关闭套接字。
服务端:accept()收到客户端连接后,建立一个新的套接字,并重新开始等待连接。产生的套接字用send()和recv()做读写操作。数据交换完毕后用closesocket()关闭套接字。


44.动态连接库的两种方式?
载入时动态链接,模块明确的调用导出的函数,就像使用本地函数一样。需要链接时链接函数所在DLL的导入库,导入库向系统提供载入DLL时需要的信息和DLL的函数定位。
运行时动态链接,使用LoadLibrary或者LoadLibraryEx载入DLL。通过调用GetProcAddress获取DLL函数的出口地址。通过返回函数的指针调用DLL函数,避免导入库文件。


45.IP组播有那些好处?
组播是一种允许一个或者多个发送者发送单一的数据包到多个接收者的网络技术。组播可以节省大量网络宽带。无论有多少个目标地址,整个网络的任意一条链路上只传送单一的数据包。组播的核心技术就是在节约网络资源的前提下保证了服务质量。


46.软件的开发流程?
需求确认,概要设计,详细设计,编码,单元测试,集成测试,系统测试,维护。


48.类和结构的区别?
在c++中类默认的访问方式是private。结构默认访问方式是public。结构没有默认的构造函数。


49.简述下虚拟函数的含义?
虚函数必须是基类的非静态成员函数,其访问权限可以是protected或public。


50.类中访问权限private,protested,prublic,可以被何种访问?


51.解释下面的含义:
int *pTemp = new int ( 5 ); //初始化并赋值
int *pTemp = new int[5]; //申请一个大小为5的内存

另:
29.Windows是内核级线程么。
30.Linux有内核级线程么。

 

http://topic.csdn.net/u/20110427/11/DC14298B-2736-4EB0-98D0-A854AEF1196D.html

 

原创粉丝点击