收藏 分享(赏)

C和C++经典面试题(面试必备).docx

上传人:weiwoduzun 文档编号:4406569 上传时间:2018-12-27 格式:DOCX 页数:50 大小:33.14KB
下载 相关 举报
C和C++经典面试题(面试必备).docx_第1页
第1页 / 共50页
C和C++经典面试题(面试必备).docx_第2页
第2页 / 共50页
C和C++经典面试题(面试必备).docx_第3页
第3页 / 共50页
C和C++经典面试题(面试必备).docx_第4页
第4页 / 共50页
C和C++经典面试题(面试必备).docx_第5页
第5页 / 共50页
点击查看更多>>
资源描述

1、C/C+经典面试题(面试必备)面试题 1:变量的声明和定义有什么区别为变量分配地址和存储空间的称为定义,不分配地址的称为声明。一个变量可以在多个地方声明,但是只在一个地方定义。加入 extern 修饰的是变量的声明, 说明此变量将在文件以外或在文件后面部分定义。说明:很多时候一个变量,只是声明不分配内存空间,直到具体使用时才初始化,分配内存空间,如外部变量。 面试题 2:写出 bool 、 int、 float、指针变量与“零值” 比较的 if 语句bool 型数据:if( flag )A;elseB;int 型数据:if( 0 != flag )A;elseB;指针型数:if( NULL =

2、 flag )A;elseB;float 型数据:if ( ( flag = NORM ) int *ptr=(int *)(printf(“%d,%d“,*(a+1),*(ptr-1);return;输出结果: 2, 5。注意:数组名 a 可以作数组的首地址,而改为 int *ptr=(int *)(a+1);时输出结果将是什么呢? 面试题 9: 简述 C、 C+程序编译的内存分配情况C、 C+中内存分配方式可以分为三种:( 1) 从静态存储区域分配:内存在程序编译时就已经分配好,这块内存在程序的整个运行期间都存在。 速度快、 不容易出错,因为有系统会善后。 例如全局变量, static 变

3、量等。( 2) 在栈上分配:在执行函数时,函数内局部变量的存储单元都在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。( 3) 从堆上分配:即动态内存分配。程序在运行的时候用 malloc 或 new 申请任意大小的内存,程序员自己负责在何时用 free 或 delete 释放内存。动态内存的生存期由程序员决定,使用非常灵活。 如果在堆上分配了空间,就有责任回收它,否则运行的程序会出现内存泄漏, 另外频繁地分配和释放不同大小的堆空间将会产生堆内碎块。一个 C、 C+程序编译时内存分为 5 大存储区:堆区、栈区、全局区、文字

4、常量区、程序代码区。4 面试题 10: 简述 strcpy、 sprintf 与 memcpy 的区别三者主要有以下不同之处:( 1) 操作对象不同, strcpy 的两个操作对象均为字符串, sprintf 的操作源对象可以是多种数据类型,目的操作对象是字符串, memcpy 的两个对象就是两个任意可操作的内存地址,并不限于何种数据类型。( 2) 执行效率不同, memcpy 最高, strcpy 次之, sprintf 的效率最低。( 3) 实现功能不同, strcpy 主要实现字符串变量间的拷贝, sprintf 主要实现其他数据类型格式到字符串的转化, memcpy 主要是内存块间的拷

5、贝。说明: strcpy、 sprintf 与 memcpy 都可以实现拷贝的功能,但是针对的对象不同,根据实际需求,来选择合适的函数实现拷贝功能。 面试题 11: 设置地址为 0x67a9 的整型变量的值为 0xaa66int *ptr;ptr = (int *)0x67a9;*ptr = 0xaa66;说明:这道题就是强制类型转换的典型例子,无论在什么平台地址长度和整型数据的长度是一样的,即一个整型数据可以强制转换成地址指针类型,只要有意义即可。 面试题 12: 面向对象的三大特征面向对象的三大特征是封装性、继承性和多态性: 封装性:将客观事物抽象成类,每个类对自身的数据和方法实行 pro

6、tection( private, protected,public) 。 继承性:广义的继承有三种实现形式: 实现继承( 使用基类的属性和方法而无需额外编码的能力)、可视继承(子窗体使用父窗体的外观和实现代码)、接口继承(仅使用属性和方法,实现滞后到子类实现) 。 多态性:是将父类对象设置成为和一个或更多它的子对象相等的技术。用子类对象给父类对象赋值之后,父类对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。说明:面向对象的三个特征是实现面向对象技术的关键,每一个特征的相关技术都非常的复杂,程序员应该多看、多练。 面试题 13: C+的空类有哪些成员函数 缺省构造函数。 缺省拷贝构造

7、函数。 缺省析构函数。 缺省赋值运算符。 缺省取址运算符。 缺省取址运算符 const。注意:有些书上只是简单的介绍了前四个函数。没有提及后面这两个函数。但后面这两个函数也是空类的默认函数。另外需要注意的是,只有当实际使用这些函数的时候,编译器才会去定义它们。5 面试题 14: 谈谈你对拷贝构造函数和赋值运算符的认识拷贝构造函数和赋值运算符重载有以下两个不同之处:( 1)拷贝构造函数生成新的类对象,而赋值运算符不能。( 2)由于拷贝构造函数是直接构造一个新的类对象,所以在初始化这个对象之前不用检验源对象是否和新建对象相同。而赋值运算符则需要这个操作,另外赋值运算中如果原来的对象中有内存分配要先

8、把内存释放掉注意:当有类中有指针类型的成员变量时,一定要重写拷贝构造函数和赋值运算符,不要使用默认的。 面试题 15: 用 C+设计一个不能被继承的类template class Afriend T;private:A() A() ;class B : virtual public Apublic:B() B() ;class C : virtual public Bpublic:C() C() ;void main( void )B b;/C c;return;注意:构造函数是继承实现的关键,每次子类对象构造时,首先调用的是父类的构造函数,然后才是自己的。 面试题 16: 访问基类的私有虚函

9、数写出以下程序的输出结果:#include class A 6virtual void g()cout next; /记录上次翻转后的链表oldList- next = newHead; /将当前结点插入到翻转后链表的开头newHead = oldList; /递归处理剩余的链表return ( next=NULL )? newHead: reverse( t, newHead );说明: 循环算法就是图 10.2图 10.5 的移动过程,比较好理解和想到。递归算法的设计虽有一点难度,但是理解了循环算法,再设计递归算法就简单多了。面试题 21:简述队列和栈的异同队列和栈都是线性存储结构,但是两

10、者的插入和删除数据的操作不同,队列是“先进先出” ,栈是“后进先出” 。注意:区别栈区和堆区。堆区的存取是“顺序随意” ,而栈区是“后进先出” 。栈由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 堆一般由程序员分配释放, 若程序员不释放,程序结束时可能由 OS 回收。分配方式类似于链表。它与本题中的堆和栈是两回事。堆栈只是一种数据结构,而堆区和栈区是程序的不同内存存储区域。面试题 22: 能否用两个栈实现一个队列的功能结点结构体:typedef struct nodeint data;node *next;node,*LinkStack;创建空栈:L

11、inkStack CreateNULLStack( LinkStack /申请新结点if( NULL = S)printf(“Fail to malloc a new node.n“);9return NULL; S-data = 0; /初始化新结点S-next = NULL;return S;栈的插入函数:LinkStack Push( LinkStack return NULL;LinkStack p = NULL;p = (LinkStack)malloc( sizeof( node ) ); /申请新结点if( NULL = p)printf(“Fail to malloc a ne

12、w node.n“);return S;if( NULL = S-next)p-next = NULL;elsep-next = S-next; p-data = data; /初始化新结点S-next = p; /插入新结点return S;出栈函数:node Pop( LinkStack temp.data = 0;temp.next = NULL;if( NULL = S) /检验栈printf(“There no node in stack!“);return temp;temp = *S;10if( S-next = NULL )printf(“The stack is NULL,c

13、ant pop!n“);return temp;LinkStack p = S -next; /节点出栈S-next = S-next-next;temp = *p;free( p );p = NULL;return temp;双栈实现队列的入队函数:LinkStack StackToQueuPush( LinkStack LinkStack S1 = NULL;CreateNULLStack( S1 ); /创建空栈while( NULL != S-next ) /S 出栈入 S1n = Pop( S );Push( S1, n.data );Push( S1, data ); /新结点入栈

14、while( NULL != S1-next ) /S1 出栈入 Sn = Pop( S1 );Push( S, n.data );return S;说明:用两个栈能够实现一个队列的功能,那用两个队列能否实现一个队列的功能呢?结果是否定的,因为栈是先进后出,将两个栈连在一起,就是先进先出。而队列是现先进先出,无论多少个连在一起都是先进先出,而无法实现先进后出。面试题 23: 计算一颗二叉树的深度深度的计算函数:int depth(BiTree T)if(!T) return 0; /判断当前结点是否为叶子结点11int d1= depth(T-lchild); /求当前结点的左孩子树的深度in

15、t d2= depth(T-rchild); /求当前结点的右孩子树的深度return (d1d2?d1:d2)+1;注意:根据二叉树的结构特点,很多算法都可以用递归算法来实现。面试题 24: 编码实现直接插入排序直接插入排序编程实现如下:#includevoid main( void )int ARRAY10 = 0, 6, 3, 2, 7, 5, 4, 9, 1, 8 ;int i,j;for( i = 0; i #define LEN 10 /数组长度void main( void )int ARRAY10 = 0, 6, 3, 2, 7, 5, 4, 9, 1, 8 ; /待排序数组p

16、rintf( “n“ );for( int a = 0; a = i; j- ) /对当前无序区 ARRAYiLEN自下向上扫描if( ARRAYj+1 14void createHeep(int ARRAY,int sPoint, int Len) /生成大根堆while( ( 2 * sPoint + 1 ) = 0; i- ) /将 Hr0, Lenght-1建成大根堆createHeep(ARRAY, i, Len);for ( i = Len - 1; i 0; i- )int tmpData = ARRAY0; /与最后一个记录交换ARRAY0 = ARRAYi;ARRAYi =

17、tmpData;createHeep( ARRAY, 0, i ); /将 H.r0i重新调整为大根堆return;int main( void )15int ARRAY = 5, 4, 7, 3, 9, 1, 6, 8, 2;printf(“Before sorted:n“); /打印排序前数组内容for ( int i = 0; i 9; i+ )printf(“%d “, ARRAYi);printf(“n“);heepSort( ARRAY, 9 ); /堆排序printf(“After sorted:n“); /打印排序后数组内容for( i = 0; i 9; i+ )printf( “%d “, ARRAYi );printf( “n“ );return 0;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 网络科技 > C/C++资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报