c++常见面试题(1)

来源:互联网 发布:刀卡 淘宝 编辑:程序博客网 时间:2024/06/06 16:46

Heap(堆)和stack(栈)的区别

答:heap(堆)上的空间是手动分配与释放的,空间是很大的自由储存区。
stack(栈)上的空间是自动分配与释放的。空间是有限的,
全局变量与局部变量的区别
  1. 作用域不同:全局变量的作用域为整个程序,局部变量的作用域为当前语句块。
  2. 内存储存方式:全局变量在全局数据区(堆区),局部变量储存在栈上。
  3. 生命周期不同:全局变量的生命周期和程序一样,局部变量随着语句块的结束而结束。
  4. 当局部变量和全局变量同名时,优先使用局部变量,使用全局变量是要用域成员运算符("::")。
结构体与联合的区别
答:1.结构体与联合都是由不同的数据类型组成,但在任何时刻,联合只存在一个被选中的成员,结构体的所有成员都存在。
2.在结构体中,各成员占有自己的储存空间,总大小等于各成员的大小之和
3.在联合中,所有成员共用一块储存空间,其大小等于联合中最大成员的大小。
 
数组与指针的区别
答 1.数组要么在静态储存区,要么在栈上被创建。数组名对应着一块内存,其容量与地址在生命周期类保持不变。
2.指针可以随时指向任意类型的内存块,它的特征是可变。比数组灵活,但也危险。
 
指针函数与函数指针的区别
答:指针函数是一个函数,它返回值是一个指针。函数指针是一个指针,这个指针所指的对象是一个函数。
 
常量与变量的区别
答:1.常量是只读不可写,变量可读可写;
2.常量必须初始化, 变量可以不初始化;
3.常量不可以寻址,它的地址不可赋给非常量指针,变量可以寻址;
4.常量的效率比变量高。
 
指针自增自减与变量自增自减有什么区别
答:指针自增自减是改变指针所指的对象,变量自增自减是改变变量的值。
 
#error的作用是什么
答:编译程序时,只要遇到#error就会跳出一个编译错误。
 
#include<file.h> 与 #include”file.h”有什么区别
答:#include<file.h> 从标准头文件存放处查找,如果没有则报错
#include "file.h" 从用户当前的工作目录下查查,如果没找到则从标准头文件存放出查找
 
头文件中的 ifndef/define endif的作用?
答:防止头文件被重复引用。
 
常见的条件语句的比较的写法
答:1. bool  if(flag)建议使用 if(flag == true)不建议使用 true值的定义没有统一的标准。
2. int   if(value != 0)   if(value) 不建议使用  会让人误解为bool类型
3. float  if(x > -EPSINON && x < EPSINON) 建议使用  if(x == 0.0) 不建议使用 (精度问题)
4. 指针 if(p == NULL)建议使用强调p为指针 if(p == 0) 不建议,会让人误解为int类型
 
用#define实现宏并求最大值最小值
答:#define MAX(x,y) ((x) > (y))?(x):(y)
#define MIN(x,y) ((x) < (y))?(x):(y)
 
break语句与continue语句有什么区别
答:continue语句只能出现在循环语句内,表示结束本次循环,break语句还可以出现在switch语句内,表示结束switch语句。在循环语句类表示结束整个循环。
 
Static关键字
答 1.用于全局变量:表示该变量是静态全局变量。作用域为当前文件
2.用于函数:该函数为静态函数,只能在本文件中调用。静态函数在内存中只有一份,普通函数在内存中维持一份拷贝。
3.用于局部变量:为静态局部变量,只初始化一次,之后所使用的值为上次退出时的值。即改变变量的生存周期为整个程序运行时间段内。
4.用于成员函数:表示该函数属于此而不属于此类的任何对象,不能访问非静态变量和函数,该函数在该类中是唯一的。
5.用于成员变量:表示该变量属于此类而不属于此类的任何对象,该变量的初始化在类体外。
 
const关键字
答:1.修饰一般常量:修饰符可在类型说明符前也可以在类型说明符后例如 int const x=2; 或 const int x=2
2.修饰数组:修饰符可以在类型说明符前也可以在类型说明符后例如 int const a[5]={1, 2,3}; 或:const int a[5]={1, 2, 3};
3.修饰常指针
    const int *A;//const修饰指针指向的对象,指针可变,指针指向的对象不可变 
    int const *A;//const修饰指针指向的对象,指针可变,指针指向的对象不可变 
    int *const A; //const修饰指针, 指针不可变,指针指向的对象可变
 
const与宏的区别
答 编译时刻   宏:在预编译时刻     const:在编译时刻
编译检查    宏不会编译检查      const:有编译检查
宏的好处: 宏可以定义函数、方法等等  const:不可以
宏的坏处: 大量使用宏,会导致预编译的时间过长
 
带参宏与函数的区别
答:1.处理时间不同: 宏是在预编译时刻,函数是在运行时刻。
  2.带参宏没有参数类型,函数具有参数类型。
  3.带参宏不分配内存,函数需要分配内存。
  4.宏会使函数边长,函数不会。
  5.宏不占用运行时间,函数在调用时刻和返回时刻占用时间。
 
引用与指针的区别
答:1.非空区别:指针可以指向NULL,引用必须指向某个对象。
2.可修改区别:指针可以指向不同的对象,引用总是指向初始化的对象
3.合法性区别:在使用指针之前要判断指针是否为NULL,引用不需要判断
 
malloc()和calloc()的区别
  1. malloc和colloc都是在堆上申请动态内存空间。
  2. malloc只有一个参数,即要分配内存大小
  3. calloc函数有两个参数,分别是元素的个数与元素的大小。
  4. malloc不能对内存初始化,calloc对内存的每一位初始化为零
strcpy  sprint  memcpy 函数的区别
答:strcpy函数操作的对象是字符串 ,完成从源字符串到目的字符串的拷贝。
sprint函数操作的对象不限于字符串,是实现其它数据类型吸纳字符串的转化。方法中需要指定源对象的数据类型,可以实现strcpy的功能。
memcpy 内存的拷贝,实现将一个内存的内容复制到另一个内存块。拷贝的内容由内存块由首地址及长度决定。
 
strcpy函数为什么要返回char*类型
答:增加代码的灵活性,方便其它函数直接调用。
 
new delete与malloc free的联系与区别
答:1.都是在堆上进行动态内存的分配与释放。
2.new delete是c++的运算符,malloc free是函数
3.new会自动调用对象的构造函数,返回相应的类型。
4.malloc只会申请指定大小的内存,返回void*类型(不能初始化对象)。
5.delete与new配对,会调用析构函数。
6.free与malloc配对,只是内存的释放,不会调用析构函数。
 
关于静态内存的分配和动态内存的分配的区别及过程
  1. 静态内存的分配是在编译时刻完成的,不占用CPU资源;动态分配内存是在运行时刻完成,分配与释放时占用CPU运行时间。
  2. 静态内存分配是在栈上的,动态内存是在堆上的。
  3. 动态内存分配需要指针或引用数据类型的支持,而静态内存分配不需要。
  4. 静态内存的分配是按计划分配的,在编译前确定内存块大小,动态内存分配运行时按需分配。
  5. 静态内存的分配是把内存的控制权交给了编译器,动态内存的分配是把内存的分配交给了程序员。
  6. 静态分配内存的效率比动态分配内存的效率高,因为动态内存的分配与释放需要额外的开销;动态内存管理水平严重依赖于程序员的水平,处理不当容易造成内存泄露。
 
一个短小的函数在C和C++中分别用什么实现
答:在C++中用内联函数实现,在C中用宏实现。
 
在c++程序中调用被C编辑器编译后的函数,为什么要加extern C?
答:c++语言支持函数的重载,c语言不支持函数的重载。编译后参数的名字不同,函数被c++编译器编译后产生的名字为函数名 加 参数列表类型名之类的名字。而c编辑器编译后产生的名字为函数名。
 
一个由C/C++编译器编译过的程序有那几个部分
答:1.栈区:由编译器自动编译,释放;储存函数参数的值,局部变量的值等。其操作方式类似于数据结构中的栈
2.堆区:由程序员分配与释放,如果程序员没有释放在程序结束时可能由OS释放,储存结构类似于链表。
3.全局区:全局变量和静态变量储存在这一块,初始化的全局变量与静态变量在一块,未出货的全局变量存放在静态变量相邻的一块。程序结束后由系统释放。
4.文字常量区 常量字符串存放在此处,程序结束后系统自动释放
5.程序代码区:存放函数体的二进制代码
 
C与C++有什么区别
答:C语言是面向结构化的编程语言,它是面向过程的,C语言编程考虑的是实现的过程;它是面向对象的,C++编程考虑的是整个程序的模型。
 
虚析构函数与析构函数的区别
答: 加上virtual后,就会先执行子类的析构函数,再执行基类的析构函数。
    不执行析构函数,就可能存在内存泄露。
 
 
面向对象与面向过程的区别
答:面向对象是一种以对象为中心的编程思想,以消息进行驱动,程序 = 对象 + 消息;
  面向过程是一种以应用为中心的编程思想,以算法进行驱动,程序 = 算法 + 数据
 
“extern c”的作用
答:extern c是告诉编译器这段代码以C语言进行编译
 
类成员函数的重载,重写,隐藏的区别
答 重载:在一个类中,方法名相同,参数列表不同。与virtual无关
  重写:也叫覆盖 指在子类中定义一个与父类中的虚函数并且实现。
影藏:派生类函数与基类函数名相同,但参数不同。或者参数相同但父类不是虚函数。
 
多态的实现?
答:简单的说是子类实现了父类的虚函数,父类指针不仅可以调用自己的这个函数,当指向子类时可以调用子类的这个函数,从而实现了多态。
 
多态的作用?
答:实现了动态联编,使程序的运行效率更高,更容易维护。
 
默认的拷贝构造函数的缺陷
答:存在着浅拷贝问题,主要是在内中定义指针变量时,当调用默认拷贝构造函数时,只拷贝地址,两个对象的指针变量指向同一块地址空间。
 
简述成员函数、全局函数、友元函数的区别
成员函数只能由实例化的对象调用(静态成员函数除外)
全局函数可在任何时刻调用,
友元函数可以让类的友元类对象调用。(友元类或函数可以访问私有成员函数和变量)。
 
什么时候会使用复制(拷贝)构造函数
答 :1.一个对象以值的方式传入函数体
   2.一个对象以值传递的方式重函数中返回
  3.一个对象需要通过另外一个对象初始化
 
什么是容器
答:容器是存放特定对象的集合,在STL中有顺序容器和关联容器两种。
 
什么是顺序容器,有那几种
答:顺序容器是指将一组具有相同类型的对象,以严格的线性形式组织在一起的容器。包括vector、deque、list等3种顺序容器。
 
什么是关联容器,有哪几种
答:关联容器可以通过键值对来查找和读取元素的容器,在STL中有四个关联容器,分别是:map、set、multimap、multiset。
 
什么是异常
答:异常就是程序运行时出现的不正常,它可能会导致系统无法正常运行甚至停止运行等严重的情况
 
如何抛出异常
答:在C++中,系统通过try快和异常处理构成异常处理机制,其中通过catch语句来捕获运行时额的异常,并且执行异常处理,通过throw语句来抛出异常
 
  1. main函数执行前还会执行启动例程。
  2. 利用extern或头文件引用一个已经定义的全局变量。
  3. 面向对象的四大特性 封装、继承、多态和抽象。
  4. C++中虚基类不能被实例化,它必须有一个纯虚函数。
  5. 在C++中,函数参数的方式有 传值、传址和转引用。
  6. 不能声明为虚函数的是构造函数(constructor)。
  7. 当一个成员函数被调用时,该函数的this关键字指向它的对象