当前位置: 首页 > news >正文

【面试篇 9】c++生成可执行文件的四个步骤、悬挂指针、define和const区别、c++定义和声明、将引用作为返回值的好处、类的四个缺省函数

目录

31. c++生成可执行文件的四个步骤

32. 什么是悬挂指针

33. 什么时候会出现悬挂指针

34. #define和const 有什么区别

35. include<> 和 include" " 的区别

36. c++的定义和声明

37. c++将引用作为返回值的好处和应该遵守的规则

38. 成员函数是通过什么来区分不同对象的成员变量的?

39. c++编译器为类提供的四个缺省函数是什么

31. c++生成可执行文件的四个步骤

  1. 预处理预处理根据字符#开头命令修改原来c++程序这个阶段主要处理#include#define 预处理指令头文件插入程序进行替换操作
  2. 编译:编译器预处理文件作为输入进行语法分析语义分析处理这些处理代码转化中间代码中间代码汇编语言
  3. 汇编:汇编器编译阶段生成中间代码翻译机器语言指令01二进制)结果保存目标文件生成符号表(记录函数、变量的名称、地址等)。
  4. 链接:链接器各个目标文件以及程序需要库文件进行连接生成执行文件连接器解决目标文件之间引用关系他们组合一个完整程序跨文件合成段表、符号表的合并和重定位

32. 什么是悬挂指针

悬挂指针也叫野指针指向非法内存地址指针无法正常使用指针

33. 什么时候会出现悬挂指针

1. 使用未初始化的指针:定义指针变量没有对其进行初始化这是出现悬挂指针典型情形(定义指针时没初始化,它的值是随机的垃圾值指向内存里未知区域,随机地址解引用,可能崩溃或破坏数据)

int* p; // 未初始化,p的值不确定
// *p = 10; // 危险!随机地址解引用,可能崩溃或破坏数据

2. 指针所指的对象已经消亡:指针指向对象生命周期结束对象已经消亡仍然使用指针访问对象就会出现运行时错误

3. 指针释放后未置空:指针free或者delete释放没有NULL此时指针指向“垃圾”内存

4. 在c语言中,realloc函数(c语言标准库中用于动态内存重新分配的函数)使用不当:如果内存后面没有足够空间原有空间扩展一个连续realloc函数重新一块内存并把原来通过malloc函数得到内存空间内容复制这块内存此时数据发生移动那么原指针指向内存空间实际已经释放这样就会产生原指针悬挂

34. #define和const 有什么区别

define定义常量没有类型const定义常量类型名字

编译器处理不同define定义预处理阶段替换可能多个拷贝const定义变量编译确定只有一个拷贝(const 定义的常量,因为是 “有类型、有作用域的变量”,编译器会通过 编译优化、内存复用,让它在程序里尽可能只存 “一份拷贝” ,实现“共享拷贝”)。

35. include<> 和 include" " 的区别

  • #include<>用于包含系统标准头文件编译器系统指定标准头文件目录查找包含头文件例如<iostream>
  • #include" "通常用于包含用户自己编写头文件编译器当前源文件所在目录查找

36. c++的定义和声明

声明主要编译器告知某个变量函数类型存在分配实际存储空间详细定义行为声明只是告诉编译器“有这么个东西”

定义不仅声明变量函数类型存在还会分配存储空间(对于变量)详细描述行为(对于函数等)一个变量函数程序中只能定义一次

37. c++将引用作为返回值的好处和应该遵守的规则

  • 减少内存开销:内存产生返回值副本避免不必要内存分配复制操作
  • 提高效率:可以直接返回对象本身不需要创建临时对象从而提高程序运行效率
  • 支持链式操作:返回引用可以支持链式操作使得代码更加简洁和易读
  • 流操作符重载返回值应声明为引用:为了保证连续使用操作<<和>>)重载返回值操作同一个对象(c++标准库已经针对基础数据类型像int、char、string等,对operator<<进行了重载,所以可以直接进行链式输出操作)。
  • +-*/ 四则运算符不能返回引用:这是因为四则运算符通常用于产生值。重载四则运算符时应返回值,而不是引用,返回引用相当返回局部变量引用不是直接修改操作
  • 不能返回局部变量的引用:因为局部变量函数返回会被销毁返回引用导致引用指向无效内存区域可能引发运行时错误
  • 可以返回类成员的引用,但最好是const类型:这样可以避免意外修改成员同时也能提高代码可读性维护性

38. 成员函数是通过什么来区分不同对象的成员变量的?

成员函数通过对象指针(this指针)区分不同对象成员变量

成员函数内部有一个隐含指针this指向调用成员函数具体对象不同对象调用同一个成员函数this指针就会指向各自对应对象从而能够准确访问操作对象成员变量不同对象数据区分开来

例如有一个Person包含成员变量age不同person对象调用成员函数修改agethis指针明确指向具体那个对象使得修改当前对象age不是其他对象

39. c++编译器为类提供的四个缺省函数是什么

  • 默认构造函数:没有显式定义构造函数编译器生成一个无参数默认构造函数
  • 拷贝构造函数:浅拷贝成员变量赋值操作不会产生堆区内存
  • 赋值运算符重载函数:浅拷贝问题因为也是成员变量赋值操作
  • 析构函数:对象销毁执行一些清理工作

持续更新...... 

相关文章:

  • 如何使用Jmeter进行压力测试?
  • WPF 播放器(AudioPlayer 2025)
  • Java中栈的多种实现类详解
  • 23、字节对齐
  • Xxl-job——源码设计思考
  • 数据通信基础
  • Axure应用交互设计:注册登录页完整交互设计
  • 【Linux操作系统】基础开发工具(yum、vim、gcc/g++)
  • sendDefaultImpl call timeout(rocketmq)
  • 【Python】屏幕像素颜色值的获取
  • SpringBoot-17-MyBatis动态SQL标签之常用标签
  • Unity的日志管理类
  • 【CF】Day78——⭐Codeforces Round 876 (Div. 2) D (LIS | 思维 | DP)
  • 15-Oracle 23ai Vector Search Similarity Search-向量相似性和混合搜索-实操
  • go工具库:hertz api框架 hertz client的使用
  • 【数据结构】详解算法复杂度:时间复杂度和空间复杂度
  • 使用python实现奔跑的线条效果
  • TTL简述
  • 基于算法竞赛的c++编程(20)函数的递归
  • OpenLayers:封装Tooltip
  • 个人备案网站做淘宝客可以用吗/房地产销售
  • 中国建设银行吉林分行网站/seo关键词优化指南
  • 使用云主机做网站教程/搜索引擎优化的基础是什么
  • 深圳网站建设方案服务公司/网页优化包括什么
  • 是网站建设专业好/关注公众号一单一结兼职
  • 烟台建设工程信息网站/产品的推广及宣传思路