ImageVerifierCode 换一换
格式:DOCX , 页数:12 ,大小:29.13KB ,
资源ID:7812962      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7812962.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(cc++经典面试题.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

cc++经典面试题.docx

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

2、; else B; float型数据: if ( ( flag = NORM ) & ( flag = NORM ) ) A;2注意:应特别注意在int、指针型变量和“零值”比较的时候,把“零值”放在左边,这样当把“=”误写成“=”时,编译器可以报错,否则这种逻辑错误不容易发现,并且可能导致很严重的后果。面试题3:sizeof和strlen的区别sizeof和strlen有以下区别: sizeof是一个操作符,strlen是库函数。 sizeof的参数可以是数据的类型,也可以是变量,而strlen只能以结尾为0的字符串作参数。 编译器在编译时就计算出了sizeof的结果。而strlen函数必须

3、在运行时才能计算出来。并且sizeof计算的是数据类型占内存的大小,而strlen计算的是字符串实际的长度。 数组做sizeof的参数不退化,传递给strlen就退化为指针了。注意:有些是操作符看起来像是函数,而有些函数名看起来又像操作符,这类容易混淆的名称一定要加以区分,否则遇到数组名这类特殊数据类型作参数时就很容易出错。最容易混淆为函数的操作符就是sizeof。面试题4:C语言的关键字 static 和 C+ 的关键字 static 有什么区别在C中static用来修饰局部静态变量和外部静态变量、函数。而C+中除了上述功能外,还用来定义类的成员变量和函数。即静态成员和静态成员函数。注意:编

4、程时static的记忆性,和全局性的特点可以让在不同时期调用的函数进行通信,传递信息,而C+的静态成员则可以在多个对象实例间进行通信,传递信息。面试题5:中的malloc和中的new有什么区别malloc和new有以下不同:(1)new、delete 是操作符,可以重载,只能在C+中使用。(2)malloc、free是函数,可以覆盖,C、C+中都可以使用。(3)new 可以调用对象的构造函数,对应的delete调用相应的析构函数。(4)malloc仅仅分配内存,free仅仅回收内存,并不执行构造和析构函数(5)new、delete返回的是某种数据类型指针,malloc、free返回的是void

5、指针。注意:malloc申请的内存空间要用free释放,而new申请的内存空间要用delete释放,不要混用。因为两者实现的机理不同。面试题6:写一个“标准”宏MIN #define min(a,b)(a)=(b)?(a):(b)注意:在调用时一定要注意这个宏定义的副作用,如下调用: (+*p)=(x)?(+*p):(x)。p指针就自加了两次,违背了MIN的本意。3面试题7:一个指针可以是volatile吗可以,因为指针和普通变量一样,有时也有变化程序的不可控性。常见例:子中断服务子程序修改一个指向一个buffer的指针时,必须用volatile来修饰这个指针。说明:指针是一种普通的变量,从访

6、问上没有什么不同于其他变量的特性。其保存的数值是个整型数据,和整型变量不同的是,这个整型数据指向的是一段内存地址。面试题8:a和&a有什么区别请写出以下代码的打印结果,主要目的是考察a和&a的区别。 #include void main( void ) int a5=1,2,3,4,5; int *ptr=(int *)(&a+1); printf(“%d,%d”,*(a+1),*(ptr-1); return; 输出结果:2,5。注意:数组名a可以作数组的首地址,而&a是数组的指针。思考,将原式的int *ptr=(int *)(&a+1);改为int *ptr=(int *)(a+1);时

7、输出结果将是什么呢?面试题9:简述C、C+程序编译的内存分配情况C、C+中内存分配方式可以分为三种:(1)从静态存储区域分配:内存在程序编译时就已经分配好,这块内存在程序的整个运行期间都存在。速度快、不容易出错,因为有系统会善后。例如全局变量,static变量等。(2)在栈上分配:在执行函数时,函数内局部变量的存储单元都在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。(3)从堆上分配:即动态内存分配。程序在运行的时候用malloc或new申请任意大小的内存,程序员自己负责在何时用free或delete释放内存。动态内存的

8、生存期由程序员决定,使用非常灵活。如果在堆上分配了空间,就有责任回收它,否则运行的程序会出现内存泄漏,另外频繁地分配和释放不同大小的堆空间将会产生堆内碎块。一个C、C+程序编译时内存分为5大存储区:堆区、栈区、全局区、文字常量区、程序代码区。4面试题10:简述strcpy、sprintf与memcpy的区别三者主要有以下不同之处:(1)操作对象不同,strcpy的两个操作对象均为字符串,sprintf的操作源对象可以是多种数据类型,目的操作对象是字符串,memcpy 的两个对象就是两个任意可操作的内存地址,并不限于何种数据类型。(2)执行效率不同,memcpy最高,strcpy次之,sprin

9、tf的效率最低。(3)实现功能不同,strcpy主要实现字符串变量间的拷贝,sprintf主要实现其他数据类型格式到字符串的转化,memcpy主要是内存块间的拷贝。说明:strcpy、sprintf与memcpy都可以实现拷贝的功能,但是针对的对象不同,根据实际需求,来选择合适的函数实现拷贝功能。面试题11:设置地址为0x67a9的整型变量的值为0xaa66 int *ptr; ptr = (int *)0x67a9; *ptr = 0xaa66;说明:这道题就是强制类型转换的典型例子,无论在什么平台地址长度和整型数据的长度是一样的,即一个整型数据可以强制转换成地址指针类型,只要有意义即可。面

10、试题12:面向对象的三大特征面向对象的三大特征是封装性、继承性和多态性: 封装性:将客观事物抽象成类,每个类对自身的数据和方法实行protection(private, protected,public)。 继承性:广义的继承有三种实现形式:实现继承(使用基类的属性和方法而无需额外编码的能力)、可视继承(子窗体使用父窗体的外观和实现代码)、接口继承(仅使用属性和方法,实现滞后到子类实现)。 多态性:是将父类对象设置成为和一个或更多它的子对象相等的技术。用子类对象给父类对象赋值之后,父类对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。说明:面向对象的三个特征是实现面向对象技术的关键,每

11、一个特征的相关技术都非常的复杂,程序员应该多看、多练。面试题13:C+的空类有哪些成员函数 缺省构造函数。 缺省拷贝构造函数。 缺省析构函数。 缺省赋值运算符。 缺省取址运算符。 缺省取址运算符 const。注意:有些书上只是简单的介绍了前四个函数。没有提及后面这两个函数。但后面这两个函数也是空类的默认函数。另外需要注意的是,只有当实际使用这些函数的时候,编译器才会去定义它们。5面试题14:谈谈你对拷贝构造函数和赋值运算符的认识拷贝构造函数和赋值运算符重载有以下两个不同之处:(1)拷贝构造函数生成新的类对象,而赋值运算符不能。(2)由于拷贝构造函数是直接构造一个新的类对象,所以在初始化这个对象

12、之前不用检验源对象是否和新建对象相同。而赋值运算符则需要这个操作,另外赋值运算中如果原来的对象中有内存分配要先把内存释放掉注意:当有类中有指针类型的成员变量时,一定要重写拷贝构造函数和赋值运算符,不要使用默认的。面试题15:用C+设计一个不能被继承的类 template class A friend T; private: A() A() ; class B : virtual public A public: B() B() ; class C : virtual public B public: C() C() ; void main( void ) B b; /C c; return;

13、注意:构造函数是继承实现的关键,每次子类对象构造时,首先调用的是父类的构造函数,然后才是自己的。面试题16:访问基类的私有虚函数写出以下程序的输出结果: #include class A6 virtual void g() cout “A:g” endl; private: virtual void f() cout “A:f” endl; ; class B : public A void g() cout “B:g” endl; virtual void h() cout “B:h” endl; ; typedef void( *Fun )( void ); void main() B b

14、; Fun pFun; for(int i = 0 ; i next; /记录上次翻转后的链表 oldList- next = newHead; /将当前结点插入到翻转后链表的开头 newHead = oldList; /递归处理剩余的链表 return ( next=NULL )? newHead: reverse( t, newHead ); 说明:循环算法就是图10.2图10.5的移动过程,比较好理解和想到。递归算法的设计虽有一点难度,但是理解了循环算法,再设计递归算法就简单多了。面试题21:简述队列和栈的异同队列和栈都是线性存储结构,但是两者的插入和删除数据的操作不同,队列是“先进先出

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

16、inkStack &S) S = (LinkStack)malloc( sizeof( node ) ); /申请新结点 if( NULL = S) printf(“Fail to malloc a new node.n”);9return NULL; S-data = 0; /初始化新结点 S-next = NULL; return S; 栈的插入函数: LinkStack Push( LinkStack &S, int data) if( NULL = S) /检验栈 printf(“There no node in stack!”); return NULL; LinkStack p =

17、 NULL; p = (LinkStack)malloc( sizeof( node ) ); /申请新结点 if( NULL = p) printf(“Fail to malloc a new node.n”); return S; if( NULL = S-next) p-next = NULL; else p-next = S-next; p-data = data; /初始化新结点 S-next = p; /插入新结点 return S; 出栈函数: node Pop( LinkStack &S) node temp; temp.data = 0; temp.next = NULL;

18、if( NULL = S) /检验栈 printf(“There no node in stack!”); return temp; temp = *S;10if( S-next = NULL ) printf(“The stack is NULL,cant pop!n”); return temp; LinkStack p = S -next; /节点出栈 S-next = S-next-next; temp = *p; free( p ); p = NULL; return temp; 双栈实现队列的入队函数: LinkStack StackToQueuPush( LinkStack &S

19、, int data) node n; LinkStack S1 = NULL; CreateNULLStack( S1 ); /创建空栈 while( NULL != S-next ) /S出栈入S1 n = Pop( S ); Push( S1, n.data ); Push( S1, data ); /新结点入栈 while( NULL != S1-next ) /S1出栈入S n = Pop( S1 ); Push( S, n.data ); return S; 说明:用两个栈能够实现一个队列的功能,那用两个队列能否实现一个队列的功能呢?结果是否定的,因为栈是先进后出,将两个栈连在一起

20、,就是先进先出。而队列是现先进先出,无论多少个连在一起都是先进先出,而无法实现先进后出。面试题23:计算一颗二叉树的深度深度的计算函数: int depth(BiTree T) if(!T) return 0; /判断当前结点是否为叶子结点11int d1= depth(T-lchild); /求当前结点的左孩子树的深度 int d2= depth(T-rchild); /求当前结点的右孩子树的深度 return (d1d2?d1:d2)+1; 注意:根据二叉树的结构特点,很多算法都可以用递归算法来实现。面试题24:编码实现直接插入排序直接插入排序编程实现如下: #include void m

21、ain( void ) int ARRAY10 = 0, 6, 3, 2, 7, 5, 4, 9, 1, 8 ; int i,j; for( i = 0; i 10; i+) coutARRAY” “; coutendl; for( i = 2; i = 10; i+ ) /将ARRAY2,ARRAYn依次按序插入 if(ARRAY ARRAYi-1) /如果ARRAY大于一切有序的数值, /ARRAY将保持原位不动 ARRAY0 = ARRAY; /将ARRAY0看做是哨兵,是ARRAY的副本 j = i 1; do /从右向左在有序区ARRAY1i-1中 /查找ARRAY的插入位置 ARR

22、AYj+1 = ARRAYj; /将数值大于ARRAY记录后移 j ; while( ARRAY0 ARRAYj ); ARRAYj+1=ARRAY0; /ARRAY插入到正确的位置上 for( i = 0; i 10; i+) coutARRAY” “; coutendl; 12注意:所有为简化边界条件而引入的附加结点(元素)均可称为哨兵。引入哨兵后使得查找循环条件的时间大约减少了一半,对于记录数较大的文件节约的时间就相当可观。类似于排序这样使用频率非常高的算法,要尽可能地减少其运行时间。所以不能把上述算法中的哨兵视为雕虫小技。面试题25:编码实现冒泡排序冒泡排序编程实现如下: #inclu

23、de #define LEN 10 /数组长度 void main( void ) int ARRAY10 = 0, 6, 3, 2, 7, 5, 4, 9, 1, 8 ; /待排序数组 printf( “n” ); for( int a = 0; a LEN; a+ ) /打印数组内容 printf( “%d “, ARRAYa ); int i = 0; int j = 0; bool isChange; /设定交换标志 for( i = 1; i = i; j ) /对当前无序区ARRAYi.LEN自下向上扫描 if( ARRAYj+1 ARRAYj ) /交换记录 ARRAY0 = A

24、RRAYj+1; /ARRAY0不是哨兵,仅做暂存单元 ARRAYj+1 = ARRAYj; ARRAYj = ARRAY0; isChange = 1; /发生了交换,故将交换标志置为真 printf( “n” ); for( a = 0; a LEN; a+) /打印本次排序后数组内容 printf( “%d “, ARRAYa ); if( !isChange ) /本趟排序未发生交换,提前终止算法 break; printf( “n” ); return; 13面试题26:编码实现直接选择排序 #include”stdio.h” #define LEN 9 void main( void ) int ARRAYLEN= 5, 6, 8, 2, 4, 1, 9, 3, 7 ; /待序数组 printf(“Before sorted:n”); for( int m = 0; m LEN; m+ ) /打印排序前数组 printf( “%d “, ARRAY); for (int i = 1; i = LEN 1; i+) /选择排序 int t = i 1; int temp = 0; for (int j = i; j LEN; j+) if (ARRAYj ARRAYt) t =

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1