1、第一部分:简答题1. 一下 C+中 static_cast 和 dynamic_cast 的区别。答:static_cast 用于有比较明确定义的变换,包括不需要强制转换的变换。dynamic_cast 适用于类型安全的向下转换,常用在继承中的父类指针向子类指针的转换。若转换成功则返回改类型的指针,若失败,则返回 NULL。1. Struct 和 class 的区别。答:struct 是一种结构体类型的标志,它和 C+中的 Class 很相似。C+中两者的唯一区别在于:Class 定义中默认情况下的成员都是私有的,而结构 Struct 定义中默认情况下的成员都是公有的。在 C 中,结构中不能有
2、成员函数,而在 C+中可以有成员函数.1. 是不是一个父类写了一个 virtual 函数,如果子类覆盖它的函数不加virtual ,也能实现多态 ?答:virtual 修饰符会被隐形继承的。private 也被继承,只是派生类没有访问权限而已。virtual 可加可不加。子类的空间里有父类的所有变量(static 除外)。同一个函数只存在一个实体(inline 除外)。子类覆盖它的函数不加 virtual ,也能实现多态。在子类的空间里,有父类的私有变量。私有变量不能直接访问。1. C 和 C+有什么不同?(从机制,适用领域等方面说说)答:从机制上:C 是面向过程的(但 c 也可以编写面向对象
3、的程序); C+是面向对象的,提供了类。但是,C+编写面向对象的程序比 C 容易从适用的方向:C 适合要求代码体积小的,效率高的场合,如嵌入式;C+适合更上层的,复杂的; llinux 核心大部分是 C 写的,因为它是系统软件,效率要求极高。从名称上也可以看出,C+比 C 多了+,说明 C+是 c 的超集;那为什么不叫C+而叫 C+呢,是因为 C+比 C 来说扩充的东西太多了,所以就在 C 后面放上两个+;于是就成了 c+C 语言是结构化编程语言,C+是面向对象编程语言。C+侧重于对象而不是过程,侧重于类的设计而不是逻辑的设计。1. 请说出 const 与#define 相比,有何优点?答:1
4、) const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。2) 有些集成化的调试工具可以对 const 常量进行调试,但是不能对宏常量进行调试。1. 简述数组与指针的区别?答:数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。指针可以随时指向任意类型的内存块。(1)修改内容上的差别char a = “hello”;a0 = X;char *p = “world”; / 注意 p 指向常量字符串p0 = X; / 编译器不能发现该错误,运行时错误(2) 用运算符 sizeof
5、 可以计算出数组的容量(字节数)。sizeof(p),p 为指针得到的是一个指针变量的字节数,而不是 p 所指的内存容量。C+/C 语言没有办法知道指针所指的内存容量,除非在申请内存时记住它。注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。char a = “hello world”;char *p = a;cout接口继承以及纯虚函数)构成了功能复用的两种方式。3. 多态:是将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。9. 请简单描述
6、 Windows 内存管理的方法。答:内存管理是操作系统中的重要部分,两三句话恐怕谁也说不清楚吧我先说个大概,希望能够抛砖引玉吧当程序运行时需要从内存中读出这段程序的代码。代码的位置必须在物理内存中才能被运行,由于现在的操作系统中有非常多的程序运行着,内存中不能够完全放下,所以引出了虚拟内存的概念。把哪些不常用的程序片断就放入虚拟内存,当需要用到它的时候在 load 入主存(物理内存)中。这个就是内存管理所要做的事。内存管理还有另外一件事需要做:计算程序片段在主存中的物理位置,以便 CPU 调度。内存管理有块式管理,页式管理,段式和段页式管理。现在常用段页式管理块式管理:把主存分为一大块、一大
7、块的,当所需的程序片断不在主存时就分配一块主存空间,把程 序片断 load 入主存,就算所需的程序片度只有几个字节也只能把这一块分配给它。这样会造成很大的浪费,平均浪费了 50的内存空间,但时易于管理。页式管理:把主存分为一页一页的,每一页的空间要比一块一块的空间小很多,显然这种方法的空间利用率要比块式管理高很多。段式管理:把主存分为一段一段的,每一段的空间又要比一页一页的空间小很多,这种方法在空间利用率上又比页式管理高很多,但是也有另外一个缺点。一个程序片断可能会被分为几十段,这样很多时间就会被浪费在计算每一段的物理地址上(计算机最耗时间的大家都知道是 I/O 吧)。段页式管理:结合了段式管
8、理和页式管理的优点。把主存分为若干页,每一页又分为若干段。好处就很明显,不用我多说了吧。各种内存管理都有它自己的方法来计算出程序片断在主存中的物理地址,其实都很相似。这只是一个大概而已,不足以说明内存管理的皮毛。无论哪一本操作系统书上都有详细的讲解10.main 主函数执行完毕后,是否可能会再执行一段代码,给出说明?答:可以,可以用_onexit 注册一个函数,它会在 main 之后执行 int fn1(void),fn2(void), fn3(void), fn4 (void);void main( void )String str(“zhanglin”);_onexit( fn1 );_o
9、nexit( 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;Csdn 文档摘要:The _onexit function is passed the address of a function (func)
10、 to becalled 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.11.const 符号常量;(1)const char *p(2)char const *p(3)char * const p说明上面三种描述的区别.答:如果 co
11、nst 位于星号的左侧,则 const 就是用来修饰指针所指向的变量,即指针指向为常量;如果 const 位于星号的右侧,const 就是修饰指针本身,即指针本身是常量。(1)const char *p一个指向 char 类型的 const 对象指针,p 不是常量,我们可以修改 p 的值,使其指向不同的 char,但是不能改变它指向非 char 对象,如:const char *p;char c1=a;char c2=b;p=/okp=/ok*p=c1;/error(3)char * const p此时*p 可以修改,而 p 不能修改。(4)const char * const p这种是地址及
12、指向对象都不能修改。12.下面是 C 语言中两种 if 语句判断方式。请问哪种写法更好?为什么?答:int n;if (n = 10) / 第一种判断方式if (10 = n) / 第二种判断方式如果少了个=号,编译时就会报错,减少了出错的可能行,可以检测出是否少了=13. *p+ 自增 p 还是 p 所指向的变量?答:后缀+ 和 操作符本质上比前缀一目操作的优先级高, 因此*p+ 和*(p+) 等价,它自增 p 并返回 p 自增之前所指向的值。要自增 p 指向的值, 使用(*p)+, 如果副作用的顺序无关紧要也可以使用 +*p。14. #pragma 是什么, 有什么用?答:#pragam
13、指令提供了一种单一的明确定义的 “救生舱”, 可以用作各种 (不可移植的) 实现相关的控制和扩展:源码表控制、结构压缩、警告去除 (就像 lint 的老 /* NOTREACHED */注释),等等。15.“#pragma once” 是什么意思?我在一些头文件中看到了它。答:这是某些预处理器实现的扩展用于使头文件自我识别; 它跟#ifndef 技巧等价, 不过移植性差些。16. 进程间通信的方式有?答:进程间通信的方式有 共享内存, 管道 ,Socket ,消息队列 , DDE 等17. 如何打印出当前源文件的文件名以及源文件的当前行号?答:cout _FILE_ ;cout_LINE_ ;
14、_FILE_和_LINE_是系统预定义宏,这种宏并不是在某个文件中定义的,而是由编译器定义的。18. 如何判断一段程序是由 C 编译程序还是由 C+编译程序编译的?答:#ifdef _cpluspluscout”c+”;#elsecout”c”;#endif19. New delete 与 malloc free 的联系与区别?答:都是在堆(heap) 上进行动态的内存操作。用 malloc 函数需要指定内存分配的字节数并且不能初始化对象,new 会自动调用对象的构造函数。delete 会调用对象的 destructor,而 free 不会调用对象的 destructor.20.介绍一下 ST
15、L,详细说明 STL 如何实现 vector。答:STL (标准模版库,Standard Template Library)它由容器算法迭代器组成。STL 有以下的一些优点:可以方便容易地实现搜索数据或对数据排序等一系列的算法;调试程序时更加安全和方便;即使是人们用 STL 在 UNIX 平台下写的代码你也可以很容易地理解(因为 STL 是跨平台的)。vector 实质上就是一个动态数组,会根据数据的增加,动态的增加数组空间。21. 指针和引用有什么分别;如果传引用比传指针安全,为什么?如果我使用常量指针难道不行吗?答:(1) 引用在创建的同时必须初始化,即引用到一个有效的对象;而指针在定义的
16、时候不必初始化,可以在定义后面的任何地方重新赋值(2) 不存在引用,引用必须与合法的存储单元关联;而指针则可以是 NULL.(3) 引用一旦被初始化为指向一个对象,它就不能被改变为另一个对象的引用;而指针在任何时候都可以改变为指向另一个对象给引用赋值并不是改变它和原始对象的绑定关系(4) 引用的创建和销毁并不会调用类的拷贝构造函数(5) 语言层面,引用的用法和对象一样;在二进制层面,引用一般都是通过指针来实现的,只不过编译器帮我们完成了转换.不存在空引用,并且引用一旦被初始化为指向一个对象,它就不能被改变为另一个对象的引用,显得很安全。const 指针仍然存在空指针,并且有可能产生野指针.总的来说:引用既具有指针的效率,又具有变量使用的方便性和直观性22. 构造函数可否是虚汗数,为什么?析构函数呢,可否是纯虚的呢?答: