常见C/C++笔试题目整理(含答案)3

时间:2022-12-15 14:40:08

网上流传的一份常见C++笔试题目汇总,供各位有找工作需要的同学参考之用。因为原文较长,遂采用连载形式,预计需要连载4期左右,有耐心的同学就请一直跟下去吧,相信一定会有所收获。提前说明一点,题目来在网络,答案仅供参考,如有同学觉得哪道题目有异议,欢迎讨论!本文系第39至第55题。现在的题目和答案是在之前版本之上整理修正而来,已经剔除了一些(例如操作系统等)非编程问题。

常见C/C++笔试题目整理(含答案)3

探秘算法世界,求索数据结构之道;汇集经典问题,畅享编程技法之趣;点拨求职热点,敲开业界名企之门。

更多经典算法问题、C++编程技巧和技术笔面试题目请详阅《算法之美——隐匿在数据结构背后的原理》


【题目39~55】


39. 面向对象的三个基本特征,并简单叙述之?


40. 下面的代码有什么问题?

class A{
public:
A() { p=this; }
~A() { if(p!=NULL) { delete p; p=NULL; } }
A* p;
};

41. 关键字new delete 与malloc free 的联系与区别?

42. 求下面函数的返回值:

int func(x)  {      int countx = 0;      while(x)      {          countx ++;          x = x&(x-1);      }      return countx;  }


43. 如何打印出当前源文件的文件名以及源文件的当前行号?

44. 执行下列代码后,i 是多少?

#define DOUBLE(x) x+x i = 5*DOUBLE(5);


45. 简述多态的作用?


46. 简述struct 和 class 的区别。


47. 如何判断一段程序是由C 编译程序还是由C++编译程序编译的?


48. 简述数组与指针的区别?


49. 试编写函数判断计算机的字节存储顺序是升序(little endian)还是降序(big endian)。


50. There are two int variables: a and b, don’t use “if”, “? :”, “switch”or other judgement statements, find out the biggest one of the two numbers.


51. 下面这种写法对吗?为什么?

int id[sizeof(unsigned long)];


52. 主函数 main 执行完毕后,是否可能会再执行一段代码,给出说明?


53. 写出下列程序的执行结果:

void Func(char str[100])  {      printf("%d\n", sizeof(str));  }  


54. 有哪几种情况只能用intialization list 而不能用assignment?


55. 描述内存分配方式以及它们的区别?



【参考答案】

--------------------------------------------------------------------------

39. 

(1) 封装:将客观事物抽象成类,每个类对自身的数据和方法实行protection(private, protected,public)
(2) 继承:广义的继承有三种实现形式:实现继承(指使用基类的属性和方法而无需额外编码的能力)、可视继承(子窗体使用父窗体的外观和实现代码)、接口继承 (仅使用属性和方法,实现滞后到子类实现)。前两种(类继承)和后一种(对象组合=>接口继承以及纯虚函数)构成了功能复用的两种方式。
(3) 多态:是将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。


--------------------------------------------------------------------------

40. 会引起无限递归


--------------------------------------------------------------------------

41. 都是在堆(heap)上进行动态的内存操作。用malloc函数需要指定内存分配的字节数并且不能初始化对象,new 会自动调用对象的构造函数。delete 会调用对象的destructor,而free 不会调用对象的destructor。


--------------------------------------------------------------------------

42. 假定x = 9999。 答案:8。思路:将x转化为2进制,看含有的1的个数。


--------------------------------------------------------------------------

43. 

cout << __FILE__ ;cout<<__LINE__ ;
__FILE__和__LINE__是系统预定义宏,这种宏并不是在某个文件中定义的,而是由编译器定义的。

--------------------------------------------------------------------------

44. i 为30。


--------------------------------------------------------------------------

45. 多态的作用主要是两个:(1)隐藏实现细节,使得代码能够模块化;扩展代码模块,实现代码重用;(2)接口重用:为了类在继承和派生的时候,保证使用家族中任一类的实例的某一属性时的正确调用。


--------------------------------------------------------------------------

46. struct 的成员默认是公有的,而类的成员默认是私有的。struct 和 class 在其他方面是功能相当的。 
大多数的开发者感到类和结构有很大的差别。感觉上结构仅仅像一堆缺乏封装和功能的开放的内存位,而类就象活的并且可靠的社会成员,它有智能服务,有牢固的封装屏障和一个良好定义的接口。既然大多数人都这么认为,那么只有在你的类有很少的方法并且有公有数据(这种事情在良好设计的系统中是存在的!)时,你也许应该使用 struct 关键字,否则,你应该使用 class 关键字。 


--------------------------------------------------------------------------

47. 

#ifdef __cpluspluscout<<"c++";#elsecout<<"c";#endif

--------------------------------------------------------------------------

48. 首先,数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。指针可以随时指向任意类型的内存块。其次,修改内容上的差别,如下:

char a[] = “hello”;a[0] = ‘X’;char *p = “world”; // 注意p 指向常量字符串p[0] = ‘X’; // 编译器不能发现该错误,运行时错误
再次,用运算符sizeof 可以计算出数组的容量(字节数)。sizeof(p),p 为指针得到的是一个指针变量的字节数,而不是p 所指的内存容量。C++/C 语言没有办法知道指针所指的内存容量,除非在申请内存时记住它。注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。例如,
char a[] = "hello world";char *p = a;cout<< sizeof(a) << endl; // 12 字节cout<< sizeof(p) << endl; // 4 字节//计算数组和指针的内存容量void Func(char a[100]){    cout<< sizeof(a) << endl; // 4 字节而不是100 字节}

--------------------------------------------------------------------------

49. 

bool IsBigendian()  {      unsigned short usData = 0x1122;      unsigned char *pucData = (unsigned char*)&usData;      return (*pucData == 0x22);  }  

--------------------------------------------------------------------------

50. 

((a + b) + abs(a - b)) / 2

--------------------------------------------------------------------------

51. 对。sizeof是编译时运算符,编译时就确定了,可以看成和机器有关的常量。


--------------------------------------------------------------------------

52. 可以用_onexit 注册一个函数,它会在main 之后执行。例如,

void main(){String str("Goodbye!");_onexit( fn1 );_onexit( fn2 );_onexit( fn3 );_onexit( fn4 );printf( "This is executed first./n" );}int fn1(){printf( "next./n" );return 0;}int fn2(){printf( "executed " );return 0;}int fn3(){printf( "is " );return 0;}int fn4(){printf( "This " );return 0;}
The _onexit function is passed the address of a function to be called when the program terminates normally. Successive calls to _onexit create a register of functions that are executed in LIFO (last-in-first-out) order. The functions passed to _onexit cannot take parameters.

--------------------------------------------------------------------------

53. 4,不同的系统(32位或64位)会略有不同。注意这里sizeof得到的是“指针长度”。


--------------------------------------------------------------------------

54. 当类中含有const、reference 成员变量;基类的构造函数都需要初始化表。


--------------------------------------------------------------------------

55. 

(1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static 变量。
(2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集。
(3) 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc 或new 申请任意多少的内存,程序员自己负责在何时用free 或delete 释放内存。动态内存的生存期由程序员决定,使用非常灵活,但问题也最多。



未完,待续...

VIEWER DISCRETION IS ADVISED!!