经典C++笔试题目--100(数据类型、关键字(19-37))


数据类型、关键字(19-37)


19、C++是不是类型安全的?

  【参考答案】不是。两个不同类型的指针之间可以强制转换(用reinterpret cast)。


20、 const 符号常量;

(1)const char *p
(2)char const *p
(3)char * const p
说明上面三种描述的区别;
  【参考答案】
(1)p是一个指向const char的指针,p是可以改变指向的,但是p指向的值是不能改变的;      
        (2)p指向的恰好是一个指向const的char的普通指针;
(3)p是一个指针,这个指针是指向char的const指针。      
       (1)和(2)的定义是一样的。


21、用C++写个程序,如何判断一个操作系统是16位还是32位的?

 【标准答案】
定义一个指针p,打印出sizeof(p),如果节后是4,则表示该操作系统是32位,打印结果是2,表示是16位。


22、 .用C++写个程序,如何判断一个操作系统是16位还是32位的?不能用sizeof()函数。

【参考答案】    
int a = ~0;
if(a > 65536) {
	cout<<"32 bit"<<endl;
} else {
	cout<<"16 bit"<<endl;
}


23、识别函数或指针

void * ( * (*fp1)(int))[10];  
float (*(* fp2)(int,int,int))(int);
int (* ( * fp3)())[10]();
分别表示什么意思?
【标准答案】                                                           
1.void * ( * (*fp1)(int))[10];  fp1是一个指针,指向一个函数,这个函数的参数为int型,函数的返回值是一个指针,这个指针指向一个数组,
这个数组有10个元素,每个元素 是一个void*型指针。
2.float (*(* fp2)(int,int,int))(int);  fp2是一个指针,指向一个函数,这个函数的参数为3个int型,函数的返回值是一个指针,这个指针指向一个函数,
这个函数的参数为int型, 函数的返回值是float型。
 3.int (* ( * fp3)())[10]();  fp3是一个指针,指向一个函数,这个函数的参数为空,函数的返回值是一个指针,这个指针指向一个数组,
这个数组有10个元素,每个元素是一个指针,指向一个函数,这个函数的参数为空,函数的返回值是int型。                                                   


24、多态类中的虚函数表是Compile-Time,还是Run-Time时建立的?

【标准答案】
虚拟函数表是在编译期就建立了,各个虚拟函数这时被组织成了一个虚拟函数的入口地址的数组.而对象的隐藏成员--虚拟函数表指针是
在运行期--也就是构造函数被调用时进行初始化的,这是实现多态的关键。


25、错误的转义字符是 ()

A.'\091' B.'\\'
C.'\0' D.'\''
【标准答案】A


26、若数组名作实参而指针变量作形参,函数调用实参传给形参的是 ()

A.数组的长度 B.数组第一个元素的值
C.数组所有元素的值 D.数组第一个元素的地址
【标准答案】D


27、变量的指针含意是指变量的 ()

A.值   B.地址 C.存储   D.名字
  【标准答案】B


28、内存的分配方式有几种?

【参考答案】
一、从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量。
二、在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效 率很高,但是分配的内存容量有限。
三、从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们 决定,使用非常灵活,但问题也最多。


29、float a,b,c ,问等式 (a+b)+c==(b+a)+c 和(a+b)+c==(a+c)+b能否成立?

【参考答案】
两者都不行。在比较float或double时,不能简单地比较。由于计算误差,相等的概率很低。应判断两数之差是否落在区间(-e,e)内。
这个e应比浮点数的精度大一个数量级。


30、全局变量和局部变量有什么区别?是怎么实现的?操作系统和编译器是怎么知道的? 

 【参考答案】
生命周期不同:
全局变量随主程序创建和创建,随主程序销毁而销毁;
局部变量在局部函数内部,甚至局部循环体等内部存在,退出就不存在; 内存中分配在全局数据 区。 
使用方式不同:
通过声明后全局变量程序的各个部分都可以用到;局部变量只能在局部使用;分配在栈区。
操作系统和编译器通过内存分配的位置来知道的,全局变量分配在全局数据段并且在程序开始运行的时候被加载。局部变量则分配在堆栈里面 。


31、Heap与stack的差别

 【参考答案】
Heap是堆,stack是栈。 Stack的空间由操作系统自动分配/释放,Heap上的空间手动分配/释放。
Stack空间有限,Heap是很大的自由存储区 C中的malloc函数分配的内存空间即在堆上,C++中对应的是new操作符。
程序在编译期对变量和函数分配内存都在栈上进行,且程序运行过程中函数调用时参数的传递也在栈上进行


32、In C++, what does "explicit" mean? what does "protected" mean? 

【标准答案】
c++中的explicit关键字用来修饰类的构造函数,表明该构造函数是显式的,在某些情况下,我们要求类的使用者必须显示调用类的构造函数时就需要使用explicit,反之默认 类型转换可能会造成无法预期的问题。
protected控制的是一个函数对一个类的成员(包括成员变量及成员方法)的访问权限。protected成员只有该类的成员函数及其派生类的成员函数可以访问。


33、重复多次fclose一个打开过一次的FILE *fp指针会有什么结果,并请解释。 

【参考答案】
考察点:导致文件描述符结构中指针指向的内存被重复释放,进而导致一些不可预期的异常。


34、为什么数组名作为参数,会改变数组的内容,而其它类型如int却不会改变变量的值?

【参考答案】
当数组名作为参数时,传递的实际上是地址。
而其他类型如int作为参数时,由于函数参数值实质上是实参的一份拷贝,被调函数内部对形参的改变并不影响实参的值。


35、你觉得如果不使用常量,直接在程序中填写数字或字符串,将会有什么麻烦? 

【参考答案】
(1)  程序的可读性(可理解性)变差。程序员自己会忘记那些数字或字符串是什么意思,用户则更加不知它们从何处来、表示什么。 
(2)  在程序的很多地方输入同样的数字或字符串,难保不发生书写错误。 
(3)  如果要修改数字或字符串,则会在很多地方改动,既麻烦又容易出错。


36、为什么需要使用堆,使用堆空间的原因?

【参考答案】
直到运行时才知道一个对象需要多少内存空间;不知道对象的生存期到底有多长。


37、 const关键字?有哪些作用

【参考答案】
const关键字至少有下列n个作用:
(1)欲阻止一个变量被改变,可以使用const关键字。在定义该const变量时,通常需要对它进行初始化,因为以后就没有机会再去改变它了;
(2)对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const;
(3)在一个函数声明中,const可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值;
(4)对于类的成员函数,若指定其为const类型,则表明其是一个常函数,不能修改类的成员变量;
(5)对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”。
注: 这个题可以考查面试者对程序设计知识的掌握程度是初级、中级还是比较深入,没有一定的知识广度和深度,不可能对这个问题给出全面的解答。大多数人只能回答出 static和const关键字的部分功能。







  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值