Q:C++源文件从文本到可执行文件经历的过程
A:对于C++源文件,从文本到可执行文件一般需要四个过程:
预编译阶段:对源代码文件中文件包含关系(头文件)、预编译语句(宏定义)进行分析和替换,生成预编译文件
编译阶段:将经过预处理后的预编译文件转换成特定汇编代码,生成汇编文件
汇编阶段:将编译阶段生成的汇编文件转化成机器码,生成可重定位目标文件
链接阶段:将多个目标文件及所需要的库链接成最终的可执行目标文件
Q:在头文件中进行类的声明,在对应的实现文件中进行类的定义有什么意义?
A:这样可以提高编译效率,因为分开的话,这个类只需要编译一次生成对应的目标文件,以后在其他地方用到这个类时,编译器查找到了头文件和目标文件,就不会再次编译这个类,从而大大提高了效率。
Q:静态链接与动态链接
A:静态链接是在编译期间完成的。
静态链接浪费空间 ,这是由于多进程情况下,每个进程都要保存静态链接函数的副本。
更新困难 ,当链接的众多目标文件中有一个改变后,整个程序都要重新链接才能使用新的版本。
静态链接运行效率高。
动态链接的进行则是在程序执行时链接。动态链接当系统多次使用同一个目标文件时,只需要加载一次即可,节省内存空间。
程序升级变得容易,当升级某个共享模块时,只需要简单的将旧目标文件替换掉,程序下次运行时,新版目标文件会被自动装载到内存并链接起来,即完成升级。
Q:C++11有哪些新特性
A:
auto关键字:编译器可以根据初始值自动推导出类型,但是不能用于函数传参以及数组类型的推导;
nullptr关键字:nullptr是一种特殊类型的字面值,它可以被转换成任意其它的指针类型;而NULL一般被宏定义为0,在遇到重载时可能会出现问题。
智能指针:C++11新增了std::shared_ptr、std::weak_ptr等类型的智能指针,用于解决内存管理的问题。
初始化列表:使用初始化列表来对类进行初始化
右值引用:基于右值引用可以实现移动语义和完美转发,消除两个对象交互时不必要的对象拷贝,节省运算存储资源,提高效率
atomic原子操作用于多线程资源互斥操作
新增STL容器array以及tuple
Q:assert()是什么
A:断言是宏,而非函数。assert 宏的原型定义在 <assert.h>(C)、<cassert>(C++)中,其作用是如果它的条件返回错误,则终止程序执行。可以通过定义 NDEBUG 来关闭 assert,但是需要在源代码的开头,include <assert.h> 之前。
#define NDEBUG // 加上这行,则 assert 不可用 #include <assert.h> assert( p != NULL ); // assert 不可用
Q:C++是不是类型安全的?
A:不是,因为两个不同类型的指针之间可以强制转换(用reinterpret cast)。
Q:系统会自动打开和关闭的3个标准的文件是?
A:
- 标准输入----键盘---stdin
- 标准输出----显示器---stdout
- 标准出错输出----显示器---stder