笔试面试1.docx
- 文档编号:3237703
- 上传时间:2022-11-20
- 格式:DOCX
- 页数:7
- 大小:19.08KB
笔试面试1.docx
《笔试面试1.docx》由会员分享,可在线阅读,更多相关《笔试面试1.docx(7页珍藏版)》请在冰豆网上搜索。
笔试面试1
笔试面试 --- C C++基本语法
(一)
1. 用变量a给出下面的定义
i. 一个有10个指针的数组,该指针是指向一个整型数的(Anarrayof10pointerstointegers)
ii. 一个指向有10个整型数数组的指针(Apointertoanarrayof10integers)
iii. 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(Apointertoafunctionthattakesanintegerasanargumentandreturnsaninteger)
iv. 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数(Anarrayoftenpointerstofunctionsthattakeanintegerargumentandreturnaninteger)
答案:
一、int*a[10];//Anarrayof10pointerstointegers
二、int(*a)[10];//Apointertoanarrayof10integers
三、int(*a)(int);//Apointertoafunctionathattakesanintegerargumentandreturnsaninteger
四、int(*a[10])(int);//Anarrayof10pointerstofunctionsthattakeanintegerargumentandreturnaninteger
2. 关键字static的作用是什么?
在C语言中,关键字static有三个明显的作用:
● 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
● 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。
它是一个本地的全局变量。
● 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。
那就是,这个函数被限制在声明它的模块的本地范围内使用。
3. 下面的声明都是什么意思?
constinta;
intconsta;
constint*a;
int*consta;
intconst*aconst;
前两个的作用是一样,a是一个常整型数。
第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。
第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。
最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。
4. 下列哪两个是等同的
intb;
Aconstint*a=&b;
Bconst*inta=&b;
Cconstint*consta=&b;
Dintconst*consta=&b;
答:
C、D相等,数据类型放在const前后是一样的。
5. 那么我为什么还要如此看重关键字const呢?
● 关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉用户这个参数的应用目的。
如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息。
(当然,懂得用const的程序员很少会留下的垃圾让别人来清理的。
)
● 通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。
● 合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。
简而言之,这样可以减少bug的出现。
6. 什么是回调函数?
简而言之,回调函数就是被调用者回头调用调用者的函数。
使用回调函数实际上就是在调用某个函数(通常是API函数)时,将自己的一个函数(这个函数为回调函数)的地址作为参数传递给那个被调用函数。
而该被调用函数在需要的时候,利用传递的地址调用回调函数。
回调函数,就是由你自己写的,你需要调用另外一个函数,而这个函数的其中一个参数,就是你的这个回调函数名。
这样,系统在必要的时候,就会调用你写的回调函数,这样你就可以在回调函数里完成你要做的事。
回调主要是在异步处理时使用,在主线程注册回调函数,然后在子线程真正执行回调函数,单线程意义不是很大。
7. 如何定义和实现一个类的成员函数为回调函数?
a. 声明;
b. 定义;
c. 设置触发条件,就是在你的函数中把你的回调函数名作为一个参数,以便系统调用
一、声明回调函数类型
typedefvoid(*FunPtr)(void);
二、定义回调函数
classA
{
public:
A();
staticvoidcallBackFun(void) //回调函数,必须声明为static
{
cout<<"callBackFun"< } virtual~A(); }; 三、设置触发条件 voidFuntype(FunPtrp) { p(); } voidmain(void) { Funtype(A: : callBackFun); } 8. 回调函数与API函数 回调和API非常接近,他们的共性都是跨层调用的函数。 但区别是API是低层提供给高层的调用,一般这个函数对高层都是已知的;而回调正好相反,他是高层提供给底层的调用,对于低层他是未知的,必须由高层进行安装,这个安装函数其实就是一个低层提供的API,安装后低层不知道这个回调的名字,但它通过一个函数指针来保存这个回调函数,在需要调用时,只需引用这个函数指针和相关的参数指针。 其实: 回调就是该函数写在高层,低层通过一个函数指针保存这个函数,在某个事件的触发下,低层通过该函数指针调用高层那个函数。 9. 论述含参数的宏与函数的优缺点 ● 宏: 优点: 在预处理阶段完成,不占用编译时间,同时,省去了函数调用的开销,运行效率高 缺点: 不进行类型检查,多次宏替换会导致代码体积变大,而且由于宏本质上是字符串替换,故可能会由于一些参数的副作用导致得出错误的结果。 ● 函数: 优点: 没有带参数宏可能导致的副作用,进行类型检查,计算的正确性更有保证。 缺点: 函数调用需要参数、返回地址等的入栈、出栈开销,效率没有带参数宏高 PS: 宏与内联函数的区别 内联函数和宏都是在程序出现的地方展开,内联函数不是通过函数调用实现的,是在调用该函数的程序处将它展开(在编译期间完成的);宏同样是; 不同的是: 内联函数可以在编译期间完成诸如类型检测,语句是否正确等编译功能;宏就不具有这样的功能,而且宏展开的时间和内联函数也是不同的(在运行期间展开) 10. 关键字volatile有什么含意? 一个参数既可以是const还可以是volatile吗? 解释为什么。 一个指针可以是volatile吗? 解释为什么。 下面的函数有什么错误? intsquare(volatileint*ptr) { return*ptr**ptr; } 一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。 精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。 下面是volatile变量的几个例子: Ø 1).并行设备的硬件寄存器(如: 状态寄存器) Ø 2).一个中断服务子程序中会访问到的非自动变量(Non-automaticvariables) Ø 3).多线程应用中被几个任务共享的变量 1).是的。 一个例子是只读的状态寄存器。 它是volatile因为它可能被意想不到地改变。 它是const因为程序不应该试图去修改它。 2).是的。 尽管这并不很常见。 一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。 3).这段代码的有个恶作剧。 这段代码的目的是用来返指针*ptr指向值的平方,但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码: intsquare(volatileint*ptr) { inta,b; a=*ptr; b=*ptr; returna*b; } 由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。 结果,这段代码可能返不是你所期望的平方值! 正确的代码如下: longsquare(volatileint*ptr) { inta; a=*ptr; returna*a; } 11. Typedef在C语言中频繁用以声明一个已经存在的数据类型的同义字。 也可以用预处理器做类似的事。 例如,思考一下下面的例子: #definedPSstructs* typedefstructs*tPS; 以上两种情况的意图都是要定义dPS和tPS作为一个指向结构s指针。 哪种方法更好呢? 为什么? 答案: typedef更好。 举例: dPSp1,p2; tPSp3,p4; 第一个扩展为 structs*p1,p2; 上面的代码定义p1为一个指向结构的指,p2为一个实际的结构,这也许不是你想要的。 第二个例子正确地定义了p3和p4两个指针。 12.非C++内建型别A和B,在哪几种情况下B能隐式转化为A? [C++中等] 答: Ø classB: publicA{……}//B公有继承自A,可以是间接继承的 Ø classB{operatorA();}//B实现了隐式转化为A的转化 Ø classA{A(constB&);}//A实现了non-explicit的参数为B(可以有其他带默认值的参数)构造函数 Ø A&operator=(constA&);//赋值操作,虽不是正宗的隐式类型转换,但也可以勉强算一个 13. 十三、以下代码中的两个sizeof用法有问题吗? voidUpperCase(charstr[])//将str中的小写字母转换成大写字母 { for(size_ti=0;i if('a'<=str[i]&&str[i]<='z') str[i]-=('a'-'A'); } 答案: 有问题,sizeof取到的是指针大小(因为是址传递),第一个sizeof(str)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 笔试 面试
![提示](https://static.bdocx.com/images/bang_tan.gif)