C++面试笔试题汇总

1. C和C++中struct有什么区别

答:C:没有保护行为,没有public,private,内部不能有函数,但是可以有函数指针
C++:默认是public,可以定义函数

2. C++中的struct和class有什么区别

答:Class和struct做类型定义时只有两点区别:
(1) 默认继承权限:如果不明确指定,来自class的继承按照private处理,来自struct的继承按照public处理
(2) 成员的默认访问权限:class的成员默认是private,struct默认是public权限
除了这两点,他俩基本都是一个东西,语法上没有任何其他区别

3. 如何判断一段程序是由C编译程序还是由C++编译程序编译的

答:

#ifdef _cplusplus
Cout<<”c++”
#else
Cout<<”c”
#endif
4. C和C++有什么不同

答:机制上:c面向过程(但也可以编写面向对象的程序);C++面向对象,提供了类。但是C++编写面向对象的程序比c容易
从适用方向上:c适合要求代码体积小的,效率高的场合,如嵌入式;c++适合更上层的,复杂的;linux核心大部分是c写的,因为他是系统软件,效率要求极高
C++是c的超集
C语言是结构化编程语言,C++是面向对象编程语言
C++侧重于对象而不是过程,侧重于类的设计而不是逻辑设计

5. “引用”与指针的区别是什么

答:指针通过某个指针变量指向一个对象后,对他所指向的变量间接操作。程序中使用指针,可读性差;引用本身就是目标变量的别名,对引用的操作就是对目标变量的操作。

6. Int id[sizeof(unsigned long)]对吗?为什么

答:对,sizeof是编译时运算符,编译时就确定了。可以看成和机器有关的常量。

7. C++函数中值的传递方式有哪几种

答:值传递,指针传递,引用传递。

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

答:C用宏定义,c++用inline

9. 引用与指针有什么区别?

答:引用必须被初始化,指针不必;引用初始化后不能被改变(C++11可以),指针可以改变所指的对象;不存在指向空值的引用,但是存在指向空值的指针。

10. VC中,编译工具条内的Debug和Release选项是什么含义?

答:Debug通常称为调试版本,包含调试信息,并且不做任何优化,便于程序员调试程序。Realease称为发布版本,往往进行了各种优化,使程序在代码大小和运行速度上都是最优的,以便用户很好的使用。Debug带有大量的调试代码,运行时需要相应的运行库,release程序紧凑不含有调试代码和信息,直接可以运行(如果不需要运行库)。

11. Const与#define相比有什么优点?

答:Const常量有数据类型,宏常量没有。编译器可以对前者进行类型安全检查,对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应)。有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。

12. Virtual与inline的含义分别是什么?

答:在基类成员函数的声明前加上virtual关键字,则该函数声明为虚函数。Inline与函数的定义体放在一起,使该函数称为内联。Inline是一种用于实现的关键字,而不是用于声明的关键字。
虚函数特点:如果希望派生类能重新定义基类的方法,则在基类中将该方法定义为虚方法,这样可以启用动态联编。
内联函数特点:为了提高函数的运行效率。内联函数体的代码不能过长,因为内联函数省去调用函数的时间是以代码膨胀为代价的,内联函数不能包含循环语句,因为执行循环语句要比调用函数的开销大。
注:静态联编是指联编工作在编译阶段完成的,这种联编过程是在程序运行之前完成的,又称为早期联编。动态联编是指编译程序在编译阶段并不能确切地知道将要调用的函数,只有在程序执行时才能确定将要调用的函数。

13. char *(*c[10])(int **p);请对这行代码进行解释

答:(1) char * pt[10]; pt是数组,且数组中的每个值都是char * 类型,数组是由10个char*指针所组成。
(2) char (*pt)[10]; pt是指针,指向由10个char元素构成的数组,即pt是数组指针
因此,

  1. c[10] c是数组
  2. *c[10] c是指针数组
  3. char *()(int **p) c数组中每个元素都是函数指针,其所指向的函数返回值是char *类型,且函数的参数为一个指向指针的指针。
14. 多态的作用?

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

15.面向对象的三个基本特征,并简单叙述

答:(1)封装:将客观事物抽象成类,每个类对自身的数据和方法实行protection(private,protected,public)。
(2)继承:广义的继承有三种实现形式:实现继承(指使用基类的属性和方法而无需额外编码的能力),可视继承(子窗体使用父窗体的外观和实现代码),接口继承(仅使用属性和方法,实现滞后到子类实现)。前两种(类继承)和后一种(对象组合->接口继承以及纯虚函数)构成了功能复用的两种方式。
(3)多态:是将父对象设置成为和一个或更多的与他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说就是允许将子类类型的指针赋值给父类类型的指针。

16.内联函数在编译时是否做参数类型检查?

答:内联函数要做参数类型检查,这是内联函数跟宏相比的优势。

17.内存的分配方式有几种?

答:(1) 静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在,例如全局变量,静态局部变量。
(2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
(3) 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。

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

答:生命周期不同:全局变量随主程序创建而创建,随主程序销毁而销毁;局部变量在局部函数内部,甚至局部循环体等内部存在,退出后就不存在;内存中分配在全局数据区。
使用方式不同:通过声明后全局变量程序的各个部分都可以用到;局部变量只能在局部使用;分配在栈区。
操作系统和编译器通过内存分配的位置来知道的,全局变量分配在数据段并且在程序开始运行的时候被加载,局部变量则分配在堆栈里面。

19.用C++写个程序,如何判断一个操作系统是16位还是32位的?

答:定义一个指针p,打印出sizeof(p),如果结果是4,则表示该操作系统是32位,打印结果是2,表示是16位。

20.有了malloc/free为什么还要new/delete?

答:molloc和free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可以用于申请动态内存和释放内存。对于非内部数据类型而言,光用malloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。

21.如果在申请动态内存时找不到足够大的内存块,malloc和new将返回NULL指针,宣告内存申请失败。你是怎么处理内存耗尽的?

答:(1)判断指针是否为NULL,如果是则马上用return语句终止本函数。
(2)判断指针是否为NULL,如果是则马上用exit(1)终止整个程序的运行。
(3)为new和malloc设置异常处理函数。例如visual C++可以用_set_new_hander函数为new设置用户自己定义的异常处理函数,也可以让malloc享用与new相同的异常处理函数。

22.C++是不是类型安全的?

答:不是。两个不同类型的指针之间可以强制转换(用reinterpret cast)。

23.多态类中的虚函数表是Compile-Time,还是Run-Time时建立的?

虚拟函数表在编译期就建立了,各个虚拟函数这时被组织成了一个虚拟函数的入口地址的数组,而对象的隐藏成员——虚拟函数表指针是在运行期,也就是构造函数被调用时进行初始化的,这是实现多态的关键。

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值