【面试】c++编译过程//指针和引用的区别//‘malloc / free’ 和 ‘new / delete’的区别//关键字static的作用//const关键字的作用

C++面试常见问题

      • c++编译过程
      • 指针和引用的区别
      • c++中 ‘malloc / free’ 和 ‘new / delete’的区别
      • 关键字static的作用
      • const关键字的作用


c++编译过程


  1. c++编译过程

    预处理->编译->汇编->链接    四个步骤
    

    (1). 预处理:

    读取c++源程序,对其中的伪指令进行处理。
    其中包括:
    展开所有的宏定义;
    处理所有的条件编译指令,如“#if”,"#ifdef"等等;
    将“#include”指令包含的文件插入到该指令的位置处;
    删除所有的注释。

    (2). 编译:

    对预处理后的程序做词法分析,语法分析,语义分析以及优化处理,将高级程序语言翻译成汇编代码。

    (3). 汇编:

    将编译后的汇编代码转换成机器指令(即机器可以读懂的指令)——二进制指令。

    (4). 链接:

    通过链接器将汇编后的一个个目标文件链接到一起生成一个可执行文件。


指针和引用的区别


  1. 指针和引用的区别

    (1). 指针是一个变量,它的值为所指向的对象的地址;但引用只是一个对象的别名。

    (2). 引用不可以为空,所以在定义一个引用的时候必须要初始化它;指针可以为空,可以不指向任何对象。

    (3). 引用从创建开始就只能指向初始化时候的对象,中途不可以变更指向;指针可以变更指向的对象。

    (4). 引用的大小是引用所指向对象的大小;而指针的大小就是指针本身的大小,4个字节。


c++中 ‘malloc / free’ 和 ‘new / delete’的区别


  1. c++中 ‘malloc / free’ 和 ‘new / delete’的区别

    (1). 申请内存所在位置不同

    new 和 delete 是从自由存储区中为对象动态分配或者释放内存;
    而malloc 和 free 是从堆上动态分配或者释放内存。
    
    在整理的时候还是有些疑惑的,以前我觉得这些全都是在堆上分配内存,
    现在又多了个自由存储区。
    于是特地了解了一下,下方链接就是了解后专门写的一篇文章。
    

    自由存储区和堆有什么关系

    (2). 类型不同

    new 和 delete 是操作符;而malloc 和 free 是函数。
    

    (3). 具体操作不同

    new 和 delete 会调用类的构造和析构函数;
    而malloc 和 free 只是单纯的分配和释放内存。
    

    (4). 用法不同

    new 使用的时候不需要指定要分配的内存大小;
    malloc 需要指定内存大小。
    

关键字static的作用


  1. 关键字static的作用

    (1). 使变量和函数仅在当前文件可见

    当同时编译多个文件时,没有加static的全局变量和函数都具有全局可
    见性。
    
    加上static可以使全局变量和函数仅在当前文件中可见。这样就可以在不同
    的文件中定义同名的函数和变量。
    

    下方链接是本人写的另一篇关于全局变量和函数如何在其他文件中使用的文章。
    全局变量及函数如何在其他文件中使用

    (2). 保持变量内容的持续使用

    函数内的局部变量前面加上static可以使此局部变量的生存期变为整个
    源程序,但是它的作用域还只是这个函数内可以访问,但是函数结束后
    此变量仍然存在,下次调用此函数时,此变量的值就是上次函数结束时
    的此变量的值。
    
    类中声明static变量或函数时,它们属于整个类而不是属于单个对象。
    所以静态成员函数不含有this指针,它只可以访问类的静态成员变量
    和静态成员函数。
    静态类成员变量的生存期也是整个源程序。
    

const关键字的作用


  1. const关键字的作用

     (1). 防止一个变量被改变,使用const定义一个变量的时候
          就要初始化,后续这个变量就不可被更改。
     
     (2). 对指针来说,const既可以修饰被指针指向的变量,使其值
          无法被更改;也可以修饰指针本身,使指针无法改变指向。
    
    //定义指向常量的指针(指针指向的内容不能被修改)——常量指针
    const int* p1; 
    int const* p2; 
    
    //定义const指针(指针的指向不可以被修改)——指针常量
    int a=3;
    int * const p=&a;
    
     (3). 修饰函数参数,表示该参数在函数内不可以被改变。
    
     (4). 修饰类成员函数,表明它是一个常函数,不可以修改
     	  类内的成员
     	  
     (5). 修饰函数的返回值,表示返回常量,返回值不可以作
     	  为左值。
    
    class A{
    public:
    	........
    	//const 修饰成员函数
    	int getA() const;
    
    	//const 修饰函数返回值
    	const int getB();
    	或者
    	int const getB();
    }
    

你可能感兴趣的:(c++原理,面试,面试,c++,编译器,内存结构)