富士通c++面试题

5星(超过95%的资源)
所需积分/C币:9 2011-09-27 12:35:32 278KB PDF
36
收藏 收藏
举报

C++常见笔试题和面试题目-富士通南大软件 ①链表反转 单向链表的反转是一个经常被问到的一个面试题,也是一个非常基础的问题。比如一个链表 是这样的: 1->2->3->4->5 通过反转后成为5->4->3->2->1。 最容易想到的方法遍历一遍链表,利用一个辅助指针,存储遍历过程中当前指针指向的下一 个元素,然 后将当前节点元素的指针反转后,利用已经存储的指针往后面继续遍历。源代码如下: struct linka { int data; linka* next;
mdata new char [strlen(rhs.m-data)+1] strcpy(m_data, rhs. m-data return String:: String O delete []m_data ③网上流传的c+笔试题汇总 1.求下面函数的返回值(微软) int func(x) nt count =0 while(x) county ++ rcturn county 假定x=9999。答案:8 思路:将ⅹ转化为2进制,看会有的1的个数 2.什么是“引用”?申明和使用“引用”要注意哪些问题? 答:引用就是某个目标变量的“别名”( alias),对引用的操作与对变量直接操作效果完全 相同。申明一个引用的时侯,切记要对其进行初始化。引用声明完毕后,相当于目标变量名 有两个名称,即该目标原名称和引用名,不能再把该引用名作为其他变量名的别名。声明 个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是 种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。不能建立数组 的引用 3.将“引用”作为函数参数有哪些特点? (1)传递引用给函数与传递拦针的效果是一样的。这时,被调函数的形参就成为原来主调 函数中的实参变量或对象的一个别名来使凨,所以在被调函数中对形参变量的操作就是对其 相应的目标对象(在主调函数中)的操作 (2)使用引月传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作; 而使用一般变量传递函数的参数,兰发生函数调用时,需要给形参分配存储单元,形参变量 是实参变量的副木;如果传涕的是对象,还将调用拷贝构造函数。囚此,当参数传递的数据 较大时,用引用比用一般变量传参数的效率和所占空间都好 (3)使用指针作为函数的参数虽然也能达到与使用引用的效果,但是,在被调函数中同样 要给形参分配存储单元,且需要重复使用"*指针变量名"的形式进行运算,这很容易产生错 误且程序的阅读性较差;另一方面,在主调函数的调用点处,必须用变量的地址作为实参 而引用更容易使用,更清晰 4.在什么时候需要使用“赏引用”? 用常引用。 常引用声明方式: cons t类型标识符&引用名=目标变量名; 例1 nt a const int &ra=a ra=1;//错误 a=1;//正确 例2 string foo(); void bar(string& s) 那么下面的表达式将是非法的 bar(foo() bar("hello world") 原因在于foo()和" hello wrd"串都会产生一个临时对象,而在C++中,这些临时对象都是 cons t类型的。因此上面 的表达式就是 试图将一个 cons t类型的对象转换为非cnst类型,这是非法的。 引用型参数应该在能被定义为 cons t的情况下,尽量定义为 cons t 5.将“引用”作为函数返回值类型的格式、好处和需要遵守的规则? 格式:类型标识符&函数名(形参列表及类型说明){/函数体} 好处:在内存中不产生被返回值的副本;(注意:正是因为这点原因,所以返回一个局部变 量的引用是 不可取的。因为随着该局部变量生存期的结束,相应的引用也会失效,产生 runt ime error l 注意事项 (1)不能返回局部变量的引用。这条可以参照 Effective c++[1]的Item31。主要原因是 局部变量会在函数返回后被销毁,因此被返回的引用就成为了"无所指"的引用,程序会进入 未知状态。 2)不能返回函数内部new分配的内存的引用这条可以参照 Effective c++[1]的Item31. 虽然不存在局部变量的被动销毁闩题,可对于这种情况(返回函数内部ncw分配内存的引 用),又面临其它尴尬局面。例如,被函数返回的引用只是作为一个临变量出现,而没有 被赋予一个实际的变量,那么这个引用所指向的空间(由new分配)就无法释放,造成 memory leak (3)可以返回类成员的引用,但最好是 cons t这条原则可以参照 Effective c++[1]的Iten 30。主要原因是当对象的属性是与某种业务规则( business rule)相关联的时侯,其赋值 常常与某些其它属性或者对象的状态有关,因此有必要将赋值操作封装在-个业务规则当 中。如果其它对象可以获得该属性的非常量引用(或指针),那么对该属性的单纯赋值就会 破坏业务规则的完整性。 4)流操作符重載返回值申明为“引用”的作用:流操作符<<和>>,这两个操作符常常希 望被连续使用,例如:cout<"hell0"<<endl;因此这两个操作符的返回值应该是一个 仍然支持这两个操作符的流引用。可选的其它方案包括:返回一个流对象和返回一个流对象 指针。但是对于返回一个流对象,程序必须重新(拷贝)构造一个新的流对象,也就是说, 连续的两个<操作符实际上是针对不同对象的!这无法让人接受。对于返回一个流指针则不 明了引用的重要性以及无可替代性,也许这就是C+语言中引入引用这个概念的原因吧。赋 值操作符=。这个操作符象流操作符一样,是可以连续使用的,例如:ⅹ=j=10;或者 〔x=10)=100;赋值操作符的返回值必须是一个左值,以便可以被继续赋值。因此引用成了这 个操作符的惟一返回值选择 例3 #i nclu int &put(int n) int vals[10]: int crror=-1: void main o put(0)=10;//以put(0)函数值作为左值,等价于vals[0]=10; put(9)=20;//以put(9)函数值作为左值,等价于vals[9]=20; cout<cout int &put (int n if (n>=0&&n<=9)return vals In else i cout<<"subscript error, return error, (5)在另外的一些操作符中,却千万不能返回引用:+一*/四则运算符。它们不能返回引用, Effcetive c++1]的Itcm23详细的讨论了这个问题。主要原因是这四个操作符没有sidc cffcct,因此,它们必须构造一个对象作为返叵值,可选的方案包括:返回一个对象、返回 个局部变量的引用,返回一个new分配的对象的引用、返回一个静态对象引用。根据前面 提到的引用作为返回值的三个规则,第2、3两个方案都被否决了。静态对象的引用又因为 =(c+d))会永远为true而导致错误。所以可选的只剩下返回一个对象了。 6.“引用”与多态的关系? 引用是除指针外另一个可以产生多态效果的手段。这意味着,一个基类的引用可以指向它的 派生类实例。 例4 Class a; class b: public: Class A..; b b; A& ref = b 7.“引用”与指针的区别是什么? 指针通过某个拦针变量指向一个对象后,对它所指向的变量间接操作。程序中使用指针,程 序的可读性差;而引用本身就是目标交量的别名,对引用的操作就是对目标变量的操作。此 外,就是上面提到的对函数传ref和 pointer的区别 8.什么时候需要“引用” 流操作符<和》>、赋值操作符=的返回值、拷贝杓造函数的参数、赋值操作符=的参数、其它 情况都推荐使用引用 以上2-8参考http://blog.csdn.net/wfwd/archive/2006/05/30/763551.aspx 9.结构与联合有和区别? 1.结构和联合都是由多个不同的数据类型成员组成,但在任何同一时刻,联合中只存放了 一个被选中 的成员(所有成员共用一块地址空问 2.对于联合的不同成员赋值,将会对其它成员重写,原来成员的值就不存在了,而对于结 构的不同成 员赋值是互不影响的。 10.下面关于“联合”的题目的输出? #i nclu un1 on 1nt1: char x[2]: void maino [0」=10; printf("od", a. i 答案:266(低位低地址,高位高地址,内存占用情况是0x010A) ma in 0 union{/*定义一个联合* nt 1 truc t{/*在联合中定义一个结构*/ har first char second numbe numbcr.i=0x4241;/*联合成员赋值*/ printf ("oc%c\n number half. first, mumber. half. second) number.half. first='a’;/*联合中结构成员赋值*/ number. half second=/b printf( "%x\n", number. i) getch o 答案:AB(0x41对应′A',是低位;0x42对应′B′,是高位) 6261( number.i和 number.half共用一块地址空间) 11.已知 strcpy的函数原型:char* strcpy(char* strDest, const char* strSrc)其中 strDest 是目的字符串, strSs是源字符串。不调用C++/C的字符串库函数,请编写函数 strcpy 答案 if strDest = NULL strSrc = NULL return Null 或者用 assert( strDest!=NUL)&8( strSrc!=NUL)/断言,加头文件# include< casser t> if strDest = strSrc) return strides t char *tempptr strDest, while((*strDest++=*strSrc++)!=<0) rcturn tcmpptr i 12.已知 String类定义如 class string String( const char*str=NUL);//通用构造函数 String( const string& another);//拷贝构造函数 String o;/析构函数 String& operator=( const string&rhs);//赋值函数 private char* m_data;//用于保存字符串 尝试写出类的成员函数实现。 答案: String: String(const char *str) if(str==NULL)// strlen在参数为NULL时会抛异常才会有这步判断 m-data new char [11 mdata[0]=′0 eise mdata new char [strlen(str)+11 strcpy(m_data, str String: String(const String &another m-data new char [strlen(another. m -data)+11 strcpy(m_data, other. m_data) String& String:: opcrator =(const String &rhs) if this = &rhs) return this delete[]m-data;//删除原来的数据,新开一块内存 m-data new char strlen (rhs m_data)+1 strcpy(m-data, rhs m_data); return *thi String: String O dclctc [m_data 13.h头文件中的 ifndef/ def ine/ endif的作用? 答:防止该头文件被重复引用 14.# i nclude<>与# i nclude""的区别 答:前者是从 Standard library的路径寻找和引用头文件,而后者是从当前工作路径搜寻 头文件 15.在C++程序中调用被C编译器编译后的函数,为什么要加 extern“C”? 首先,作为 extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该 关键字告诉编译器,其声眀的函数和变量可以在本模垯或其辶模垬中使用。通常,在模块的 头文件中对本模埉提供给其它模块引用的函数和全局变量以关键字∝ Stern声明。例如,如 果模块B欲引用该模坎A中定义的全局变量和函数时只需包含模坎A的头文件即可。这样, 嫫坎B中调用模块A中的函数时,在编译阶段,模玞B虽然找不到该函数,但是并不会报错 它会在连接阶段中从模块A编译生成的目标代码中找到此函数。ε x tern"C"是连接申明 (1 inkage declaration),被 extern"C"修饰的变量和函数是按照C语言方式编泽和连接的, 来看看C+中对类似C的函数是怎样编译的:作为一种面向对象的语言,C++支持函数重载, 而过栏式语言C则不支持。函数被C++编译后在符号库中的名字与C语言的不同。例如,假 没某个函数的原型为 void foo( int x, int y); 该函数被C编译器编译后在符号库中的名字为-foo,而C艹编译晷则会产生像-foo-int-int 之类的名字(不同的编译器可能生成的名字不同,但是都采用了相同的机制,生成的新名字 称为“ mangled name”)。foo-int-int这样的名字包含了函数名、函数参数数量及类型信 息,C艹就是靠这种机制来实现函数重戟的。例如,在C艹中,函数 void foo(intx,inty) 与 void foo(intx, float v)编译生成的符号是不相同的,后者为-foo-int- float。同 样地,C++中的变量除支持局部变量,还支持类成员变量和全局变量。用户所编写程序的 类成员变量可能与全局变量同名,我们以""来区分。而本质上,编译器在进行编译时,与 函数的处理相似,也为类中的变量取了一个独一无二的名字,这个名字与用户程序中同名的 全局变量名字不同 未加 extern"C"声明时的迕接方式,假设在C++中,模块A的头文件如 //模块A头文件 module.h #ifndef module_a_h #define module__h int foo( int x, int y); 在模块B中引用该函数: //模块B实现文件 moduler.cpp #i nclude module, h fo0(2,3); 实际上,在连接阶段,连接器会从模块A生成的目标文仵 modules.obj中寻找-foo-int-int 这样的符号! 加 extern"C"声明后的编译和连援方式 加 extern"C"声明后,模块A的头文件变为: //模块A头文件 module.h #ifndcf module__a_h #define module_a-h extern "C int foo( int x, int y) #endif 在模块B的实现文件中仍然调用fo0(2,3),其结果是 1)模块A编译生成fυo的目标代码时,没有对其名字进行特殊处理,采用孓C语言的方 式 2)连接器在为模块B的目标代码寻找foo(2,3)调用时,寻找的是未经修改的符号名-fo0 如果在模块A中函数声明了foo为 extern"C"类型,而模块B中包含的是 extern int foo( int x, int ,则模块B找不到模块A中的函数;反之亦然。 所以,可以用一句话概括 extern “C”这个声明的真实目的(任何语言中的任何语法特性的诞生都不是随意而为的,来源于 真实世界的需求驱动。我们在思考问题时,不能只停留在这个语言是怎么做的,还要问一问 它为什么要这么做,动机是什么,这样我们可以更深入地理解许多问题):实现C++与C及 其它语言的混合编程。明白了C+中 extern"C"的设立动机,我们下面来具体分析 extern"C 通常的使用技巧 extern"C"的惯用法 (1)在C+中引用C语言中的函数和变量,在包含C语言头文件(假设为 EXample.h)时 需进行下列处理: extern cit #i nclude eXample. h 而在C语言的头文件中,对其外部函数只能指定为 extern类型,C语言中不支持 extern"C 声明,在.c文 件中包含了 extern "C"时会出现编译语法错误 C+引用C函数例子工程中包含的三个文件的源代码如下 /*c语言头文件: EXample.h*/ ifndef c eXample h #dcfinc c eXample_- h #endif /*c语言实现文件: EXample.c*/ #i nclude eXample. h int add( int x, int y) return x v: /c艹实现文件,调用add: cppfile.cpp extern " CI #i nclude eXample. h int main(int argc, char* argv) ad(2,3); return 如果C++调用一个C语言编写的.DLL时,当包抬.DLL的头文件或声明接口函数时,应加 extern C i (2)在C中引用C艹语言中的函数和变量时,C艹+的头文件需添加 extern"C",但是在C 语言中不能直接 引用声明了 extern C"的该头文件,应该仅将C文件中将C++中定义的 extern"C"函数声明为 extern类型。 C引用C++函数例子工程中包含的三个文件的源代码如下: //C+头文件 cppExumple.h #ifndef cpp eXample- h #dcfinc cpp- eXample_h extern c int add( int t y #endif //C++实现文件 cppexample.cpp # i nclude cppexample h int add( int x, int y return x /*C实现文件 cfile.c *这样会编译出错:# i nclude" EXample.h"*/ cxtcrn int add( int x, int y

...展开详情
试读 57P 富士通c++面试题
立即下载 身份认证后 购VIP低至7折
一个资源只可评论一次,评论内容不能少于5个字
vamcc 不错,题目面比较广
2013-12-17
回复
qswsl 还不错把,够用的
2013-12-13
回复
wl860626 虽然我面富士通的时候没用到,不过对后面的面试还是很有用的。
2013-10-28
回复
piaohuajiang 这里的不仅仅是富士通
2013-10-18
回复
dream_soul 资源还是不错的,但是福富再也不是印象中的那个福富了。
2013-06-19
回复
lincs1234dn 面试前可以选择性的看一下
2013-03-10
回复
quickSort 很好很强大,内容很全!! 不过有些答案貌似不对,比如11页最下面的第二题。
2013-01-12
回复
pp627879340 很有用~已经签约~~
2012-12-14
回复
零下一度 恩,虽然我面富士通的时候没用到,不过对后面的面试还是很有用的。
2012-10-15
回复
您会向同学/朋友/同事推荐我们的CSDN下载吗?
谢谢参与!您的真实评价是我们改进的动力~
  • 分享小兵

关注 私信
上传资源赚钱or赚积分
最新推荐
富士通c++面试题 9积分/C币 立即下载
1/57
富士通c++面试题第1页
富士通c++面试题第2页
富士通c++面试题第3页
富士通c++面试题第4页
富士通c++面试题第5页
富士通c++面试题第6页
富士通c++面试题第7页
富士通c++面试题第8页
富士通c++面试题第9页
富士通c++面试题第10页
富士通c++面试题第11页
富士通c++面试题第12页

试读结束, 可继续读6页

9积分/C币 立即下载