• C++面试常见问题 — C++语言基础


    C++语言基础问题

    1. C++语言的三大特性?

    • 封装
    • 继承
    • 多态

    2. C和C++的区别?

    1. C语言是C++子集,C++兼容C语言,但是C++又有很多新的特性,如引用,智能指针,auto变量等等。
    2. C++是面向对象的语言,C事面向过程的编程语言。
    3. C++中增加了新的特性来改善安全性,如const常量,cast转换,智能指针,try-catch等等;
    4. C++中引入了模板的概念,代码的可服用性高。

    3. C++中的strcut和class的区别

    1. struct 用于描述一个数据结构集合,而class是对一个对象数据的封装。
    2. strcut 默认访问控制权限是public,而class默认权限是private;
    3. 继承关系中,struct是公有继承,而calss是私有继承;
    4. class可以定义模板参数,而struct不能;

    4. C++中的strcut与C中的strcut的区别

    CC++
    成员函数
    静态成员
    访问控制默认public,不可修改public/private/protected
    继承关系不可继承可从类或者结构体继承
    初始化不能直接出实话数据成员可初始化

    5. C++导入C得关键字?

    关键字是extern,写法是 extern “C”,主要作用是在编译时该代码按照C编译,而不是C++编译;

    6. C和C++编译的区别

    由于C++支持重载,编译的过程中会将函数的参数类型加到编译后的代码中,而不仅仅是函数名;C代码不支持重载,故编译时不会带上函数的参数类型,只包括函数名。

    7. C++代码到可执行二进制文件的过程

    四个过程:预编译,编译,汇编,链接

    1. 预编译
      • define删除,展开宏定义
      • 处理条件编译
      • 处理include预编译指令
      • 过滤注释
      • 添加行号和文件名标识
    2. 编译
      • 词法,语法,语意分析
      • 代码优化
      • 生产汇编代码
    3. 汇编
      • 汇编代码转换为机器代码
    4. 链接
      • 把不同文件产生的目标文件进行链接,行成可执行的程序,链接分为静态链接与动态链接;

    8. 静态链接与动态链接

    1. 静态链接
      在链接时就把要调用的函数或者过程链接到了可执行文件中,删除静态库不会影响可执行程序的执行;
    2. 动态链接
      程序在执行的额过程中,去找链接的函数,生产的可执行文件中没有函数代码,只包括函数的重定位信息,删除动态库后程序无法执行。

    9. static关键字的作用

    1. 定义全局静态变量与局部静态变量。初始化的静态变量存放在数据段分配内存,微初始化的在BSS段分配内存。直到程序结束,静态变量会始终维持,但是全局与局部作用域不一样。
    2. 定义静态函数,限定作用域,只能在本源文件中使用。
    3. 定义内中静态成员函数,与内中静态成员变量。

    10. 数组和指针区别

    1. 数组:是多个相同类型数据的集合,数组名是首元素地址;
    2. 指针:指针存放的是变量在内存中的地址;
      区别:
    3. 赋值:指针变量可以相互赋值,数组不信,只能一个个拷贝;
    4. 存储方式不一样,数组在内存中是连续的内存空间,根据下标进行访问,而指针可以指向任意数据类型,故大小不能确定。
    5. sizeof结果不一样。

    11. 函数指针

    指向函数的指针变量,用于回调函数。

    12. 静态变量初始化

    1. C语言在编译的时候初始化
    2. C++在对象首次用到时才进行构造。

    13. 野指针的产生

    野指针:指针指向的位置是不可知的;
    产生:释放内存后指针未指空;
    避免:初始化置NULL,申请内存判空,释放后置NULL;使用智能指针

    int *p = NULL; //初始化置NULL
    p = (int *)malloc(sizeof(int)*n); //申请n个int内存空间  
    assert(p != NULL); //判空,防错设计
    p = (int *) realloc(p, 25);//重新分配内存, p 所指向的内存块会被释放并分配一个新的内存地址
    free(p);  
    p = NULL; //释放后置空
    
    int *p2 = NULL; //初始化置NULL
    p2 = new int[n]; //申请n个int内存空间  
    assert(p2 != NULL); //判空,防错设计
    delete []p2;  
    p2 = nullptr; //释放后置空 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    14. 静态全局变量,静态局部变量,全局变量,局部变量

    1. 全局变量:全局作用域,可以通过extern作用于其他非定义的源文件;
    2. 静态全局变量:全局作用域+文件作用域,无法在其他文件使用;
    3. 局部变量:局部作用域,函数内的局部变量;
    4. 静态局部变量:局部作用域,只被初始化一次,直到程序结束;

    15. 内联函数和宏函数的区别

    1. 宏函数不是函数,预处理复制宏代码的方式替代了函数的调用;而内联函数本质是一个函数,其代码比较简单;
    2. 宏函数是预编译的时候把所有的宏名用宏体来替换,就是字符串替换;内联函数是在编译的时候进行代码插入,省去函数调用的开销,提高程序效率;
    3. 宏定义不会检查类型;内联函数会进行类型检查;

    16. New与Malloc的区别

    1. new是操作符,malloc是函数;
    2. new在调用时先分配内存,再调用构造函数,释放调用析构函数;而malloc只申请内存空间;
    3. new不需要指定内存大小,返回指针不用强转;mallco需要指定内存大小,指针需要强转;
    4. new可以被重载,malloc不行;
    5. new分配内存更加安全;
    6. new发生错误错误会抛出异常,malloc会返回null;

    17. const与define的区别

    1. const在编译阶段生效,而dedfine在预处理阶段生效;
    2. const定义的常量存在在内存中,而define定义的常量,运行时是直接的操作数,并不会放在内存中;
    3. const定义的常量带内存,define定义的常量不带类型;
    4. const更加安全,会在编译时检查类型语法,而dedine不会检查;

    18. 函数指针与指针函数

    1. 指针函数:本质是一个函数,返回值为指针。
    2. 函数指针:函数指针本质是一个指针,指向一个函数
    指针函数:int *fun(int x,int y);
    函数指针:int (*fun)(int x,int y);
    
    • 1
    • 2

    19. C++的传值方式?

    1. 值传递:不会影响实参的值;
    2. 引用传递:影响实参的值;
    3. 指针传递:影响实参的值;

    注意
    - 值传递对象时,会拷贝一个副本,导致效率低;
    - 引用与指针传递不会发生拷贝行为,只绑定对象;
    - 引用比指针传递更加安全;

  • 相关阅读:
    学生HTML个人网页作业作品:基于web在线汽车网站的设计与实现 (宝马轿车介绍)
    大二学生JavaScript实训大作业——动漫秦时明月7页 期末网页制作 HTML+CSS+JavaScript 网页设计实例 企业网站制作
    简述加密、摘要、数字签名、数字证书
    Opencv学习项目3——pytesseract
    浅谈python后端面试(附一些经典项目源码)
    InnoDB存储引擎非常重要的一个机制--MVCC(多版本并发控制)
    JDK更换版本配置不生效问题
    强大多云混合多K8S集群管理平台Rancher入门实战
    Pandas常见筛选数据的五种方法其一逻辑筛选。看见必懂,懂者必会,会者必加分
    【Linux】数据备份的理论
  • 原文地址:https://blog.csdn.net/qq_42837306/article/details/126197230