面试题2

来源:互联网 发布:侧吸 顶吸 知乎 编辑:程序博客网 时间:2024/06/13 03:14

1:  short i = 0; i = i + 1;这两句有错吗?

short类型长度比int类性短,当short + int 时候默认结果是类型较长的一方也就是int, 所以 i + 1 值是int类型,不能赋值给short类型,也就是说长的类型不能赋值给短的类型,除非强制转型(但这样会产生精度问题)还有,short i = 0;i += 1 这样写是对的,单目运算符+=,-= ...强制转换为长度短的类型。
2:typedef和define有什么区别
(1)用法不同:typedef用来定义一种数据类型的别名,增强程序的可读性。define主要用来定义常量,以及书写复杂使用频繁的宏。
(2)执行时间不同:typedef是编译过程的一部分,有类型检查的功能。define是宏定义,是预编译的部分,其发生在编译之前,只是简单的进行字符串的替换,不进行类型的检查。
(3)作用域不同:typedef有作用域限定。define不受作用域约束,只要是在define声明后的引用都是正确的。
(4)对指针的操作不同:typedef和define定义的指针时有很大的区别。

注意:typedef定义是语句,因为句尾要加上分号。而define不是语句,千万不能在句尾加分号。


3:流操作符重载为什么返回引用
在程序中,流操作符>>和<<经常连续使用。因此这两个操作符的返回值应该是一个仍旧支持这两个操作符的流引用。其他的数据类型都无法做到这一点。
注意:除了在赋值操作符和流操作符之外的其他的一些操作符中,如+、-、*、/等却千万不能返回引用。因为这四个操作符的对象都是右值,因此,它们必须构造一个对象作为返回值。

4:中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展——让标准C支持中断。具体代表事实是,产生了一个新的关键字__interrupt。下面的代码就使用了__interrupt关键字去定义一个中断服务子程序(ISR),请评论以下这段代码。 

__interrupt double compute_area (double radius) 

double area = PI * radius * radius;

 printf(" Area = %f", area); 

return area;}
【答案】
这段中断服务程序主要有以下四个问题:

关键字__interrupt定义的中断处理函数,不能有返回值和函数参数
(1)ISR 不能返回一个值,必须用void。
(2)ISR 不能传递参数,必须用void。
(3)ISR应该是短而高效的,在ISR 中做浮点运算是不明智的。
(4)printf()经常有重入和性能上的问题。


5:介绍一下STL,详细说明STL如何实现vector。 

STL (标准模版库,Standard Template Library)它由容器算法迭代器组成。 从根本上说,STL是一些“容器”的集合,这些“容器”有list,vector,set,map等,STL也是算法和其他一些组件的集合。

STL有以下的一些优点:

 可以方便容易地实现搜索数据或对数据排序等一系列的算法;

 调试程序时更加安全和方便;

 即使是人们用STL在UNIX平台下写的代码你也可以很容易地理解(因为STL是跨平台的)。 

vector实质上就是一个动态数组,会根据数据的增加,动态的增加数组空间。


6:指针和引用有什么分别;如果传引用比传指针安全,为什么?如果我使用常量指针难道不行吗?

 (1) 引用在创建的同时必须初始化,即引用到一个有效的对象;而指针在定义的时候不必初始化,可以在定义后面的任何地方重新赋值.

 (2) 不存在NULL引用,引用必须与合法的存储单元关联;而指针则可以是NULL. 

(3) 引用一旦被初始化为指向一个对象,它就不能被改变为另一个对象的引用;而指针在任何时候都可以改变为指向另一个对象.给引用赋值并不是改变它和原始对象的绑定关系.

 (4) 引用的创建和销毁并不会调用类的拷贝构造函数 

(5) 语言层面,引用的用法和对象一样;在二进制层面,引用一般都是通过指针来实现的,只不过编译器帮我们完成了转换. 

不存在空引用,并且引用一旦被初始化为指向一个对象,它就不能被改变为另一个对象的引用,显得很安全。

 const 指针仍然存在空指针,并且有可能产生野指针. 

总的来说:引用既具有指针的效率,又具有变量使用的方便性和直观性.


7:C++特点是什么,如何实现多态?画出基类和子类在内存中的相互关系。
多态的基础是继承,需要虚函数的支持,简单的多态是很简单的。
子类继承父类大部分的资源,不能继承的有构造函数,析构函数,拷贝构造函数,oper ator=函数,友元函数等等

8:你如何理解MVC。简单举例来说明其应用。

MVC模式是observer 模式的一个特例,典型的有MFC里面的文档视图架构。

MVC只是一种设计模式,不算是框架,一共分为三层:

m层(模型)里放的是与数据库连接以及其他具体操作的php文件;

 v层(视图)里放的是前台页面html,:

c层(控制器)里主要放的是控制前台页面与后台连接数据库文件的相关操作的php文件;

MVC模式由一个入口文件进入到控制器里,然后再由控制器来分配任务跳转到前台页面或是将前台页面提交过来的值交给M层来进行与数据库的操作. 


9:

下面通过一个例子来解析 常量指针 和 指针常量,我们先总结一下 常量指针 和 指针常量 的区别

首先一定要明白哪种定义方式是常量指针,哪种是指针常量,这里可以记住三句话加深记忆:

* (指针)和 const(常量) 谁在前先读谁 ;*象征着地址,const象征着内容;谁在前面谁就不允许改变。

好吧,让我们来看这个例子:

[cpp] view plain copy
  1. int a =3;  
  2. int b = 1;  
  3. int c = 2;  
  4. int const *p1 = &b;//const 在前,定义为常量指针  
  5. int *const p2 = &c;//*在前,定义为指针常量   

常量指针p1:指向的地址可以变,但内容不可以重新赋值,内容的改变只能通过修改地址指向后变换。   

    p1 = &a是正确的,但 *p1 = a是错误的。
指针常量p2:指向的地址不可以重新赋值,但内容可以改变,必须初始化,地址跟随一生。
    p2= &a是错误的,而*p2 = a 是正确的。


10:

char str1[] = "abc"; 

char str2[] = "abc"; 

const char str3[] = "abc"; 

const char str4[] = "abc"; 

const char *str5 = "abc"; 

const char *str6 = "abc";

 char *str7 = "abc"; 

char *str8 = "abc"; 

cout << ( str1 == str2 ) << endl; 

cout << ( str3 == str4 ) << endl; 

cout << ( str5 == str6 ) << endl; 

cout << ( str7 == str8 ) << endl;

 结果是:0 0 1 1 

解答:str1,str2,str3,str4是数组变量,它们有各自的内存空间;而str5,str6,str7,str8是指针,它们指向相同的常量区域。











0 0
原创粉丝点击