基础知识1.下列那种语言是面向对象的(CD)A.CB.PASCALC.C++D.JAVA2.下面哪些是面向对象的基本特性(ABC)A多态B继承C封装D接口3.下面有关计算机操作系统的叙述中,不正确的是(B)A操作系统属于系统软件B操作系统只负责管理内存储器,而不管理外存储器CUNIX是一种操作系统D计算机的处理器、内存等硬件资源也由操作系统管理高级编程1、进程和线程的区别答案:进程是系统进行资源分配和调度的单位;线程是CPU调度和分派的单位,一个进程可以有多个线程,这些线程共享这个进程的资源。说法一:进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行2、malloc和new的区别答案:new是C++的关键字。malloc在分配内存时必须按给出的字节分配,new可以按照对象的大小自动分配,并且能调用构造函数。可以说new是对象的对象,而malloc不是。本质上new分配内存时,还会在实际内存块的前后加上附加信息,所以new所使用的内存大小比malloc多。1、new是c++中的操作符,malloc是c中的一个标准库函数;2、new可以按照对象的大小自动分配,并且new在分配内存时还会在实际内存块的前后加上附加信息,所以new所使用的内存大小会比malloc多,而且new在分配内存的同时会调用类的构造函数,而malloc在分配内存时必须按给出的字节分配,也不会进行初始化类成员的工作,即不能够把执行构造函数任务强加于malloc。3、内存泄漏对于malloc或者new都可以检查出来的,区别在于new可以指明是那个文件的那一行,而malloc没有这些信息。3、头文件中的ifndef/define/endif干什么用答案:防止该头文件被重复引用。4、在C++程序中调用被C编译器编译后的函数,为什么要加extern“C”声明答案:C++语言支持函数重载,C语言不支持函数重载。函数被C++编译后在库中的名字与C语言的不同。假设某个函数的原型为:voidfoo(intx,inty);该函数被C编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字。C++提供了C连接交换指定符号extern“C”来解决名字匹配问题。作为一种面向对象的语言,C++支持函数重载,而过程式语言C则不支持。函数被C++编译后在符号库中的名字与C语言的不同。例如,假设某个函数的原型为:voidfoo(intx,inty);该函数被C编译器编译后在符号库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字(_foo_int_int这样的名字包含了函数名、函数参数数量及类型信息,C++就是靠这种机制来实现函数重载的。例如,在C++中,函数voidfoo(intx,inty)与voidfoo(intx,floaty)编译生成的符号是不相同的,后者为_foo_int_float。)。为此C++提供了C连接交换指定符号extern“C”,被externC修饰的变量和函数是按照C语言方式编译和连接的,如此来解决名字匹配问题。5、指明以下const的作用voidGetValue(constchar*in_szName,char*out_szValue);答案:in_szName被强制保护,函数中不允许对其做修改,可以预防意外的变动,程序中使用const有利于提高程序的健壮性。6、请填写float,指针变量与“零值”比较的if语句提示:这里“零值”可以是0,0.0或者“空指针”。例如int变量n与“零值”比较的if语句为:if(n==0)if(n!=0)以此类推。请写出floatx与“零值”比较的if语句:答案:constfloatEPSINON=0.00001;if((x=-EPSINON)&&(x=EPSINON)不可将浮点变量用“==”或“!=”与数字比较,应该设法转化成“=”或“=”此类形式。请写出char*p与“零值”比较的if语句:答案:if(p==NULL)if(p!=NULL)7、以下为WindowsNT下的32位C++程序,请计算sizeof的值charstr[]=“Hello”;char*p=str;intn=10;请计算sizeof(str)=6sizeof(p)=4sizeof(n)=4voidFunc(charstr[100]){请计算sizeof(str)=4}void*p=malloc(100);请计算sizeof(p)=48、有关内存的思考voidGetMemory(char*p){p=(char*)malloc(100);}voidTest(void){char*str=NULL;GetMemory(str);strcpy(str,helloworld);printf(str);}请问运行Test函数会有什么样的结果?答案:程序崩溃。因为GetMemory并不能传递动态内存,Test函数中的str一直都是NULL。strcpy(str,helloworld);将使程序崩溃。char*GetMemory(void){charp[]=helloworld;returnp;}voidTest(void){char*str=NULL;str=GetMemory();printf(str);}请问运行Test函数会有什么样的结果?答案:可能是乱码。因为GetMemory返回的是指向“栈内存”的指针,该指针的地址不是NULL,但其原现的内容已经被清除,新内容不可知。voidGetMemory2(char**p,intnum){*p=(char*)malloc(num);}voidTest(void){char*str=NULL;GetMemory(&str,100);strcpy(str,hello);printf(str);}请问运行Test函数会有什么样的结果?答案:(1)能够输出hello(2)内存泄漏voidTest(void){char*str=(char*)malloc(100);strcpy(str,“hello”);free(str);if(str!=NULL){strcpy(str,“world”);printf(str);}}请问运行Test函数会有什么样的结果?答案:篡改动态内存区的内容,后果难以预料,非常危险。因为free(str);之后,str成为野指针,if(str!=NULL)语句不起作用。9、找错题voidtest1(){charstring[10];char*str1=“0123456789”;strcpy(string,str1);}答案:字符串str1需要11个字节才能存放已有内容,因为字符串是以’\0’作为结束的,而string只分配了10个字节的空间,strcpy将导致数组越界。10、编写strcpy函数已知strcpy函数的原型是char*strcpy(char*strDest,constchar*strSrc);其中strDest是目的字符串,strSrc是源字符串。不调用C++/C的字符串库函数,请编写函数strcpy答案:char*strcpy(char*strDest,constchar*strSrc);{assert((strDest!=NULL)&&(strSrc!=NULL));//assert()用于判断括号内的条件是否为真,为真时继续执行程序,为假时就终止该程序。char*address=strDest;while((*strDest++=*strSrc++)!=‘\0’);returnaddress;}