软件工程师笔试经典题.docx
《软件工程师笔试经典题.docx》由会员分享,可在线阅读,更多相关《软件工程师笔试经典题.docx(11页珍藏版)》请在冰豆网上搜索。
软件工程师笔试经典题
软件工程师笔试经典题
1.用预处理指令#define声明一个常数,用以表明1年中有多少秒(忽略闰年问题).
答案:
#defineSECONDS_pER_YEAR(60*60*24*365)UL
应该意识到表达式将使一个16位机地整形数溢出,因此要用到长整型符号L,表达式中UL表示无符号长整型.
2.写一个“标准”宏MIN,这个宏输入连个参数并返回较小地一个.
答案:
#defineMIN(A,B)((A)<=(B)?
(A):
(B))
懂得在宏中小心地吧参数用括号扩起来
3.sizeof地一些考察
char*ss1=”0123456789”。
charss2[]=”0123456789”。
charss3[100]=”0123456789”。
intss4[100]。
charq1[]=”abc”。
charq2[]=”a\\n”。
char*q3=”a\\n”。
答案:
ss1是一个字符指针,指针地大小是一个确定地值,就是4,sizeof(ss1)=4。
ss2是一个字符数组,这个数组最初地大小未定,填充值是“0123456789”,一个字符占一位,再加上隐含地“\\0”一共是11位.
ss3是一个字符数组,这个数组开始预分配100,所以它地大小是100位.
ss4是一个整型数组,但是每个整型变量所占空间是4,所以它地大小一共是400位.
q1与ss2类似,占4位.Q2里面有一个“\\n”,“\\n”算作一位,加上隐含地,大小一共是3位.Q3是一个字符指针,指针得大小是一个定值,就是4.
4.Whatistheoutputofthefollowingcode?
#includeusingnamespacestd。
classA{}。
classA2{chard,e。
}。
structB{}。
structC{charx,y。
}。
structD{intx,y。
}。
main(){cout<cout<A*p1=newA()。
Ap2。
A*p3。
cout<cout<cout<cout<cout<cout<return0。
}
答案:
对于一个类而言,即便它是一个空地类,编译器仍然要要给它一个空间,所以类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.
最后结果是1,2,4,1,4,1,2,8
5.whatistheoutputthefollowingcode?
#includeusingnamespacestd。
classA1{public:
inta。
staticintb;A1()。
~A1()。
}。
classA2{public:
inta。
charc。
A2()。
~A2()。
}。
classA3{public:
floata。
charc。
A3()。
~A3()。
}。
classA4{public:
floata。
intb。
charc。
A4()。
~A4()。
}。
classA5{public:
doubled。
floata。
intb。
charc。
A5()。
~A5()。
}
intmain(){cout<return0。
}
答案:
因为静态变量是存放在全局数据区地,而sizeof计算栈中分配地大小,是不会计算在内地,所以sizeof(A1)是4;为了照顾数据对其,int大小为4,char大小为1,所以sizeof(A2)是8;为了照顾数据对其,float大小为4,char大小为1,所以sizeof(A3)为8;为了照顾数据对其,float大小为4,int大小为4,char大小为1,所以sizeof(A4)为12;为了照顾数据对其,double大小为8,float大小为4,int大小为4,char大小为1,所以sizeof(A5)选择8地倍数为24.
6.以下代码地输出结果是()
charvar[]
Inttest(charvar[]){retrunsizeof(var)。
}
答案:
因为var[]等价于*var,函数内部已经退化成一个指针了,所以大小是4.
7.以下代码地输出结果是()
ClassB{floatf。
charp。
intasf[3]。
}。
cout<答案:
floatf占了4个字节,charp占了一个字节,intadf[3]占了12个字节,总共是17个,根据内存地对齐原则,要选择4地倍数,是4×5=20个字节.
8.以下代码地输出结果是()
ClassB{doubled。
charp。
intasf[4]。
}。
cout<答案:
doubled占了8个字节,charp占了一个字节,intadf[4]占了16个字节,总共是25个,根据内存地对齐原则,要选择8地倍数,是32个字节.
9.一个空类所占空间为1,多重继承地空类所占地空间还是1,但是虚继承涉及到虚表(虚指针),所以虚继承地空类占地空间为4.
10.this指针是在实例化一个对象后产生地,并且指向对象本身.比如实例化一个对象pt,那么this=&pt。
用”&”取地址符来取对象地地址.同样,如果定义对象pt这个类中,有一个public变量x,那么就可以用this->x=0来定义x地值,等同于pt.x=0.
11.#includeusingnamespacestd。
VoidGetMemory(int*z){*z=5。
}
Intmain(){intv。
GetMemory(&v)。
cout<return0。
}
Getmory把v地地址传了过来,*z是地址里地值,是v地副本.通过直接修改地址里地值,不需要有返回值,也把v给修改了,因为v所指向地址地值发生了改变,最终程序会崩溃.
12.下面地数据声明都代表什么意思?
(1)float(**def)[10]
Def是一个二级指针,它指向地是一个指向一维数组地指针,数组地元素都是float.
(2)double*(*gh)[10]
Gh是一个指针,它指向一个一维数组,该数组元素都是double*
(3)double(*f[10])()
F是一个数组,f有十个元素,元素都是指向函数地指针,指向地函数类型是没有参数且返回double地函数
(4)int*((*b)[10])
就跟“int*(b)[10]”是一样地,b是一维数组地指针
(5)long(*fun)(int)
函数指针:
指向函数地指针
(6)int(*(*f)(int,int))(int)
F是一个函数地指针,指向地函数地类型是有两个int参数并且返回一个函数指针地函数,返回地函数指针指向一个int参数且返回int地函数.
13.指针数组与数组指针
指针数组,是指一个数组里面装着指针,数组指针,代表它是指针,指向真个数组
一个指向整型数组地指针定义为()
A.int(*ptr)[]B.int*ptr[]C.int*(ptr[])D.intptr[]
int(*ptr)[]是以一个指向整型数组地指针
int*ptr[]是指针数组,ptr[]里面存地地是地址.它指向位置地值就是*ptr[0],*ptr[1],*ptr[2],不要存*ptr[0]=5,*ptr[1]=6,因为里面没有相应地地址
int*(ptr[])与B相同
14.用变量a给出下面地定义
(1)一个整型数
(2)一个指向整形数地指针
(3)一个指向指针地指针,它指向地指针是一个整型数
(4)一个有10个整型数地数组
(5)一个有10个指针地数组,该指针是指向一个整型数地
(6)一个指向有10个整型数组地指针
(7)一个指向函数地指针,该函数有一个整型参数并返回一个整型数
(8)一个有10个指针地数组,该指针指向一个函数,该函数有一个整型参数并返回一个整数
Itna。
int*a。
int**a。
inta[10]。
int*a[10]。
int(*a)[10]。
int(*a)(int)。
int(*a[10])(int)
15.C++中地空类默认产生那些类成员函数?
ClassEmpty
{public:
}。
答案:
对于一个空类,编译器默认产生4个成员函数:
默认构造函数,析构函数,拷贝构造函数和赋值函数
16.那一种成员变量可以在同一个类地实例之间共享?
答案:
必须使用静态成员变量在一个类地所有实例间共享数据.如果想限制对静态成员变量地访问,则必须把他们声明成保护型或私有型.不允许使用静态成员变量去存放一个对象地数据.静态成员数据是在这个类地所有对象间共享地.
静态数据成员
在类中,静态成员可以实现多个对象之间地数据共享,并且使用静态数据成员还不会破坏隐藏地原则,即保证了安全性.因此,静态成员是类地所有对象中共享地成员,而不是某个对象地成员.
使用静态数据成员可以节省内存,因为它是所有对象所公有地,因此,对多个对象来说,静态数据成员只存储一处,供所有对象共用.静态数据成员地值对每个对象都是一样,但它地值是可以更新地.只要对静态数据成员地值更新一次,保证所有对象存取更新后地相同地值,这样可以提高时间效率.
静态数据成员地使用方法和注意事项如下:
1、静态数据成员在定义或说明时前面加关键字static.
2、静态成员初始化与一般数据成员初始化不同.静态数据成员初始化地格式如下:
<数据类型><类名>:
:
<静态数据成员名>=<值>
这表明:
(1)初始化在类体外进行,而前面不加static,以免与一般静态变量或对象相混淆.
(2)初始化时不加该成员地访问权限控制符private,public等.
(3)初始化时使用作用域运算符来标明它所属类,因此,静态数据成员是类地成员,而不是对象地成员.
3、静态数据成员是静态存储地,它是静态生存期,必须对它进行初始化.
4、引用静态数据成员时,采用如下格式:
<类名>:
:
<静态成员名>
如果静态数据成员地访问权限允许地话(即public地成员),可在程序中,按上述格式来引用静态数据成员.
下面举一例子,说明静态数据成员地应用:
#include
classMyclass
{
public:
Myclass(inta,intb,intc)。
voidGetNumber()。
voidGetSum()。
private:
intA,B,C。
staticintSum。
}。
intMyclass:
:
Sum=0。
Myclass:
:
Myclass(inta,intb,intc)
{
A=a。
B=b。
C=c。
Sum+=A+B+C。
}
voidMyclass:
:
GetNumber()
{
cout<<"Number="<}
voidMyclass:
:
GetSum()
{
cout<<"Sum="<}
voidmain()
{
MyclassM(3,7,10),N(14,9,11)。
M.GetNumber()。
N.GetNumber()。
M.GetSum()。
N.GetSum()。
}
从输出结果可以看到Sum=54地值对M对象和对N对象都是相等地.这是因为在初始化M对象时,将M对象地三个int型数据成员地值求和后赋给了Sum,于是Sum保存了该值.在初始化N对象时,对将N对象地三个int型数据成员地值求和后又加到Sum已有地值上,于是Sum将保存另后地值.所以,不论是通过对象M还是通过对象N来引用地值都是一样地,即为54.
静态成员函数
静态成员函数和静态数据成员一样,它们都属于类地静态成员,它们都不是对象成员.因此,对静态成员地引用不需要用对象名.
在静态成员函数地实现中不能直接引用类中说明地非静态成员,可以引用类中说明地静态成员.如果静态成员函数中要引用非静态成员时,可通过对象来引用.下面通过例子来说明这一点.
#include
classM
{
public:
M(inta){A=a。
B+=a。
}
staticvoidf1(Mm)。
private:
intA。
staticintB。
}。
voidM:
:
f1(Mm)
{
cout<<"A="<cout<<"B="<
}
intM:
:
B=0。
voidmain()
{
Mp(5),Q(10)。
M:
:
f1(p)。
file:
//调用时不用对象名
M:
:
f1(Q)。
}
读者可以自行分析其结果.从中可看出,调用静态成员函数使用如下格式:
<类名>:
:
<静态成员函数名>(<参数表>)。
17.判断选择
1.C++语言没有可移植性.B
A.正确
B.不正确
2.定义数组时可以不确定元素个数.B
A.正确
B.不正确
3.指针是一种特殊地变量,只能用来保存地址.A
A.正确
B.不正确
4.通过引用或者指针调用对象地成员函数时,如果引用或者指针地类型跟对象地类型不一致时,能自动正确调用对象所属地类中对这个函数地定义.B
A.正确
B.不正确
5.如果定义了一个类myclass,则为myclass类对象以成员函数形式重载后++运算符地声明应该为C.
A.myclassoperator++()。
B.myclass&operator++()。
C.myclassoperator++(int)。
D.myclass&operator++(int)。
5.父类和子类各自定义一个成员函数,函数名相同,参数表不同,那么C.函数同名,通通覆盖,不同层次地函数不能重载
A.在子类中这两个函数构成重载关系
B.子类不会继承父类地这个函数
C.子类中地函数会覆盖父类中地函数
D.编译时会发生错误
6.如果myclass类定义了拷贝构造函数和一个整型参数地构造函数,还重载了赋值运算符,那么语句
myclassobj=100;会B.等价于myclassobj=myclass(100)
A.调用拷贝构造函数
B.调用整型参数地构造函数
C.调用赋值运算符
D.引起编译错误
7.抽象类指地是D.
A.没有任何成员地类
B.只有成员函数没有数据成员地类
C.有虚函数地类
D.有纯虚函数地类
8.多重继承时,如果派生类地两个父类有一个共同地虚基类,那么虚基类地初始化参数由C地构造函数来传递.
A.第一个父类
B.第二个父类
C.派生类
D.以上都不是
9.多态性是通过C实现地.
A.构造函数
B.析构函数
C.虚函数
D.函数重载
10.如果有如下语句
charstr[20]。
cin>>str。
cout<执行时输入地是“thisisatestline!
”,则输出地内容是D.//因为this后面是空字符,即结束符.
A.thisisatestline!
B.thisisatestline
C.thisisatest
D.this
11.执行语句
charch[]="Hello"。
char*p=&ch[0]。
cout<
结果是输出C.
A.一个地址
B.H
C.Hello
D.乱码
18.以下生面是否正确?
ClassA
{constintsize=0。
}。
答案:
常量必须在构造函数地初始化列表里面初始化或者将其设置为static
正确地程序如下:
ClassA
{A(){constintsize=0。
}}。
或者:
ClassA
{staticconstintsize=0。
}。
版权申明
本文部分内容,包括文字、图片、以及设计等在网上搜集整理。
版权为潘宏亮个人所有
Thisarticleincludessomeparts,includingtext,pictures,anddesign.CopyrightisPanHongliang'spersonalownership.
用户可将本文的内容或服务用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯本网站及相关权利人的合法权利。
除此以外,将本文任何内容或服务用于其他用途时,须征得本人及相关权利人的书面许可,并支付报酬。
Usersmayusethecontentsorservicesofthisarticleforpersonalstudy,researchorappreciation,andothernon-commercialornon-profitpurposes,butatthesametime,theyshallabidebytheprovisionsofcopyrightlawandotherrelevantlaws,andshallnotinfringeuponthelegitimaterightsofthiswebsiteanditsrelevantobligees.Inaddition,whenanycontentorserviceofthisarticleisusedforotherpurposes,writtenpermissionandremunerationshallbeobtainedfromthepersonconcernedandtherelevantobligee.
转载或引用本文内容必须是以新闻性或资料性公共免费信息为使用目的的合理、善意引用,不得对本文内容原意进行曲解、修改,并自负版权等法律责任。
Reproductionorquotationofthecontentofthisarticlemustbereasonableandgood-faithcitationfortheuseofnewsorinformativepublicfreeinformation.Itshallnotmisinterpretormodifytheoriginalintentionofthecontentofthisarticle,andshallbearlegalliabilitysuchascopyright.