杭州达内面试题整理Author:Author:Author:Author:hztarenahztarenahztarenahztarenaEmail:caohao@tarena.com.cnEmail:caohao@tarena.com.cnEmail:caohao@tarena.com.cnEmail:caohao@tarena.com.cnC++部分一、基本知识1、写出以下类derived的构造函数的定义,使其aa和bb的值分别为i和j,其基类的成员a的值为k.classbase{inta;public:base(inti){a=I;}};classderived:publicbase{baseaa,bb;public:derived(inti,intj,intk);};答:derived::derived(intderived::derived(intderived::derived(intderived::derived(inti,i,i,i,intintintintj,j,j,j,intintintintk):aa(i),bb(j),base(k)k):aa(i),bb(j),base(k)k):aa(i),bb(j),base(k)k):aa(i),bb(j),base(k);;;;2、指出下列程序中错误,并改正:#includeiostream#includestring.hclassString{char*p;public:String(char*s){p=newchar[strlen(s)+1];strcpy(p,s);}~String(){deletep;}};voidmain(){Strings1(“astring”);Strings2(“anotherstring”);Strings3=s1;s1=s1;s2=s1;}注:不考虑输出参数为null的情况答:析构函数中的释放动态内存有问题,应该是:deletedeletedeletedelete[][][][]p;p;p;p;3、指出下列程序中的错误,并改正:classClass1{public:Class1(char*p){}};classClass2{public:杭州达内面试题整理Author:Author:Author:Author:hztarenahztarenahztarenahztarenaEmail:caohao@tarena.com.cnEmail:caohao@tarena.com.cnEmail:caohao@tarena.com.cnEmail:caohao@tarena.com.cnClass2(char*p){}};voidf(Class1&x){}voidf(Class2&x){}voidmain(){f(“String”);}答:在mainmainmainmain函数中调用的f(String)f(String)f(String)f(String),由于传入的参数是一个字符串,而声明的两个ffff函数传入的形参分别是Class1&Class1&Class1&Class1&和Class2&Class2&Class2&Class2&,因此编译的时候会出错。4、classstring{public:string(constchar*value);~string();…private:char*data;};string::string(constchar*value){if(value){data=newchar[strlen(value)+1];strcpy(data,value);}else{data=newchar[1];*data=‘\0’;}}inlinestring::~string(){delete[]data;}voidmain(){stringa(“hello”);stringb(“world”);stringc;stringe(a);c=b;}指出程序的问题,并描述为什么?答:首先,stringstringstringstring类的构造函数中没有无参的构造方法,因此stringstringstringstringcccc声明有错,另外最好在析构函数中令datadatadatadata=null=null=null=null。杭州达内面试题整理Author:Author:Author:Author:hztarenahztarenahztarenahztarenaEmail:caohao@tarena.com.cnEmail:caohao@tarena.com.cnEmail:caohao@tarena.com.cnEmail:caohao@tarena.com.cn一、简答题1、简述C++中继承、虚函数、纯虚函数的概念和用法答:继承是指一种事物自动获得另一种事物的全部东西(属性,能力)。继承方法:classclassclassclass派生类名:public|protected|privatepublic|protected|privatepublic|protected|privatepublic|protected|private基类名{}{}{}{}三种继承方式跟类成员的三种访问属性一样。用virtualvirtualvirtualvirtual修饰的函数就是虚函数。如果需要使用多态特性,就必须使用虚函数。如果一个类肯定被用作其他类的基类尽可能使用虚函数。以基类对象的身份调用的虚函数,如果对象是派生类的,派生类的相应函数会被调用,从而可以实现通过完全相同的调用形式让不同的类型的对象作出自己不同的响应。在虚函数的声明后面直接添加=0=0=0=0,以分号结束,这类没有函数体的虚函数叫纯虚函数。纯虚函数永远不会被调用,它们主要用来统一管理子类对象。2、简述C++中异常的处理方法以及使用了哪些关键字答:CCCC++++++++异常处理使用的关键字有:try,catch,throw.try,catch,throw.try,catch,throw.try,catch,throw.CCCC++++++++中的异常处理机制只能处理由throwthrowthrowthrow捕获的异常,没有捕获的将被忽略。使用try{}catchtry{}catchtry{}catchtry{}catch(){}{}{}{}语句来捕获异常,把可能发生异常的代码放在try{}try{}try{}try{}语句块中,后面跟若干个catchcatchcatchcatch(){}{}{}{}负责处理具体的异常类型,这样一组有trytrytrytry块和不少于一个的catchcatchcatchcatch块就构成了一级异常捕获。如果本级没有带适当类型参数的catchcatchcatchcatch块,将不能捕获异常,异常就会向上一级传递,函数调用处如果没有捕获住异常,则直接跳到更高一层的调用者,如果一直没有捕获该异常,c++c++c++c++会使用默认的异常处理函数,该函数可能会让程序最终跳出maimaimaimainnnn函数并导致程序异常终止。3、头文件中的ifndef/define/endef干什么用?答:防止该头文件被重复引用。4、#includefilename.h和#include”filename.h”有什么区别?答:对于#include#include#include#includefilename.hfilename.hfilename.hfilename.h,编译器从标准库路径开始搜索filename.hfilename.hfilename.hfilename.h对于#include#include#include#include“filename.hfilename.hfilename.hfilename.h”,编译器从用户的工作路径开始搜索filename.hfilename.hfilename.hfilename.h5、Const有什么用途?(请至少说明两种)答:(1111)可以定义constconstconstconst常量(2222)constconstconstconst可以修饰函数的参数、返回值,甚至函数的定义体。被constconstconstconst修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。6、在C++程序中调用被C编译器编译后的函数,为什么要加extern”C”声明?答:C++C++C++C++语言支持函数重载,CCCC语言不支持函数重载。函数被C++C++C++C++编译后在库中的名字与CCCC语言的不同。假设某个函数的原型为:voidfoo(intx,inty);该函数被CCCC编译器编译后在库中的名字为_foo_foo_foo_foo,而C++C++C++C++编译器则会产生像____foofoofoofoo____intintintint____intintintint之类的名字。C++C++C++C++提供了CCCC连接交换指定符号externexternexternextern“CCCC”来解决名字匹配问题。杭州达内面试题整理Author:Author:Author:Author:hztarenahztarenahztarenahztarenaEmail:caohao@tarena.com.cnEmail:caohao@tarena.com.cnEmail:caohao@tarena.com.cnEmail:caohao@tarena.com.cn7、请简述以下两个for循环的优缺点//第一个for(i=0;iN;i++){if(condition)DoSomething();elseDoOtherthing();}答:优点:程序简洁缺点:多执行了N-1次逻辑判断,并且打断了循环“流水线”作业,使得编译器不能对循环进行优化处理,降低了效率。//第二个if(condition){for(i=0;iN;i++)DoSomething();}else{for(i=0;iN;i++)DoOtherthing();}答:优点:循环的效率高缺点:程序不简洁二、有关内存的思考请问运行了Test函数会有什么样的结果?voidGetMemory(char*p){p=(char*)malloc(100);}voidTest(void){Char*str=NULL;GetMemory(str);strcpy(str,”helloworld”);printf(str);}请问运行了Test函数会有什么样的结果?答:程序崩溃。因为GetMemoryGetMemoryGetMemoryGetMemory并不能传递动态内存,Test函数中的str一直都是NULL。strcpy(str,helloworld);将使程序崩溃。char*GetMemory(void){charp[]=“helloworld”;returnp;}voidtest(void){char*str=NULL;str=GetMemory();printf(str);}请问运行了Test函数会有什么样的结果?答:可能是乱码。因为GetMemory返回的是指向“栈内存”的指针,该指针的地址不是NULL,但其原现的内容已经被清除,新内容不可知。杭州达内面试题整理Author:Author:Author:Author:hztarenahztarenahztarenahztarenaEmail:caohao@tarena.com.cnEmail:caohao@tarena.com.cnEmail:caohao@tarena.com.cnEmail:caohao@tarena.com.cn数据库部分数据库知识:1、请说明Oracle数据库有哪些主要的数据类型,举例说明每种类型的用途?答:varchar2(varchar2(varchar2(varchar2(长度))))可变长字符串c