Bootstrap

C++面试题(二)

1. C语言中的static有什么作用?

 1)隐藏,当我们同事编译多个文件时,所有未夹static前缀的全局变量和函数都具有全局可见性,故使用static在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。
 2)static的第二个作用是保持变量的持久。存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量。
 3)static的第三个作用是默认初始化为0。其实全局变量也具备这一属性,因为全局变量也是存储在静态数据区。在静态数据区,内存中所有的字节默认值都为0x00,某些时候这一特点可以减少程序员的工作量。

2. C++ const 有什么用?

 const修饰的内容是不可修改的,定义常量只是一种使用方式而已,还有const数据成员、const参数、const返回值、const成员函数等,被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。

3. C与C++各自如何定义常量?有什么?

 C语言,宏#define定义常量。
 C++语言,建议使用const来定义使用常量。
 区别:1)const是有数据类型的常量,而宏常量是没有的;编译器可以对前者进行静态类型安全检查,对后者仅是字符替换,没有类型安全检测;而且在字符替换时可能会产生意料不到的错误(即边际效应);2)有些编译器可以对const常量进行调试,不能对宏进行调试。

4. 既然C++中有更好的const为什么还要使用宏?

 const无法代替宏作为卫哨来防止文件的重复包含。

5. C++中引用和指针的区别?

  引用,是对象的别名,操作引用就是在操作这个对象,必须在创建的同时有效的 初始化(引用一个有效的对象,不可为null);初始化完毕后,就再也不能被改变,它具有指针的效率,又具有变量使用的方便性和直观性,在语言层面上引用和对象的用法一样,在二进制层面上引用一般都是通过指针来实现的,只是编译器帮我们完成了转换。之所以使用引用是为了用适当的工具做恰如其分的事,体现了最小特权原则。

6. new/delete与malloc()/free()的区别?

 new/delete,是C++的运算符,用于申请/释放内存。
 malloc()/free(),是C语言的标准库函数,用于申请/释放内存;它们不在编译器控制权限之内,不能把构造函数和析构函数的任务强加给它们。

7. #include < a.h >与#include "a.h"有什么区别?

 #include < a.h >,是指编译器从标准库路径开始搜索;#include “a.h”,是指编译器从用户的工作路径开始搜索,若未找到,则从标准库路径开始搜索。

8. 在C++程序中调用C编译器编译后的函数,为什么要加extern “C”?

 C++语言是支持函数重载,C语言不支持函数重载。函数被C++编译后在库中的名字与C语言的不同。假设某个函数的原型为:void foo(int x, int y);该函数被C编译器编译后在库中的名字为_foo,而C++编译器编译后则会产生像_foo_int_int之类的名字。C++提供了C连接交换指定符号extern ”C“来解决名字匹配问题。

9. 什么是动态特性?

 在绝大多数的情况下,程序的功能是在编译的时候就确定的,我们称之为静态特性。反之,如果程序的功能是在运行时刻才能确定下来的,则称之为动态特性。C++中,虚函数、抽象基类、动态绑定和多态构成了出色的动态特性。

10. 什么是封装?C++中是如何实现的?

 封装,它来源于信息隐藏的概念设计,是通过特性和行为的组合来创建新数据类型让借口哦与具体实现相隔离。C++中是通过类来实现的,为了尽量避免某个模块的行为干扰同一系统中的其它模块,应该让模块仅仅公开必须让外界知道的接口。

11. 什么是RTTI?

 RTTI(Run-time type identification),是指运行时识别类型,在只有一个指向基类的指针或引用时确定一个对象的准确类型。

12. 什么是拷贝构造函数?

 拷贝构造函数,它是构造函数的一种,它有一个函数参数,并且该参数的类型和它属于同一类的对象的引用或者只读;类定义中,如果未提供自己的拷贝构造函数,C++提供一个默认拷贝构造函数,该默认拷贝构造函数完成一个成员到一个成员的拷贝。

13. 什么是深浅拷贝?

 浅拷贝,是指创建了一个对象用一个现成的对象初始化它的时候只是赋值了成员(简单赋值)而没有拷贝分配给成员的资源(如给其指针变量成员分配了动态内存)。
 深拷贝,是指创建一个对象是,如果分配了资源,就需要定义自己的拷贝构造函数,使之不但能高倍成员也能拷贝分配给它们的资源。

14. 面向对象程序设计的优点?

 开发时间短、效率高、可靠性高。面向对象编程的编码具有高可重用性,可以在应用程序中大量采用成熟的类库(如STL),从而缩短了开发时间,软件易于维护和升级。

C++面试题(一)

;