CC++试题

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1..release版本的可执行程序为什么非常大?程序一般分为Debug版本和Release版本,Debug版本用于内部调试,Release版本发行给用户使用Release和Debug有什么不同Release版称为发行版,Debug版称为调试版。Debug中可以单步执行、跟踪等功能,但生成的可执行文件比较大,代码运行速度较慢。Release版运行速度较快,可执行文件较小,但在其编译条件下无法执行调试功能。Release的exe文件链接的是标准的MFCDLL(UseMFCinasharedorstaticdll)。这些DLL在安装Windows的时候,已经配置,所以这些程序能够在没有安装VisualC++6.0的机器上运行。而Debug版本的exe链接了调试版本的MFCDLL文件,在没有安装VisualC++6.0的机器上不能运行,因为缺相应的DLL,除非选择usestaticdllwhenlink。sizeof(d)?为什么在不同的平台上得到的值不一样?C++拷贝构造函数和赋值运算符有那些不同和相同点。拷贝构造函数和赋值号的异同同:都可以对对象的成员进行赋值异:拷贝构造函数首先是一个构造函数,它调用的时候产生一个对象,是通过参数传进来的那个对象来初始化,产生的对象。赋值是把一个对象赋值给一个原有的对象,而且还要检查一下两个对象是不是同一个对象,如果是的话就不做任何操作。软件开发过程包含哪些阶段?各阶段质量保证措施是什么?、1.需求分析需求分析是开发人员对系统需要做什么和如何做的定义过程。从系统分析的经验来看,这个过程往往是个循序渐进的过程,一次性对系统形成完整的认识是困难的。只有不断地和客户领域专家进行交流确认,方能逐步明了用户的需求。从系统开发的过程得知,系统分析时犯下的错误,会在接下来的阶段被成倍的放大,越是在开发的后期,纠正分析时犯下的错误所花费的代价越是昂贵,也越发影响系统的工期和系统的质量。解决系统分析错误的方法我们公司通常采用邀请用户参与进行需求评定,然后对其用户的意见由质保成员跟踪检测是否纳入需求规格说明书,同时与用户签字确认形成需求基线,交由配置管理员放入配置管理库。b、系统设计优良的体系结构应当具备可扩展性和可配置性,而好的体系结构则需要好的设计方法,自然设计选型成为了系统设计首要的工作,究竟是采用哪种设计方法好呢?对于设计选型不能一概而论,需要针对项目的结构、项目的特征和用户的需求来分析,同样也要考虑到参与项目小组成员的素质,如果其中大部分都没有从事过面向对象的设计且项目进对紧迫,这样没有多余的时间来培训小组成员来掌握面向对象的设计方法,尽管众所周知面向对象设计方法的优势,我们还是不如采用面向过程的方式(除用户指定开发设计方式外)可以减少项目承担的技术风险。c、实现实现也就是代码的生产过程。这里不仅包括代码的产生,同时也包括测试用例的产生。针对上一阶段提供详细设计,程序员开始编码并且调试程序,测试人员则根据设计进行测试用例的设计,设计出来的用例需要得到项目组成员认可由项目经理审核通过才能进入配置库。同时程序员调试完程序提交测试人员进行程序正确性检测。d、文档管理文档维护主要是配置管理小组的工作。文档从用途上分主要分为内部文档和外部文档。内部文档包括:项目开发计划;需求分析;体系结构设计说明;详细设计说明;构件索引;构件成分说明;构件接口及调用说明;组件索引;组件接口及调用说明;类索引;类属性及方法说明;测试报告;测试统计报告;质量监督报告;源代码;文档分类版本索引;软件安装打包文件。外部文档主要包括:软件安装手册;软件操作手册;在线帮助;系统性能指标报告;系统操作索引。3、系统维护质量保证2.使用C++赋值运算符应注意什么地方?如果函数的返回值是一个对象,有些场合用“引用传递”替换“值传递”可以提高效率。而有些场合只能用“值传递”而不能用“引用传递”,否则会出错。对于赋值函数,应当用“引用传递”的方式返回String对象。如果用“值传递”的方式,虽然功能仍然正确,但由于return语句要把*this拷贝到保存返回值的外部存储单元之中,增加了不必要的开销,降低了赋值函数的效率。对于相加函数,应当用“值传递”的方式返回String对象。如果改用“引用传递”,那么函数返回值是一个指向局部对象temp的“引用”。由于temp在函数结束时被自动销毁,将导致返回的“引用”无效3.exit()和_exit()的区别。exit()’与‘_exit()’的基本区别在于前一个调用实施与调用库里用户状态结构(user-modeconstructs)有关的清除工作(clean-up),而且调用用户自定义的清除程序,在退出程序前,关闭文件,清除缓存。后一个函数只为进程实施内核清除工作。不关闭文件,不清楚缓存。4.哪些方法可让一个进程仅有一个实例运行?设置临界区,(可以定义自旋锁不?)使用Microsoft提供的互斥类Mutex使用API函数,获取当前进程,遍历正在有相同名字运行的进程。红黑树比AVL树的优势在哪?红黑树引入了“颜色”的概念。引入“颜色”的目的在于使得红黑树的平衡条件得以简化。正如著名的密码学专家BruceSchneier所说的那样,“BeingPartlybalancedcanbegoodenough”,红黑树并不追求“完全平衡”——它只要求部分地达到平衡要求,降低了对旋转的要求,从而提高了性能。红黑树能够以O(log2n)的时间复杂度进行搜索、插入、删除操作。此外,由于它的设计,任何不平衡都会在三次旋转之内解决。当然,还有一些更好的,但实现起来更复杂的数据结构能够做到一步旋转之内达到平衡,但红黑树能够给我们一个比较“便宜”的解决方案。红黑树的算法时间复杂度和AVL相同,但统计性能比AVL树更高。5.阻塞模式的recv在没受到数据的情况下如何返回?(不能将socket修改为非阻塞)recv(fd,buf,sizeof(buf),flag)函数原型将recv()函数的标志位设为停止等待或者设置一个延时退出,超时返回什么的recv(fd,buf,sizeof(buf),MSG_DONTWAIT);这里采用了MSG_DONTWAIT标志,它的作用是告诉recv()函数如果有数据到来的话就接受全部数据并立刻返回,没有数据的话也是立刻返回,而不进行任何的等待。这里的MSG_DONTWAIT是我们自己定义的一个标志。6.strcpy()为什么会造成缓冲区溢出?可用哪个函数替代?造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数,strcpy()函数将源字符串复制到缓冲区。没有指定要复制字符的具体数目。复制字符的数目直接取决于源字符串中的数目。如果源字符串碰巧来自用户输入,且没有专门限制其大小,则有可能会导致缓冲区溢出。可用strncpy()函数替代7.哪些方法可以避免或减少锁的使用8.给定一个int型数n,写一个尽可能简单的函数判断n是否为2的幂,不能用循环。答:boolfoo(intn){inta=n;if(n=0)returnfalse;a=((a&0xAAAAAAAA)1)+(a&0x55555555);a=((a&0xCCCCCCCC)2)+(a&0x33333333);a=((a&0xF0F0F0F0)4)+(a&0x0F0F0F0F);a=((a&0xFF00FF00)8)+(a&0x00FF00FF);a=((a&0xFFFF0000)16)+(a&0x0000FFFF);if(a==1)returntrue;elsereturnfalse;}9.能识别正则表达式的命令有:grepegrep10..VC中有哪些方法避免C编译头文件重复。#ifndef#define#endif#pragmaonce11.externC的用法。用于提供C接口,如使用C命名方式等作为extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。externC是连接申明(linkagedeclaration),被externC修饰的变量和函数是按照C语言方式编译和连接的.12.异步socket编程中,send不出数据的错误码是什么,(举Linux或Windows为例),你是怎么处理的?非阻塞SOCKET,SEND不出数据的原因,TCP下连接断开了和该SOCKET处在阻塞状态(也就是说在发送数据中)。UPD发不出可能是SOCKET处于阻塞状态。处理的办法就是记录下该SOCKET的状态,当状态为阻塞的时间,放入缓冲,当该SOCKET再次可写时,发送。13..函数前的static和volatile变量中关键字的作用(1)auto这个这个关键字用于声明变量的生存期为自动,即将不在任何类、结构、枚举、联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量。这个关键字不怎么多写,因为所有的变量默认就是auto的。(2)register这个关键字命令编译器尽可能的将变量存在CPU内部寄存器中而不是通过内存寻址访问以提高效率。(3)static常见的两种用途:1统计函数被调用的次数;2减少局部数组建立和赋值的开销.变量的建立和赋值是需要一定的处理器开销的,特别是数组等含有较多元素的存储类型。在一些含有较多的变量并且被经常调用的函数中,可以将一些数组声明为static类型,以减少建立或者初始化这些变量的开销.详细说明:1、变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。2、变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。3当static用来修饰全局变量时,它就改变了全局变量的作用域,使其不能被别的程序extern,限制在了当前文件里,但是没有改变其存放位置,还是在全局静态储存区。(4)const被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。它可以修饰函数的参数、返回值,甚至函数的定义体。作用:1修饰输入参数a.对于非内部数据类型的输入参数,应该将“值传递”的方式改为“const引用传递”,目的是提高效率。例如将voidFunc(Aa)改为voidFunc(constA&a)。b.对于内部数据类型的输入参数,不要将“值传递”的方式改为“const引用传递”。否则既达不到提高效率的目的,又降低了函数的可理解性。例如voidFunc(intx)不应该改为voidFunc(constint&x)。2用const修饰函数的返回值a.如果给以“指针传递”方式的函数返回值加const修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const修饰的同类型指针。如对于:constchar*GetString(void);如下语句将出现编译错误:char*str=GetString();//cannotconvertfrom'constchar*'to'char*';正确的用法是:constchar*str=GetString();b.如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加const修饰没有任何价值。如不要把函数intGetInt(void)写成constintGetInt(void)。3const成员函数的声明中,const关键字只能放在函数声明的尾部,表示该类成员不修改对象.说明:consttypem;//修饰m为不可改变示例:typedefchar*pStr;//新的类型pStr;charstring[4]=abc;constchar*p1=string;p1++;//正确,上边修饰的是*p1,p1可变constpStrp2=string;p2++;//错误,上边修饰的是p2,p2不可变,*p2可变同理,const修饰指针时用此原则判断就不会混淆了。constint*value;//*value不可变,value可

1 / 28
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功