还剩16页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
试题6的GetMemory避免了试题4的问题,传入GetMemory的参数为字符串指针的指针,但是在GetMemory中执行申请内存及赋值语句*p=char*malloc num;后未判断内存是否申请成功,应加上if*p二二NULL...〃进行申请内存失败解决试题7存在与试题6同样的问题,在执行char*str=char*malloc100;后未进行内存是否申请成功的判断;此外,在free str后未置str为空,导致也许变成一个“野”指针,应加上str=NULL;试题6的Test函数中也未对malloc的内存进行释放剖析试题4-7考察面试者对内存操作的理解限度,基本功扎实的面试者一般都能对的的回答其中50~60的错误但是要完全解答对的,却也绝非易事freepTmp;coutstrSrc;解答对的解答1:void LoopMovechar*pStr,int stepsiint n=strlen pStr-steps;char tmp[MAX_LEN];strcpytmp,pStr+n;strcpytmp+steps,pStr;*tmp+strlenpStr=\0;strcpypStr,tmp;对的解答2:void LoopMovechar*pStr,int stepsint n=strlen pStr-steps;char tmp[MAX_LEN];memcpy tmp,pStr+n,steps;memcpypStr+steps,pStr,n;memcpypStr,tmp,steps;剖析这个试题重要考察面试者对标准库函数的纯熟限度,在需要的时候引用库函数可以很大限度上简化程序编写的工作量最频繁被使用的库函数涉及1strcpy2memcpy3memset试题7:编写类String的构造函数、析构函数和赋值函数,已知类String的原型为:class String{public:String const char*str=NULL;//普通构造函数String const String other;//拷贝构造函数Stringvoid;//析构函数〜Stringoperate=const Stringother;//赋值函数private:char*m_data;//用于保存字符串;解答〃普通构造函数String::Stringconst char*strifstr==NULLm_data=new char
[1];//得分点对空字符串自动申请存放结束标志\0的空assertm_data!=NULL;//加分点对m_data加NULL判断*m_data=\0;elseint length=strlenstr;m data=new char[length+1];//若能加NULL判断则更好strcpym_data,str;//String的析构函数String:^Stringvoid{Ifm_data!=NULLdelete[]m_data;//或delete m_data;〃拷贝构造函数String::Stringconst Stringother//得分点输入参数为const型{int length=strlen other.m_data;m_data=new char[length+1];〃加分点对m_data加NULL判断assertmdata!=NULL;strcpy indata,other,m data;〃赋值函数StringString::operate=constStringother//得分点输入参数为const型if this=other//得分点检查自赋值return*this;delete[]m_data;〃得分点释放原有的内存资源int length二strlen other,m data;m_data=new char[length+1];〃加分点对m_data加NULL判断assertm_data!=NULL;strcpym data,other,m data;return*this;〃得分点返回本对象的引用剖析可以准确无误地编写出Siring类的构造函数、拷贝构造函数、赋值函数和析构函数的面试者至少已经具有了C++基本功的60%以上!在这个类中涉及了指针类成员变量m_data,当类中涉及指针类成员变量时,一定要重载其拷贝构造函数、赋值函数和析构函数,这既是对C++程序员的基本规定,也是(Effective C++》中特别强调的条款仔细学习这个类,特别注意加注释的得分点和加分点的意义,这样就具有了60%以上的C++基本功!试题8:请说出static和const关键字尽也许多的作用解答static关键字至少有下列5个作用
(1)函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分派一次,因此其值在下次调用时仍维持上次的值;
(2)在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;
(3)在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;4在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;5在类中的static成员函数属于整个类所拥有,这个函数不接受this指针,因而只能访问类的static成员变量const关键字至少有下列5个作用1欲阻止一个变量被改变,可以使用const关键字在定义该const变量时,通常需要对它进行初始化,由于以后就没有机会再去改变它了;2对指针来说,可以指定指针自身为constchar*const p,也可以指定指针所指的数据为constconst char*p,或两者同时指定为const constchar*const p;3在一个函数声明中,const可以修饰形参,表白它是一个输入参数,在函数内部不能改变其值;4对于类的成员函数,若指定其为const类型,则表白其是一个常函数,不能修改类的成员变量;5对于类的成员函数或普通函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”例如const classAoperator*const classAfeal,const classA a2;operator*的返回结果必须是一个const对象假如不是,这样的变态代码也不会编译犯错:classAa,b,c;a*b=c;〃对a*b的结果赋值操作a*b=c显然不符合编程者的初衷,也没有任何意义剖析惊讶吗?小小的static和const居然有这么多功能,我们能回答几个?假如只能回答12个,那〜还真得闭关再好好修炼修炼这个题可以考察面试者对程序设计知识的掌握限度是初级、中级还是比较进一步,没有一定的知识广度和深度,不也许对这个问题给出全面的解答大多数人只能回答出static和const关键字的部分功能对内存操作的考察重要集中在:1指针的理解;2变量的生存期及作用范围;3良好的动态内存申请和释放习惯在看看下面的一段程序有什么错误swap int*pl,int*p2{int*p;*p=*pl;*pl=*p2;*p2=*p;在swap函数中,p是一个“野”指针,有也许指向系统区,导致程序运营的崩溃在VC++中DEBUG运营时提醒错误Access Violation该程序应当改为oswap int*pl,int*p2iint p;*pl=*p2;*p2=p;
3.内功题试题1分别给出BOOL,int,float,指针变量与“零值”比较的if语句假设变量名为var解答BOOL型变量if!varint型变量if var==0float型变量const floatEPSINON=
0.00001;if x=-EPSINONx=EPSINON指针变量if var==NULL剖析:考核对0值判断的“内功”,BOOL型变量的0判断完全可以写成if var=0,而int型变量也可以写成if!var,指针变量的判断也可以写成if!var,上述写法虽然程序都能对的运营,但是未能清楚地表达程序的意思一般的,假如想让if判断一个变量的“真、假应直接使用ifvar、if!var,表白其为“逻辑”判断;假如用if判断一个数值型变量short、int、long等,应当用ifvar==0,表白是与0进行“数值”上的比较;而判断指针则适宜用ifvar=NULL,这是一种很好的编程习惯浮点型变量并不精确,所以不可将float变量用“二”或“!二”与数字比较,应当设法转化成“〉二”或“<二”形式假如写成if x=
0.0,则判为错,得0分试题2以下为Windows NT下的32位C++程序,请计算sizeof的值void Funcchar str
[100]{sizeof str二void*p二malloc100;sizeofp=解答sizeofstr=4sizeofp=4剖析:Funcchar str
[100]函数中数组名作为函数形参时,在函数体内,数组名失去了自身的内涵,仅仅只是一个指针;在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改数组名的本质如下1数组名指代一种数据结构,这种数据结构就是数组;例如char str
[10];coutsizeof strendl;输出结果为10,str指代数据结构char
[10]2数组名可以转换为指向其指代实体的指针,并且是一个指针常量,不能作自增、自减等操作,不能被修改;char str
[10];str++;〃编译犯错,提醒str不是左值3数组名作为函数形参时,沦为普通指针Windows NT32位平台下,指针的长度占用内存的大小为4字节,故sizeofstr、sizeofp都为4试题3:写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个此外,当你写下面的代码时会发生什么事?least=MIN*p++,b;解答ttdefine MINA,B A〈=BA:BMIN*p++,b会产生宏的副作用剖析这个面试题重要考察面试者对宏定义的使用,宏定义可以实现类似于函数的功能,但是它终归不是函数,而宏定义中括弧中的“参数”也不是真的参数,在宏展开的时候对“参数”进行的是一对一的替换程序员对宏定义的使用要非常小心,特别要注意两个问题1谨慎地将宏定义中的“参数”和整个宏用用括弧括起来所以,严格地讲,下述解答:#define MINA,B A=BA:B#define MINA,B ACBA:B都应判0分;2防止宏的副作用宏定义#define MINA,B A=BA:B对MIN*p++,b的作用结果是:*p++=b*p++:*p++这个表达式会产生副作用,指针P会作三次++自增操作除此之外,另一个应当判0分的解答是ttdefine MINA,B A=BA:B;这个解答在宏定义的后面加“;”,显示编写者对宏的概念模糊不清,只能被无情地判分并被面试官淘汰试题4:为什么标准头文献都有类似以下的结构?ttifndef_INCvxWorksh#define_INCvxWorkshttifdef_cplusplusextern〃C〃{ttendifttifdef_cplusplus ttendifttendif/*_INCvxWorksh*/解答头文献中的编译宏ttifndef_INCvxWorksh#define_INCvxWorksh#endif的作用是防止被反复引用作为一种面向对象的语言,C++支持函数重载,而过程式语言C则不支持函数被C++编译后在symbol库中的名字与C语言的不同例如,假设某个函数的原型为void foointx,int y;该函数被C编译器编译后在symbol库中的名字为而C++编译器则会产生像_foo_int_int之类的名字_foo_int_int这样的名字包含了函数名和函数参数数量及类型信息,C++就是考这种机制来实现函数重载的为了实现C和C++的混合编程,C++提供了C连接互换指定符号extern〃C〃来解决名字匹配问题,函数声明前加上extern〃C〃后,则编译器就会按照C语言的方式将该函数编译为这样C语言中就可以调用C++的函数了试题5编写一个函数,作用是把一个char组成的字符串循环右移n个比如本来是“abcdefghi”假如n=2,移位后应当是“hiabcdefgh”函数头是这样的//pStr是指向以‘\0结尾的字符串的指针//steps是规定移动的nvoid LoopMovechar*pStr,int steps{〃请填充…assert strSrc!=NULL;int strLen=strlen strSrc;nStep=nStep%strLen;char*pTmp=char*ma Hocsizeof char*strLen;memcpypTmpInStep,strSrc,strLen-nStep;memcpypTmp,strSrc+strLen-nStep,nStep;memcpystrSrc,pTmp,strLen;。
个人认证
优秀文档
获得点赞 0