【计算机类职业资格】程序员面试-4及答案解析.doc
《【计算机类职业资格】程序员面试-4及答案解析.doc》由会员分享,可在线阅读,更多相关《【计算机类职业资格】程序员面试-4及答案解析.doc(25页珍藏版)》请在麦多课文档分享上搜索。
1、程序员面试-4 及答案解析(总分:100.00,做题时间:90 分钟)一、论述题(总题数:28,分数:100.00)1.C 与 C+变量初始化有什么不同 (分数:3.00)_2.不使用 C/C+字符串库函数,如何自行编写 strcpy()函数 (分数:3.00)_3.如何把数字转换成字符串 (分数:3.00)_4.如何自定义内存复制函数 memcpy() (分数:3.00)_5.编译和链接的区别是什么 (分数:3.00)_6.编译型语言与解释型语言的区别是什么 (分数:3.00)_7.如何判断一段程序是由 C 编译程序还是由 C+编译程序编译的 (分数:3.00)_8.在 C+程序中调用被 C
2、 编译器编译后的函数,为什么要加 extern “C“ (分数:3.00)_9.两段代码共存于一个文件,编译时有选择地编译其中的一部分,如何实现 (分数:3.00)_10.面向对象与面向过程有什么区别 (分数:3.00)_11.面向对象的基本特征有哪些 (分数:3.00)_12.什么是深拷贝?什么是浅拷贝 (分数:3.00)_13.什么是友元 (分数:4.00)_14.复制构造函数与赋值运算符的区别是什么 (分数:4.00)_15.基类的构造函数/析构函数是否能被派生类继承 (分数:4.00)_16.初始化列表和构造函数初始化的区别是什么 (分数:4.00)_17.类的成员变量的初始化顺序是按
3、照声明顺序吗 (分数:4.00)_18.当一个类为另一个类的成员变量时,如何对其进行初始化 (分数:4.00)_19.C+能设计实现一个不能被继承的类吗 (分数:4.00)_20.构造函数没有返回值,那么如何得知对象是否构造成功 (分数:4.00)_21.C+中的空类默认产生哪些成员函数 (分数:4.00)_22.如何设置类的构造函数的可见性 (分数:4.00)_23.public 继承、protected 继承、private 继承的区别是什么 (分数:4.00)_24.C+提供默认参数的函数吗 (分数:4.00)_25.C+中有哪些情况只能用初始化列表而不能用赋值 (分数:4.00)_26
4、.什么是虚函数 (分数:4.00)_27.C+如何实现多态 (分数:4.00)_28.C+中继承、虚函数、纯虚函数分别指的是什么 (分数:4.00)_程序员面试-4 答案解析(总分:100.00,做题时间:90 分钟)一、论述题(总题数:28,分数:100.00)1.C 与 C+变量初始化有什么不同 (分数:3.00)_正确答案:()解析:在 C 语言中,只能用常数对全局变量和静态变量进行初始化,否则编译器会报错。在 C 语言里,全局变量如果不初始化,默认为 0。C 语言中静态变量和全局变量(extern 外部变量属于全局变量)的分配内存空间和初始化是在编译阶段完成的,而其他变量是在编译阶段进
5、行内存空间分配、在程序运行时执行本函数时赋予初值的。 而在 C+中,如果在一个文件中定义了 int a=5,要在另一个文件中定义 int b=a,前面必须对 a 进行声明:extern int a,否则编译不通过,即使是 int b=a,这句话也是分两步进行的:在编译阶段,编译器把 b 当做是未初始化数据而将它初始化为 0;在执行阶段,在 main 被执行前有一个全局对象的构造过程,int b=a,被当做是 int 型对象 b 的复制初始化构造来执行。 在 C+中全局对象、变量的初始化是独立的,如果不是像 int a=5 这样的已初始化数据,那么就是像 b 这样的未初始化数据。而 C+中全局对
6、象、变量的构造函数调用顺序是跟声明有一定关系的,臣口在同一个文件中先声明的先调用。对于不同文件中的全局对象、变量,它们的构造函数调用顺序是未定义的,取决于具体的编译器,不同的编译器、连接器,结果都可能不同,另外,连接时,指定.obj 文件的顺序也有关系。 引申:C 语言中各种变量的默认初始值是什么? 全局变量放在内存的全局数据区,由编译器建立,如果在定义的时候不做初始化,则系统将自动为其初始化,数值型为 0,字符型为 NULL,即 0,指针变量也被赋值为 NULL。静态变量的情况与全局变量类似。而非静态局部变量如果不显示初始化,那么其内容是不可预料的,将是随机数,会很危险,对系统的安全造成非常
7、大的隐患。2.不使用 C/C+字符串库函数,如何自行编写 strcpy()函数 (分数:3.00)_正确答案:()解析:strcpy 的原型为 extem char *strcpy(char *dest,const char *src);它包含在头文件 string.h中,它的返回指向 dest 的指针,其功能是把 src 所指由 NULL 结束的字符串复制到 dest 所指的数组中。值得注意的是,src 和 dest 所指内存区域不可以重叠,且 dest 必须有足够的空间来容纳 src 的字符串,src 字符串尾的字符串结束标识符“/0“也会被复制过去。 char *strcpy(char
8、*strDest,const char *strSrc); assert(strDest!=NULL) if (strDest=strSrc) return strDest; char *address=strDest; while(*strDest+=*strSrc+)!=“/0“) return address; C 语言的 assert()在assert.h中,当使用 assert 时,给它一个参数,即一个判断为真的表达式。strcpy 能把 strSrc 的内容复制到 strDest,返回类型为 char*主要是为了实现链式表达式。例如: int length=strlen(strcp
9、y(strDest,“hello world“); strcpy(strDest,strcpy(strDest1,strSrc); 可以将 strSrc 复制到 strDest1 与 strDest 中,也就是说,可以将函数的返回值做为另一个函数的参数。 程序代码示例如下: #includestdio.h #includestring.h int main() char str=“hello world“; strcpy(str,“h“); printf(“%s/n“,str); printf(”%c/n“,str3); return 0; 程序输出结果: h 1 因为 strcpy 将 K
10、以及/0 一直复制到 str 的地址空间内,覆盖了 hello world 字符串(hello world 是在栈区上分配的内存空间),但是后续的字符并没有被替换,如 str3仍然是 1。将 char str=“hello world“;改为 char* str=“hello world“;是不允许的,因为 str 此时是一个指针变量。 再例如: #includestdio.h #includestring.h int main() char s=“123456789“; char d=“123“; strcpy(d,s); printf(“%s/n%s/n“,d,s); return 0;
11、程序输出结果: 123456789 56789 上例中,数组 s 和数组 d 在内存中的存储结构如图所示。 图 1 数组 s 和数组 d 在内存中的存储结构strcpy 的功能就是把“源字符串”s 复制到“目的字符串”d,直到遇到“源字符串”的结束标识符/0,复制后的数组 d 和数组 S 的存储结构如图 2 所示。 3.如何把数字转换成字符串 (分数:3.00)_正确答案:()解析:C 语言中常用到字符串与数字之间的相互转换,常见的此类库函数有 atof(字符串转换成浮点数)、atoi(字符串转换成整型数)、atol(字符串转换成长整型数)、itoa(整型数转换成字符串)、ltoa(长整型数转
12、换为字符串)等。 为了考查求职者对基本功的掌握,在程序员的面试笔试中经常会见到此类题目,让求职者自定义此类函数的实现,此类题目虽然难度不大,但是需要认真仔细对待。 以自定义 Myatoi()与 Myitoa()函数为例,分别实现自定义字符串转换为整型数函数与自定义整型数转换为字符串函数。以下为自定义 Myatoi()函数的实现以及测试代码。 #includestdio.h int Myatoi(char* str) if(str=NULL) printf(“Invalid Input“); return-1; while(*str=“) str+; while(*str=(char)0xA1)
13、 int nSign=(*str=“-“)?-1:1;确定符号位 if(str=“+“*str=“-“) str+; int nResult=0; while(*str=“0“ str+; return nResult*nSign; int main() printf(“%d/n“,Myatoi(“12345“); return 0; 程序输出结果: 12345 以下为自定义 Myitoa 函数的实现以及测试代码: #includestdio.h char* Myitoa(int num) char str1024; int sign=num,i=0,j=0; char temp11; if(
14、sign0) num=-num; ; do tempi=num%10+“0“; num/=10; i+; while(num0); if(sign0) tempi+=“-“; tempi=“/0“; i-; while(i=0) strj=tempi; j+; i-; strj=“/0“; return str; int main() printf(“%s/n“,Myitoa(-12345); return 0; 程序输出结果: -123454.如何自定义内存复制函数 memcpy() (分数:3.00)_正确答案:()解析:memcpy 是 C 语言中的内存复制函数,它的函数原型为 void
15、 *memcpy(void *dest, const void*src, size_t n)。它的目的是将 src 指向地址为起始地址的连续 n 个字节的数据复制到以 dest 指向地址为起始地址的空间内,函数返回指向 destin 的指针。需要注意的是,src 和 dest 所指内存区域不能重叠,同时,与 strcpy 相比,memcpy 遇到“/0“不结束,而是一定会复制完 n 个字节。而且如果目标数组 dest 本身已有数据,执行 memcpy()之后,将覆盖原有数据(最多覆盖 n)。如果要追加数据,则每次执行 memcpy 后,要将目标数组地址增加到要追加数据的地址。 memcpy()
16、函数用来做内存复制,可以拿它来复制任何数据类型的对象,可以指定复制的数据长度,例如: char a100,b50; memcpy(b,a,sizeof(a); strcpy 和 memcpy 都是用于从一块内存复制一段连续的数据到另一块内存,区别是终结标识不同。strcpy(a,b)从 b 复制内容到 a,然后从 b+1 复制内容到 a+1,依次类推,直到 b+i 的内容是“/0“。而memcpy(a,b,c)从 b 开始复制 c 字节内容到 a,相比 strcpy,memcpy 是确定复制 c 个字节的。所以只要保证 b 开始有 c 字节有效数据,a 开始有 c 字节内存空间就行。 自定义内
17、存复制构造函数示例如下: #includestdio.h void* MyMemCpy(void *dest,const void *src, size_t count) char* pdest=static castchar*(dest); const char* psrc=static_castconst char*(src); if(pdestpsrc)i!=-1;-i) pdesti=psrci; else for(size_t i=0;icount;+i) pdesti=psrci; return dest; int main() char str=“0123456789“; MyM
18、emCpy(str+1,str+0,9); printf(“%s/n“,str); MyMemCpy(str,str+5,5); printf(“%s/n“,str); return 0; 程序输出结果: 0012345678 45678456785.编译和链接的区别是什么 (分数:3.00)_正确答案:()解析:在多道程序环境中,要想将用户源代码变成一个可以在内存中执行的程序,通常分为 3 个步骤:编译、链接、载入。 1)编译:将预处理生成的文件,经过词法分析、语法分析、语义分析以及优化后编译成若干个目标模块。可以理解为将高级语言翻译为计算机可以理解的二进制代码,即机器语言。 2)链接:由链
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
5000 积分 0人已下载
下载 | 加入VIP,交流精品资源 |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 职业资格 程序员 面试 答案 解析 DOC
