阿里面试必会20道C++面试题!

一、如何初始化一个指针数组。
解析:首先明确一个概念,就是指向数组的指针,和存放指针的数组。 指向数组的指针:char (*array)[5];含义是一个指向存放5个字符的数组的指针。 存放指针的数组:char *array[5];含义是一个数组中存放了5个指向字符型数据的指针。 按照题意,我理解为初始化一个存放指针的数组,char *array[2]={“China”,”Beijing”};其含义是初始化了一个有两个指向字符型数据的指针的数组,这两个指针分别指向字符串”China”和”Beijing”。
二、关键字const是什么含意?
解析:我只要一听到被面试者说:“const意味着常数”,我就知道我正在和一个业余者打交道。去年Dan Saks已经在他的文章里彻底归纳了const的全部用法,所以ESP(译者:Embedded Systems Programming)的每一位读者应该很是熟悉const能作什么和不能作什么.若是你从没有读到那篇文章,只要能说出const意味着“只读”就可 以了。尽管这个答案不是彻底的答案,但我接受它做为一个正确的答案。(若是你想知道更详细的答案,仔细读一下Saks的文章吧。)若是应试者能正确回答这 个问题,我将问他一个附加的问题:下面的声明都是什么意思?
const int a;
int const a;
const int *a;
int * const a;
int const * a const;
前两个的做用是同样,a是一个常整型数。第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针能够)。第四个意思a是一个指向整 型数的常指针(也就是说,指针指向的整型数是能够修改的,但指针是不可修改的)。最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型 数是不可修改的,同时指针也是不可修改的)。若是应试者能正确回答这些问题,那么他就给我留下了一个好印象。顺带提一句,也许你可能会问,即便不用关键字 const,也仍是能很容易写出功能正确的程序,那么我为何还要如此看重关键字const呢?我也以下的几下理由: 1). 关键字const的做用是为给读你代码的人传达很是有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。若是你曾花不少时间清理 其它人留下的垃圾,你就会很快学会感谢这点多余的信息。(固然,懂得用const的程序员不多会留下的垃圾让别人来清理的。) 2). 经过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。 3). 合理地使用关键字const可使编译器很天然地保护那些不但愿被改变的参数,防止其被无心的代码修改。简而言之,这样能够减小bug的出现。
const关键字至少有下列n个做用:
(1)欲阻止一个变量被改变,可使用const关键字。在定义该const变量时,一般须要对它进行初始化,由于之后就没有机会再去改变它了;
(2)对指针来讲,能够指定指针自己为const,也能够指定指针所指的数据为const,或两者同时指定为const;
(3)在一个函数声明中,const能够修饰形参,代表它是一个输入参数,在函数内部不能改变其值;
(4)对于类的成员函数,若指定其为const类型,则代表其是一个常函数,不能修改类的成员变量;
(5)对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”。
例如:
const classA operator*(const classA& a1,const classA& a2); 
  operator*的返回结果必须是一个const对象。若是不是,这样的变态代码也不会编译出错:
classA a, b, c;
(a * b) = c; // 对a*b的结果赋值 
  操做(a * b) = c显然不符合编程者的初衷,也没有任何意义。

三、 什么是动态特性?
解析:在绝大多数状况下, 程序的功能是在编译的时候就肯定下来的, 咱们称之为静态特性。 反之, 若是程序的功能是在运行时刻才能肯定下来的, 则称之为动态特性。C++中, 虚函数,抽象基类, 动态绑定和多态构成了出色的动态特性。

四、基类的有1个虚函数,子类还须要申明为virtual吗?为何。
解析:不申明没有关系的。 不过,我老是喜欢显式申明,使得代码更加清晰。五、在C++ 程序中调用被 C 编译器编译后的函数,为何要加 extern “C”声明?解析:函数和变量被C++编译后在符号库中的名字与C语言的不一样,被extern “C”修饰的变量和函数是按照C语言方式编译和链接的。因为编译后的名字不一样,C++程序不能直接调用C 函数。C++提供了一个C 链接交换指定符号extern“C”来解决这个问题。六、如何定义Bool变量的TRUE和FALSE的值。解析:不知道这个题有什么陷阱,写到如今神经已经大了,通常来讲先要把TURE和FALSE给定义了,使用#define就能够: #define TURE 1 #define FALSE 0 若是有一个变量须要定义成bool型的,举个例子:bool a=TURE;就能够了。false/true是标准C++语言里新增的关键字,而FALSE/TRUE是经过#define,这要用途是解决程序在C与C++中环境的差别,如下是FALSE/TRUE在windef.h的定义:#ifndef FALSE#define FALSE 0#endif#ifndef TRUE#define TRUE 1#endif也就是说FALSE/TRUE是int类型,而false/true是bool类型;因此二者不同的,只不过咱们在使用中没有这种感受,由于C++会帮你作隐式转换。七、内联函数INline和宏定义一块儿使用的区别。解析:内联函数是在编译的时候已经作好将对应的函数代码替换嵌入到对应的位置,适用于代码较少的函数。 宏定义是简单的替换变量,若是定义的是有参数的函数形式,参数不作类型校验。八、编写my_strcpy函数,实现与库函数strcpy相似的功能,不能使用任何库函数;正确答案:char *strcpy(char *strDest, const char *strSrc){if ( strDest == NULL || strSrc == NULL)return NULL ;if ( strDest == strSrc)return strDest ;char *tempptr = strDest ;while( (*strDest++ = *strSrc++) != ‘’);returntempptr ;}九、 完成程序,实现对数组的降序排序#includevoid sort(int array[] );int main(){int array[]={45,56,76,234,1,34,23,2,3}; //数字任//意给出sort( array );return 0;}void sort( int array[] ){inti,j,k;for(i=1;i<=7;i++) { if(array[i]>array[i-1]){k=ARRAY[i];j=i-1;do{array[j+1]=array[j];j– ;}while(k>array[j]&&j>=0);array[j+1]=k;}}}十、ICMP是什么协议,处于哪一层?正确答案:Internet控制报文协议,处于网络层(IP层)十一、 C中static有什么做用正确答案:(1)隐藏。 当咱们同时编译多个文件时,全部未加static前缀的全局变量和函数都具备全局可见性,故使用static在不一样的文件中定义同名函数和同名变量,而没必要担忧命名冲突。(2)static的第二个做用是保持变量内容的持久。存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是惟一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量。(3)static的第三个做用是默认初始化为0.其实全局变量也具有这一属性,由于全局变量也存储在静态数据区。在静态数据区,内存中全部的字节默认值都是0×00,某些时候这一特色能够减小程序员的工做量。十二、Void GetMemory2(char **p, int num){*p = (char *)malloc(num);}void Test(void){char *str = NULL;GetMemory(&str, 100);strcpy(str, "hello");printf(str);}请问运行Test函数会有什么样的结果?正确答案: 能够运行1三、C++特色是什么,如何实现多态?画出基类和子类在内存中的相互关系。正确答案:多态的基础是继承,须要虚函数的支持,简单的多态是很简单的。 子类继承父类大部分的资源,不能继承的有构造函数,析构函数,拷贝构造函数,operator=函数,友元函数等等1四、 C++中的什么是多态性? 是如何实现的?正确答案:多态性是面向对象程序设计语言继数据抽象和继承以后的第三个基本特征。它是在运行时出现的多态性经过派生类和虚函数实现。基类和派生类中使用一样的函数名, 完成不一样的操做具体实现相隔离的另外一类接口,即把" w h a t"从"h o w"分离开来。多态性提升了代码的组织性和可读性,虚函数则根据类型的不一样来进行不一样的隔离。1五、 关键字static的做用是什么?正确答案:这个简单的问题不多有人能回答彻底。在C语言中,关键字static有三个明显的做用:1). 在函数体,一个被声明为静态的变量在这一函数被调用过程当中维持其值不变。2). 在模块内(但在函数体外),一个被声明为静态的变量能够被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。3). 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。 大多数应试者能正确回答第一部分,一部分能正确回答第二部分,同是不多的人能懂得第三部分。这是一个应试者的严重的缺点,由于他显然不懂得本地化数 据和代码范围的好处和重要性。1六、#define MAX_LEN 500 char arry[MAX_LEN]; cin>>arry; 这段代码有问题吗?如有,请指出并修改;正确答案:有问题。头文件缺乏。 #include <iostream>  using namespace std;1七、delete []arry 和 delete arry 同样吗?不同请说明;正确答案:delete []arry 释放的是多个同一类型的地址空间 Delete arry 释放的是一个某种类型的地址空间1八、 多态的做用?正确答案:主要是两个:1)隐藏实现细节,使得代码可以模块化;扩展代码模块,实现代码重用;2)接口重用,为了类在继承和派生的时候,保证使用家族中任一类的实例的某一属性时的正确调用。1九、C语言的volatile的含义是什么。使用时会对编译器有什么暗示。正确答案:终于最后一题了,容易么……若是这个测试是一个关于嵌入式的,那么这道题很是重要!!从词面上讲,volatile的意思是易变的,也就是说,在程序运行过程当中,有一些变量可能会被莫名其妙的改变,而优化器为了节约时间,有时候不会重读这个变量的真实值,而是去读在寄存器的备份,这样的话,这个变量的真实值反而被优化器给“优化”掉了,用时髦的词说就是被“和谐”了。若是使用了这个修饰词,就是通知编译器别犯懒,老老实实去从新读一遍!可能我说的太“通俗”了,那么我引用一下“大师”的标准解释: volatile的本意是“易变的” 。 因为访问寄存器的速度要快过RAM,因此编译器通常都会做减小存取外部RAM的优化,但有可能会读脏数据。当要求使用volatile 声明的变量的值的时候,系统老是从新从它所在的内存读取数据,即便它前面的指令刚刚从该处读取过数据。并且读取的数据马上被保存。 精确地说就是,优化器在用到这个变量时必须每次都当心地从新读取这个变量的值,而不是使用保存在寄存器里的备份。 下面是volatile变量的几个例子:1). 并行设备的硬件寄存器(如:状态寄存器)2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)3). 多线程应用中被几个任务共享的变量 嵌入式系统程序员常常同硬件、中断、RTOS等等打交道,所用这些都要求volatile变量。不懂得volatile内容将会带来灾难。20、 请简述如下两个for循环的优缺点1)for (i=0; i<n; i++){if (condition)DoSomething();elseDoOtherthing();}2)if (condition){for (i=0; i<n; i++)DoSomething();}else{for (i=0; i<n; i++)="" dootherthing();="" }=""正确答案:1)优势:程序简洁。="" 缺点:多执行了n-1次逻辑判断,而且打断了循环“流水线”做业,使得编译器不能对循环进行优化处理,下降了效率。=""2)优势:循环的效率高。缺点:程序不简洁。="