我要投稿 投诉建议

面试试题c++面试题

时间:2025-09-19 07:37:34 面试试题 我要投稿
  • 相关推荐

面试试题c++面试题

  在学习、工作中,我们都离不开试题,试题是用于考试的题目,要求按照标准回答。大家知道什么样的试题才是好试题吗?以下是小编为大家收集的面试试题c++面试题,希望对大家有所帮助。

面试试题c++面试题

面试试题c++面试题1

  【网络综合 - 求职招聘试题】

  1. C++的类和C里面的struct有什么区别?

  struct成员默认访问权限为public,而class成员默认访问权限为private

  2. 析构函数和虚函数的用法和作用

  析构函数是在对象生存期结束时自动调用的函数,用来释放在构造函数分配的内存。

  虚函数是指被关键字virtual说明的函数,作用是使用C++语言的多态特性

  3. 全局变量和局部变量有什么区别?是怎么实现的?操作系统和编译器是怎么知道的?

  1) 全局变量的作用用这个程序块,而局部变量作用于当前函数

  2) 前者在内存中分配在全局数据区,后者分配在栈区

  3) 生命周期不同:全局变量随主程序创建和创建,随主程序销毁而销毁,局部变量在局部函数内部,甚至局部循环体等内部存在,退出就不存在

  4) 使用方式不同:通过声明后全局变量程序的各个部分都可以用到,局部变量只能在局部使用

  4. 有N个大小不等的自然数(1–N),请将它们由小到大排序.要求程序算法:时间复杂度为O(n),空间复杂度为O(1)。

  void sort(int e[], int n)

  {

  int i;

  int t;

  for (i=1; i {

  t = e[e[i]];

  e[e[i]] = e[i];

  e[i] = t;

  }

  }

  5. 堆与栈的去区别

  A. 申请方式不同

  Stack由系统自动分配,而heap需要程序员自己申请,并指明大小。

  B. 申请后系统的响应不同

  Stack:只要栈的剩余空间大于申请空间,系统就为程序提供内存,否则将抛出栈溢出异常

  Heap:当系统收到程序申请时,先遍历操作系统中记录空闲内存地址的链表,寻找第一个大于所申请空间的堆结点,然后将该结点从空间结点链表中删 除,并将该结点的空间分配给程序。另外,大多数系统还会在这块内存空间中的首地址处记录本次分配的大小,以便于语句正确释放空间。而且,由于 找到的堆结点的大小不一定正好等于申请的大小,系统会自动将多余的那部分重新放入空闲链表。

  C. 申请大小限制的不同

  Stack:在windows下,栈的大小是2M(也可能是1M它是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。

  Heap:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。

  D. 申请效率的比较:

  栈由系统自动分配,速度较快。但程序员是无法控制的。

  堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便。

  另外,在WINDOWS下,最好的方式是用VirtualAlloc分配内存,他不是在堆,也不是在栈是直接在进程的地址空间中保留一快内存,虽然用起来最不方便。但是速度快,也最灵活。

  E. 堆和栈中的存储内容

  栈:在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器 中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开 始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。

  堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。

  6. 含参数的宏与函数的优缺点

  宏: 优点:在预处理阶段完成,不占用编译时间,同时,省去了函数调用的开销,运行效率高

  缺点:不进行类型检查,多次宏替换会导致代码体积变大,而且由于宏本质上是字符串替换,故可能会由于一些参数的副作用导致得出错误的结果。

  函数: 优点:没有带参数宏可能导致的副作用,进行类型检查,计算的正确性更有保证。

  缺点:函数调用需要参数、返回地址等的入栈、出栈开销,效率没有带参数宏高

  PS:宏与内联函数的区别

  内联函数和宏都是在程序出现的地方展开,内联函数不是通过函数调用实现的,是在调用该函数的程序处将它展开(在编译期间完成的);宏同样是;

  不同的是:内联函数可以在编译期间完成诸如类型检测,语句是否正确等编译功能;宏就不具有这样的功能,而且宏展开的时间和内联函数也是不同的(在运行期间展开)

  7. Windows程序的入口是哪里?写出Windows消息机制的流程

  Windows程序的入口是WinMain()函数数。

  Windows应用程序消息处理机制:

  A. 操作系统接收应用程序的窗口消息,将消息投递到该应用程序的消息队列中

  B. 应用程序在消息循环中调用GetMessage函数从消息队列中取出一条一条的消息,取出消息后,应用程序可以对消息进行一些预处理。

  C. 应用程序调用DispatchMessage,将消息回传给操作系统。

  D. 系统利用WNDCLASS结构体的lpfnWndProc成员保存的窗口过程函数的指针调用窗口过程,对消息进行处理。

  8. 如何定义和实现一个类的成员函数为回调函数

  A.什么是回调函数?

  简而言之,回调函数就是被调用者回头调用调用者的函数。

  使用回调函数实际上就是在调用某个函数(通常是API函数)时,将自己的一个函数(这个函数为回调函数)的地址作为参数传递给那个被调用函数。而该被调用函数在需要的时候,利用传递的地址调用回调函数。

  回调函数,就是由你自己写的,你需要调用另外一个函数,而这个函数的其中一个参数,就是你的这个回调函数名。这样,系统在必要的时候,就会调用你写的回调函数,这样你就可以在回调函数里完成你要做的事。

  B.如何定义和实现一个类的成员函数为回调函数

  要定义和实现一个类的成员函数为回调函数需要做三件事:

  a.声明;

  b.定义;

  c.设置触发条件,就是在你的.函数中把你的回调函数名作为一个参数,以便系统调用

  如:

  一、声明回调函数类型

  typedef void (*FunPtr)(void);

  二、定义回调函数

  class A

  {

  public:

  A();

  static void callBackFun(void) //回调函数,必须声明为static

  {

  cout<<"callBackFun"<

  }

  virtual ~A();

  };

  三、设置触发条件

  void Funtype(FunPtr p)

  {

  p();

  }

  void main(void)

  {

  Funtype(A::callBackFun);

  }

  C. 回调函数与API函数

  回调和API非常接近,他们的共性都是跨层调用的函数。但区别是API是低层提供给高层的调用,一般这个函数对高层都是已知的;而回调正好相反, 他是高层提供给底层的调用,对于低层他是未知的,必须由高层进行安装,这个安装函数其实就是一个低层提供的API,安装后低层不知道这个回调的名字,但它 通过一个函数指针来保存这个回调函数,在需要调用时,只需引用这个函数指针和相关的参数指针。

  其实:回调就是该函数写在高层,低层通过一个函数指针保存这个函数,在某个事件的触发下,低层通过该函数指针调用高层那个函数。

  1、局部变量能否和全局变量重名?

  能,局部会屏蔽全局。要用全局变量,需要使用"::"

  局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。

  2、如何引用一个已经定义过的全局变量?

  extern

  可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。

  3、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?

  可以,在不同的C文件中以static形式来声明同名全局变量。

  可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错。

  4、语句for( ;1 ;)有什么问题?它是什么意思?

  无限循环,和while(1)相同。

  5、do……while和while……do有什么区别?

  前一个循环一遍再判断,后一个判断以后再循环。

  6、请写出下列代码的输出内容

  #include

  main()

  {

  int a,b,c,d;

  a=10;

  b=a++;

  c=++a;

  d=10*a++;

  printf(“b,c,d:%d,%d,%d”,b,c,d);

  return 0;

  }

  答:10,12,120

  7、请找出下面代码中的所以错误

  说明:以下代码是把一个字符串倒序,如“abcd”倒序后变为“dcba”

  #include “string.h”

  main()

  {

  char*src=”hello,world”;

  char* dest=NULL;

  int len=strlen(src);

  dest=(char*)malloc(len);

  char* d=dest;

  char* s=src[len];

  while(len–!=0)

  d++=s–;

  printf(“%s”,dest);

  return 0;

  }

  答:

  方法1:

  int main()

  {

  char* src = “hello,world”;

  int len = strlen(src);

  char* dest = (char*)malloc(len+1);//要为分配一个空间

  char* d = dest;

  char* s = &src[len-1];//指向最后一个字符

  while( len– != 0 )

  *d++=*s–;

  *d = 0;//尾部要加

  printf(“%s ”,dest);

  free(dest);// 使用完,应当释放空间,以免造成内存汇泄露

  return 0;

  }

  方法2:

  #include

  #include

  main()

  {

  char str[]=”hello,world”;

  int len=strlen(str);

  char t;

  for(int i=0; i {

  t=str[i];

  str[i]=str[len-i-1]; str[len-i-1]=t;

  }

  printf("%s",str);

  return 0;

  }

  8、-1,2,7,28,,126请问28和126中间那个数是什么?为什么?

  答案应该是4^3-1=63

  规律是n^3-1(当n为偶数0,2,4)

  n^3+1(当n为奇数1,3,5)

  答案:63

  9、用两个栈实现一个队列的功能?要求给出算法和思路!

  设2个栈为A,B, 一开始均为空.

  入队:

  将新元素push入栈A;

  出队:

  (1)判断栈B是否为空;

  (2)如果不为空,则将栈A中所有元素依次pop出并push到栈B;

  (3)将栈B的栈顶元素pop出;这样实现的队列入队和出队的平摊复杂度都还是O(1), 比上面的几种方法要好。

  10、在c语言库函数中将一个字符转换成整型的函数是atool()吗,这个函数的原型是什么?

  函数名: atol

  功 能: 把字符串转换成长整型数

  用 法: long atol(const char *nptr);

  程序例:

  #include

  #include

  int main(void)

  {

  long l;

  char *str = “98765432″;

  l = atol(lstr);

  printf(“string = %s integer = %ld ”, str, l);

  return(0);

  }

  11、对于一个频繁使用的短小函数,在C语言中应用什么实现,在C++中应用什么实现?

  c用宏定义,c++用inline

  12、直接链接两个信令点的一组链路称作什么?

  PPP点到点连接

  13、接入网用的是什么接口?

  14、voip都用了那些协议?

  15、软件测试都有那些种类?

  黑盒:针对系统功能的测试 白合:测试函数功能,各函数接口

  16、确定模块的功能和模块的接口是在软件设计的那个队段完成的?

  概要设计阶段

  17、enum string

  {

  x1,

  x2,

  x3=10,

  x4,

  x5,

  }x;

  问x= 0×801005,0x8010f4;

  18、unsigned char *p1;

  unsigned long *p2;

  p1=(unsigned char *)0×801000;

  p2=(unsigned long *)0×810000;

  请问p1+5= 0×801005;

  p2+5= 0×801014;

  19. 多态的作用?

  主要是两个:1. 隐藏实现细节,使得代码能够模块化;扩展代码模块,实现代码重用;2. 接口重用:为了类在继承和派生的时候,保证使用家族中任一类的实例的某一属性时的正确调用。

  20. Ado与Ado.net的相同与不同?

  除了“能够让应用程序处理存储于DBMS 中的数据“这一基本相似点外,两者没有太多共同之处。但是Ado使用OLE DB 接口并基于微软的 COM 技术,而ADO.NET 拥有自己的ADO.NET 接口并且基于微软的NET 体系架构。众所周知.NET 体系不同于COM 体 系,ADO.NET 接口也就完全不同于ADO和OLE DB 接口,这也就是说ADO.NET 和ADO是两种数据访问方式。ADO.net 提供对 XML 的支持。

  21. New 与malloc free 的联系与区别?

  都是在堆(heap)上进行动态的内存操作。用malloc函数需要指定内存分配的字节数并且不能初始化对象,new 会自动调用对象的构造函数。 会调用对象的destructor,而free 不会调用对象的destructor.

  22. #define DOUBLE(x) x+x ,i = 5*DOUBLE(5); i 是多少?

  答案:i 为30。

面试试题c++面试题2

  请填写bool , float, 指针变量 与"零值"比较的 if 语句。

  头文件中的 ifndef/define/endif 干什么用?

  #include 和 #include "filename.h" 有什么区别?

  const 有什么用途?(请至少说明两种)

  在c++ 程序中调用被 c编译器编译后的函数,为什么要加 extern "c"声明?

  const 与 #define有什么不同

  答案: 1. const 常量有数据类型,而宏没有数据类型。编译器可以对const 常量进行类型检查,而对宏只进行字符替换没有类型检查。

  2. 有些编译器可以对const常量进行调试,但不能对宏常量进行调试

  3. const 可以用来修饰函数参数、函数返回值,c++还可以用来修饰函数,定义内中某个成员函数为常量函数

  写一个"标准"宏min,这个宏输入两个参数并返回较小的一个。

  预处理器标识#error的目的是什么?

  嵌入式系统中经常要用到无限循环,你怎么样用c编写死循环呢?

  关键字static的作用是什么?

  这个简单的问题很少有人能回答完全。在c语言中,关键字static有三个明显的作用:

  1). 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。

  2). 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。

  3). 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。

  大多数应试者能正确回答第一部分,一部分能正确回答第二部分,同是很少的人能懂得第三部分。这是一个应试者的严重的缺点,因为他显然不懂得本地化数据和代码范围的好处和重要性。

  关键字volatile有什么含意 并给出三个不同的例子。

  一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的'备份。下面是volatile变量的几个例子:

  1). 并行设备的硬件寄存器(如:状态寄存器)

  2). 一个中断服务子程序中会访问到的非自动变量(non-automatic variables)

  3). 多线程应用中被几个任务共享的变量

  回答不出这个问题的人是不会被雇佣的。我认为这是区分c程序员和嵌入式系统程序员的最基本的问题。嵌入式系统程序员经常同硬件、中断、rtos等等打交道,所用这些都要求volatile变量。不懂得volatile内容将会带来灾难。

  请问c++的类和c里面的struct有什么区别?

  请讲一讲析构函数和虚函数的用法和作用?

  全局变量和局部变量有什么区别?实怎么实现的?操作系统和编译器是怎么知道的?

【面试试题c++面试题】相关文章:

面试题及答案02-06

android面试题08-16

求职面试题11-27

Java面试题09-27

公司面试题08-07

面试技巧HR的经典面试题01-10

分析面试题范文10-28

高校招聘面试题09-27

Java框架面试题12-17

中兴面试题及解析08-15