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

【面试篇 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++编译器为类提供的四个缺省函数是什么

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

持续更新...... 

http://www.xdnf.cn/news/12856.html

相关文章:

  • 双面沉金线路板制作流程解析:高可靠性PCB的核心工艺
  • 计算机基础知识(第五篇)
  • C#提取CAN ASC文件时间戳:实现与性能优化
  • Dynadot专业版邮箱工具指南(五):将域名邮箱添加至Outlook客户端
  • MySQL(62)如何进行数据库分片?
  • 数据库防丢失技术指南
  • 26N60-ASEMI工业电机控制专用26N60
  • 使用 SAM + YOLO + ResNet 检测工业开关状态:从零到部署
  • 纳米AI搜索与百度AI搜、豆包的核心差异解析
  • 湖北理元理律师事务所:债务咨询中的心理支持技术应用
  • Linux【4】------RK3568启动和引导顺序
  • model.classifier 通常指模型的分类头 是什么,详细举例说明在什么部位,发挥什么作用
  • 5月微短剧备案情况:当代都市剧成为主流
  • python asyncio的作用
  • 开源技术驱动下的上市公司财务主数据管理实践
  • Python异步编程-协程
  • MySQL SQL 优化:从 INSERT 到 LIMIT 的实战与原理
  • 让DeepSeek写2025年高考作文
  • PCB设计教程【大师篇】——STM32开发板电源设计(电压基准、滤波电容)
  • 大故障,阿里云核心域名疑似被劫持
  • Langgraph实战--自定义embeding
  • AI赋能的浏览器自动化:Playwright MCP安装配置与实操案例
  • 【hadoop】相关集群开启命令
  • SQL慢可能是触发了ring buffer
  • 获取 OpenAI API Key
  • 字符数组、字符串数组测试例程
  • 头像上传功能的实现
  • 51单片机基础部分——矩阵按键检测
  • Python爬虫实战:研究Hyper 相关技术
  • 内存泄漏检测工具-学习(一)