软件工程师经典笔试题IT笔试题41882.docx
软件工程师经典笔试题IT笔试题1. 用预处理指令#define声明一个常数,用以表明1年中有多少秒(忽略闰年问题)。答案:#deffine SECCONDS_PER_YYEAR(660*60*24*3665)UL应该意识到表达达式将使一个个16位机的的整形数溢出出,因此要用用到长整型符符号L,表达达式中UL表表示无符号长长整型。2. 写一个个“标准”宏MIN,这这个宏输入连连个参数并返返回较小的一一个。答案:#deffine MMIN(A,B) (A)<=(B)?(AA):(B)懂得在宏中小心心的吧参数用用括号扩起来来3. sizzeof 的的一些考察char* sss1=”001234556789”; charr ss2=”011234566789”; cchar sss31000=”001234556789”;int ss44100; char q1=”abc”; cchar qq2=”aan”; cchar* q3=”aan”; 答案:ss1是是一个字符指指针,指针的的大小是一个个确定的值,就就是4,siizeof(ss1)=4; sss2是一个个字符数组,这这个数组最初初的大小未定定,填充值是是“012344567899”,一个字符符占一位,再再加上隐含的的“0”一共是111位。 sss3是一个个字符数组,这这个数组开始始预分配1000,所以它它的大小是1100位。 ss44是一个整型型数组,但是是每个整型变变量所占空间间是4,所以以它的大小一一共是4000位。 qq1与ss22类似,占44位。Q2里里面有一个“n”,“n”算作一位,加加上隐含的,大大小一共是33位。Q3是是一个字符指指针,指针得得大小是一个个定值,就是是4.4 Whatt is tthe ouutput of thhe folllowinng codde?#includde <ioostreaam> uusing namesspace std; class AA ; classs A2 char d,e; strruct BB; sstructt C cchar xx,y; struuct Dint xx,y;main() couut<<siizeof(A)<<eendl; cout<<<sizeeof(A22)<<enndl; AA *p1=new AA(); A p2; A *pp3; coout<<ssizeoff(p1)<<<endll; couut<<siizeof(p2)<<<endl; coutt<<sizzeof(pp3)<<eendl; cout<<<sizeeof(B)<<enddl;couut<<siizeof(C)<<eendl; cout<<<sizeeof(D)<<enddl; reeturn 0; 答案:对于一个个类而言,即即便它是一个个空的类,编编译器仍然要要要给它一个个空间,所以以类A即便什什么也没有,它它的空间大小小依然为1,而类A2大小是类中连个字符d,e之和,所以它的空间大小依然是2,至于p1,p2,p3,p1和p3是指针,大小是一致的,而且是定值,为4,p2是A的对象,所以它的大小和类A相等,为1,B和C得解释同A和A2,至于D,它和C不同点在于,结构体有两个整型变量,每个整型变量所占空间为4,所以D所占空间大小为8。最后结果是 11, 2,44, 1,44,1,2,885. whaat is the ooutputt the folloowing code?#includde <ioostreaam> ussing nnamesppace sstd;class AA1 ppublicc: intt a; sstaticc int b;A1(); AA1();class AA2 ppublicc: intt a; cchar cc; A2(); AA2();class AA3 ppublicc: flooat a; charr c; AA3(); A3();class AA4 ppublicc: flooat a; int b; chhar c; A4(); A44();class AA5 ppublicc: douuble dd; flooat a; int b; chhar c; A5(); A55();int maiin() coutt<<sizzeof(AA1)<<ssizeoff(A2)<<<sizeeof(A33)<<siizeof(A4)<<<sizeoof(A5)<<enddl; reeturn 0;答案:因为静态态变量是存放放在全局数据据区的,而ssizeoff计算栈中分分配的大小,是是不会计算在在内的,所以以sizeoof(A1)是4;为了了照顾数据对对其,intt大小为4,cchar大小小为1,所以以sizeoof(A2)是8;为了了照顾数据对对其,flooat大小为为4,chaar大小为11,所以siizeof(A3)为88;为了照顾顾数据对其,ffloat大大小为4,iint大小为为4,chaar大小为11,所以siizeof(A4)为112;为了照照顾数据对其其,doubble大小为为8,flooat大小为为4,intt大小为4,cchar大小小为1,所以以sizeoof(A5)选择8的倍倍数为24。6. 以下代代码的输出结结果是()char vaarInt tesst(chaar varr) retruun sizzeof(vvar);答案:因为vaar等价价于*varr,函数内部部已经退化成成一个指针了了,所以大小小是4.7. 以下代代码的输出结结果是() Class B ffloat f; chhar p; int asf33; coutt<<sizzeof(BB)<<enndl;答案:floaat f占了了4个字节,cchar pp占了一个字字节,intt adf3占了112个字节,总总共是17个个,根据内存存的对齐原则则,要选择44的倍数,是是4×5=20个个字节。8. 以下代代码的输出结结果是() Class B ddoublee d; cchar pp; intt asf4; couut<<siizeof(B)<<eendl;答案:doubble d占占了8个字节节,charr p占了一一个字节,iint addf4占占了16个字字节,总共是是25个,根根据内存的对对齐原则,要要选择8的倍倍数,是322个字节。9. 一个空空类所占空间间为1,多重重继承的空类类所占的空间间还是1,但但是虚继承涉涉及到虚表(虚虚指针),所所以虚继承的的空类占的空空间为4。10. tthis指针针是在实例化化一个对象后后产生的,并并且指向对象象本身.比如如实例化一个个对象pt,那么thiis=&ptt;用”&”取地址符来来取对象的地地址.同样,如果定义对对象pt这个个类中,有一一个publlic变量xx,那么就可可以用thiis->x=0来定义xx的值,等同同于pt.xx=0.11. #incluude <iiostreeam> usingg nameespacee std; Void GeetMemoory(innt *z) *zz=5; Int maiin() int v; GeetMemoory(&vv); coout<<vv<<enddl; reeturn 0;Getmoryy把v的地址址传了过来,*z是地址址里的值,是是v的副本.通过直接修修改地址里的的值,不需要要有返回值,也把v给修修改了,因为为v所指向地地址的值发生生了改变,最最终程序会崩崩溃.12. 下面的的数据声明都都代表什么意意思?(1)floaat(*ddef)110Def是一个二二级指针,它它指向的是一一个指向一维维数组的指针针,数组的元元素都是flloat。(2)doubble*(*gh)110Gh是一个指针针,它指向一一个一维数组组,该数组元元素都是doouble*(3) douuble(*f10)()F是一个数组,ff有十个元素素,元素都是是指向函数的的指针,指向向的函数类型型是没有参数数且返回doouble的的函数(4)int*(*b)10)就跟“int*(b)110”是一样的,bb是一维数组组的指针(5)longg(*funn)(intt)函数指针:指向向函数的指针针(6)int(*(*f)(int,int)(int)F是一个函数的的指针,指向向的函数的类类型是有两个个int参数数并且返回一一个函数指针针的函数,返返回的函数指指针指向一个个int参数数且返回innt的函数。13. 指针数数组与数组指指针指针数组,是指指一个数组里里面装着指针针,数组指针针,代表它是是指针,指向向真个数组一个指向整型数数组的指针定定义为()A int(*ptr) BB.int *ptr C.int*(ptr) D.int pptrint(*pttr)是是以一个指向向整型数组的的指针int *pttr是指指针数组,pptr里里面存的的是是地址。它指指向位置的值值就是*pttr0,*ptr1,*pptr2,不要存*ptr00=5,*ptr11=6,因因为里面没有有相应的地址址int*(pttr)与与B相同14. 用变量量a给出下面面的定义(1)一个整型型数(2)一个指向向整形数的指指针(3)一个指向向指针的指针针,它指向的的指针是一个个整型数(4)一个有110个整型数数的数组(5)一个有110个指针的的数组,该指指针是指向一一个整型数的的(6)一个指向向有10个整整型数组的指指针(7)一个指向向函数的指针针,该函数有有一个整型参参数并返回一一个整型数(8)一个有110个指针的的数组,该指指针指向一个个函数,该函函数有一个整整型参数并返返回一个整数数Itn a; int *a; innt *aa; int aa10; innt *a10; int (*a)110; intt (*a)(int); int (*a100)(innt) 15.C+中中的空类默认认产生那些类类成员函数?Class EEmpty publiic:;答案:对于一个个空类,编译译器默认产生生4个成员函函数:默认构构造函数,析析构函数,拷拷贝构造函数数和赋值函数数(所有指针的大大小为4B)16.那一种成成员变量可以以在同一个类类的实例之间间共享?答案:必须使用用静态成员变变量在一个类类的所有实例例间共享数据据.如果想限限制对静态成成员变量的访访问,则必须须把他们声明明成保护型或或私有型.不不允许使用静静态成员变量量去存放一个个对象的数据据。静态成员员数据是在这这个类的所有有对象间共享享的。静态数据成员在类中,静态成成员可以实现现多个对象之之间的数据共共享,并且使使用静态数据据成员还不会会破坏隐藏的的原则,即保保证了安全性性。因此,静静态成员是类类的所有对象象中共享的成成员,而不是是某个对象的的成员。使用静态数数据成员可以以节省内存,因因为它是所有有对象所公有有的,因此,对对多个对象来来说,静态数数据成员只存存储一处,供供所有对象共共用。静态数数据成员的值值对每个对象象都是一样,但但它的值是可可以更新的。只只要对静态数数据成员的值值更新一次,保保证所有对象象存取更新后后的相同的值值,这样可以以提高时间效效率。静态数据成成员的使用方方法和注意事事项如下:1、静态数数据成员在定定义或说明时时前面加关键键字stattic。2、静态成成员初始化与与一般数据成成员初始化不不同。静态数数据成员初始始化的格式如如下:<数据据类型><类类名>:<<静态数据成成员名>=<<值>这表明: (1) 初始始化在类体外外进行,而前前面不加sttatic,以免与一般静态变量或对象相混淆。(2) 初初始化时不加加该成员的访访问权限控制制符privvate,ppublicc等。(3) 初初始化时使用用作用域运算算符来标明它它所属类,因因此,静态数数据成员是类类的成员,而而不是对象的的成员。3、静态数数据成员是静静态存储的,它它是静态生存存期,必须对对它进行初始始化。4、引用静静态数据成员员时,采用如如下格式:<类名>>:<静态态成员名>如果静态数数据成员的访访问权限允许许的话(即ppublicc的成员),可可在程序中,按按上述格式来来引用静态数数据成员。下面举一例例子,说明静静态数据成员员的应用:#includde class MMyclassspublic:Myclasss(int a, innt b, int cc);void GeetNumbber();void GeetSum();privatee:int A, B, C;static int SSum;int Mycclass:Sum = 0;Myclasss:Mycclass(int aa, intt b, iint c)A = a;B = b;C = c;Sum += A+B+CC;void Myyclasss:GettNumbeer()cout<<""Numbeer="<<<A<<","<<B<<<","<<<C<< endl;void Myyclasss:GettSum()cout<<""Sum=""<< Suum <<eendl;void maain()Myclasss M(3, 7, 110),N(14, 99, 11);M.GetNuumber();N.GetNuumber();M.GetSuum();N.GetSuum(); 从输出结果果可以看到SSum=544的值对M对对象和对N对对象都是相等等的。这是因因为在初始化化M对象时,将将M对象的三三个int型型数据成员的的值求和后赋赋给了Summ,于是Suum保存了该该值。在初始始化N对象时时,对将N对对象的三个iint型数据据成员的值求求和后又加到到Sum已有有的值上,于于是Sum将将保存另后的的值。所以,不不论是通过对对象M还是通通过对象N来来引用的值都都是一样的,即即为54。静态成员函函数静态成员函函数和静态数数据成员一样样,它们都属属于类的静态态成员,它们们都不是对象象成员。因此此,对静态成成员的引用不不需要用对象象名。在静态成员员函数的实现现中不能直接接引用类中说说明的非静态态成员,可以以引用类中说说明的静态成成员。如果静静态成员函数数中要引用非非静态成员时时,可通过对对象来引用。下下面通过例子子来说明这一一点。#includde class MMpublic:M(int aa) AA=a; BB+=a;static void f1(M m);privatee:int A;static int BB;void M:f1(MM m)cout<<""A="<<<M.A<<<ENDL;cout<<""B="<<<B<<ENNDL;int M:B=0;void maain()M P(5),Q(10);M:f1(PP); fiile:/调用时不用用对象名M:f1(QQ); 读者可以自自行分析其结结果。从中可可看出,调用用静态成员函函数使用如下下格式:<类名>>:<静态态成员函数名名>(<参数数表>); 17判断选择择1. C语语言没有可移移植性。 BA. 正确B. 不正确2. 定义数组组时可以不确确定元素个数数。 BA. 正确B. 不正确3. 指针是一一种特殊的变变量,只能用用来保存地址址。 AA. 正确B. 不正确4. 通过引用用或者指针调调用对象的成成员函数时,如如果引用或者者指针的类型型跟对象的类类型不一致时时,能自动正正确调用对象象所属的类中中对这个函数数的定义。 BA. 正确B. 不正确5. 如果定义义了一个类mmyclasss,则为mmyclasss类对象以以成员函数形形式重载后+运算符的的声明应该为为 C 。A. mycllass ooperattor+();B. mycllass& operaator+();C. mycllass ooperattor+( int );D. mycllass& operaator+( intt );5. 父类和子子类各自定义义一个成员函函数,函数名名相同,参数数表不同,那那么 C 。 函数同名,通通覆盖,不同层次的的函数不能重重载A. 在子类中中这两个函数数构成重载关关系B. 子类不会会继承父类的的这个函数C. 子类中的的函数会覆盖盖父类中的函函数D. 编译时会会发生错误6. 如果myyclasss类定义了拷拷贝构造函数数和一个整型型参数的构造造函数,还重重载了赋值运运算符,那么么语句myclasss obj = 1000;会 B 。等价于 myclaass obbj = mmyclasss(1000) A. 调用拷贝贝构造函数B. 调用整型型参数的构造造函数C. 调用赋值值运算符D. 引起编译译错误7. 抽象类指指的是 D 。A. 没有任何何成员的类B. 只有成员员函数没有数数据成员的类类C. 有虚函数数的类D. 有纯虚函函数的类8. 多重继承承时,如果派派生类的两个个父类有一个个共同的虚基基类,那么虚虚基类的初始始化参数由 C 的构造造函数来传递递。A. 第一个父父类B. 第二个父父类C. 派生类D. 以上都不不是9. 多态性是是通过 C 实现的。A. 构造函数数B. 析构函数数C. 虚函数D. 函数重载载10. 如果有有如下语句char sttr20;cin >> str;cout <<< str;执行时输入的是是“this is a test line!”,则输出的的内容是 DD 。/因因为thiss后面是空字字符,即结束束符。A. thiss is aa testt linee!B. thiss is aa testt lineeC. thiss is aa testtD. thiss11. 执行语语句char chh = "Helllo"char *pp = &cch0;cout <<< p;结果是输出 CC 。A. 一个地址址B. HC. HellloD. 乱码18.以下生面面是否正确?Class AA cconst int ssize=00;答案:常量必须须在构造函数数的初始化列列表里面初始始化或者将其其设置为sttatic正确的程序如下下:Class AA A() constt int size=0; ;或者:Class AA statiic connst innt sizze=0; ;