《最新C-C++语言程序设计笔试面试题7.doc》由会员分享,可在线阅读,更多相关《最新C-C++语言程序设计笔试面试题7.doc(41页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Four short words sum up what has lifted most successful individuals above the crowd: a little bit more.-author-dateC-C+语言程序设计笔试面试题74.技巧题4.技巧题 试题2:写一个函数返回1+2+3+n的值(假定结果不会超过长整型变量的范围) 解答: int Sum( int n ) return ( (long)1 + n) * n / 2;/或return (1l + n) * n / 2; 剖析: 对于这个题,只能说,也许最简单的答案就是最好的答案。下面的解答,或者基于下
2、面的解答思路去优化,不管怎么“折腾”,其效率也不可能与直接return ( 1 l + n ) * n / 2相比! int Sum( int n ) long sum = 0; for( int i=1; i= - EPSINON) & (x =”或“=”此类形式。如下是错误的写法,不得分。if (x = 0.0) if (x != 0.0) 请写出char *p 与“零值”比较的 if 语句。(3分)标准答案:if (p = NULL) if (p != NULL)如下写法均属不良风格,不得分。if (p = 0) if (p != 0) if (p) if (!) 二、以下为Window
3、s NT下的32位C+程序,请计算sizeof的值(10分) char *p = str ;int n = 10;char str = “Hello” ; 请计算sizeof (str ) = 6 sizeof ( p ) = 4 (2分) (2分) sizeof ( n ) = 4 (2分)void Func ( char str100)请计算sizeof( str ) = 4 (2分)void *p = malloc( 100 );请计算sizeof ( p ) = 4 (2分) 三、简答题(25分) 1、头文件中的 ifndef/define/endif 干什么用?(5分)答:防止该头文
4、件被重复引用。#include ,编译器从标准库路径开始搜索 filename.h对于#include “filename.h” ,编译器从用户的工作路径开始搜索 filename.h3.const 有什么用途?(请至少说明两种)(5分)答:4.在C+ 程序中调用被 C编译器编译后的函数,为什么要加 extern “C”? (5分)答:5.请简述以下两个for循环的优缺点(5分)for (i=0; iif (condition)DoSomething();elseDoOtherthing();if (condition)for (i=0; iDoSomething();elsefor (i=0
5、; iDoOtherthing();优点:程序简洁缺点:多执行了N-1次逻辑判断,并且打断了循环“流水线”作业,使得编译器不能对循环进行优化处理,降低了效率。优点:循环的效率高缺点:程序不简洁5分,共20分) void GetMemory(char *p)p = (char *)malloc(100);void Test(void) char *str = NULL;GetMemory(str); strcpy(str, hello world);printf(str);请问运行Test函数会有什么样的结果?答:程序崩溃。因为Test函数中的 str一直都是 NULL。strcpy(str,
6、hello world);将使程序崩溃。GetMemory并不能传递动态内存,char *GetMemory(void) char p = hello world;return p;void Test(void)char *str = NULL;str = GetMemory(); printf(str);请问运行Test函数会有什么样的结果?答:可能是乱码。因为GetMemory返回的是指向“栈内存”的指针,该指针的地址不是 NULL,但其原现的内容已经被清除,新内容不可知。void GetMemory2(char *p, int num)*p = (char *)malloc(num);v
7、oid Test(void)char *str = NULL;GetMemory(&str, 100);strcpy(str, hello); printf(str); 请问运行Test函数会有什么样的结果?答:(1)能够输出hello2)内存泄漏void Test(void)char *str = (char *) malloc(100);strcpy(str, free(str); if(str != NULL)strcpy(str, printf(str);请问运行Test函数会有什么样的结果?答:篡改动态内存区的内容,后果难以预料,非常危险。因为free(str);之后,str成为野指
8、针,if(str != NULL)语句不起作用。“hello”);“world”); strcpy函数(10分)strcpy函数的原型是char *strcpy(char *strDest, const char *strSrc);其中strDest是目的字符串,strSrc是源字符串。1)不调用C+/C的字符串库函数,请编写函数 strcpystrDest!=NULL) & (strSrc !=NULL); / 2分strDest; / 2分strDest+ = * strSrc+) != 0 ) / 2分2)strcpy能把strSrc的内容复制到strDest,为什么还要char * 类
9、型的返回值?int length = strlen( strcpy( strDest, “hello world”) ); String的构造函数、析构函数和赋值函数(25分)String的原型为:String:String(void) / 3分String:String(const char *str) / 6分0; -来源为林锐博士的 已知六、编写类已知类class Stringpublic:String(const char *str = NULL); / 普通构造函数String(const String &other); / 拷贝构造函数 String(void); / 析构函数St
10、ring & operate =(const String &other); / 赋值函数private:char *m_data; / 用于保存字符串;请编写String的上述4个函数。(二)void * ( * (*fp1)(int)10;float (*(* fp2)(int,int,int)(int);int (* ( * fp3)()10();分别表示什么意思?答:1.void * ( * (*fp1)(int)10;fp1是一个指针,指向一个函数,这个函数的参数为int型,函数的返回值是一个指针,这个指针指向一个数组,这个数组有10个元素,每个元素是一个void*型指针。2.flo
11、at (*(* fp2)(int,int,int)(int);fp2是一个指针,指向一个函数,这个函数的参数为3个int型,函数的返回值是一个指针,这个指针指向一个函数,这个函数的参数为int型,函数的返回值是float型。3.int (* ( * fp3)()10();fp3是一个指针,指向一个函数,这个函数的参数为空,函数的返回值是一个指针,这个指针指向一个数组,这个数组有10个元素,每个元素是一个指针,指向一个函数,这个函数的参数为空,函数的返回值是int型。1.介绍一下STL,详细说明STL如何实现vector。Answer:STL (标准模版库,Standard Template L
12、ibrary.它由容器算法迭代器组成。STL有以下的一些优点:可以方便容易地实现搜索数据或对数据排序等一系列的算法;调试程序时更加安全和方便;即使是人们用STL在UNIX平台下写的代码你也可以很容易地理解(因为STL是跨平台的)。 vector实质上就是一个动态数组,会根据数据的增加,动态的增加数组空间。 2.如果用VC开发程序,常见这么几个错误,C2001,c2005,c2011,这些错误的原因是什么。Answer:在学习VC+的过程中,遇到的LNK2001错误的错误消息主要为:unresolved external symbol “symbol”(不确定的外部“符号”)。如果连接程序不能在
13、所有的库和目标文件内找到所引用的函数、变量或标签,将产生此错误消息。 一般来说,发生错误的原因有两个:一是所引用的函数、变量不存在、拼写不正确或者使用错误;其次可能使用了不同版本的连接库。 编程中经常能遇到LNK2005错误重复定义错误,其实LNK2005错误并不是一个很难解决的错误. 3.继承和委派有什么分别,在决定使用继承或者委派的时候需要考虑什么。在OOD,OOP中,组合优于继承.当然多态的基础是继承,没有继承多态无从谈起。 当对象的类型不影响类中函数的行为时,就要使用模板来生成这样一组类。当对象的类型影响类中函数的行为时,就要使用继承来得到这样一组类. 4.指针和引用有什么分别;如果传
14、引用比传指针安全,为什么?如果我使用常量指针难道不行吗?(1) 引用在创建的同时必须初始化,即引用到一个有效的对象;而指针在定义的时候不必初始化,可以在定义后面的任何地方重新赋值(2) 不存在引用,引用必须与合法的存储单元关联;而指针则可以是NULL.(3) 引用一旦被初始化为指向一个对象,它就不能被改变为另一个对象的引用;而指针在任何时候都可以改变为指向另一个对象给引用赋值并不是改变它和原始对象的绑定关系(4) 引用的创建和销毁并不会调用类的拷贝构造函数(5) 语言层面,引用的用法和对象一样;在二进制层面,引用一般都是通过指针来实现的,只不过编译器帮我们完成了转换. 不存在空引用,并且引用一
15、旦被初始化为指向一个对象,它就不能被改变为另一个对象的引用,显得很安全。const 指针仍然存在空指针,并且有可能产生野指针. 总的来说:引用既具有指针的效率,又具有变量使用的方便性和直观性 5.参数传递有几种方式;实现多态参数传递采用什么方式,如果没有使用某种方式原因是什么;传值,传指针或者引用 6.结合一个项目说明你怎样应用设计模式的理念。设计模式更多考虑是扩展和重用,而这两方面很多情况下,往往会被忽略。不过,我不建议滥用设计模式,以为它有可能使得简单问题复杂化. 7.介绍一下你对设计模式的理解。(这个过程中有很多很细节的问题随机问的)设计模式概念是由建筑设计师Christopher Alexander提出:每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心.这样,你就能一次又一次地使用该方案而不必做重复劳动.上述定义是对设计模式的广义定义.将其应用到面向对象软件的领域内,就形成了对设计模式的狭义定义.可以简单的认为:设计模式就是解决某个特定的面向对象软件问题的特定方法, 并且已经上升到理论程度。 -
限制150内