当前位置: 首页 > 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++编译器为类提供的四个缺省函数是什么

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

持续更新...... 

http://www.lqws.cn/news/207973.html

相关文章:

  • Java IO流完全指南:从基础到进阶的全面解析
  • Linux下的fuser用法简析
  • AI整合SEO关键词智能策略
  • MySQL:分区的基本使用
  • 基于算法竞赛的c++编程(21)cin,scanf性能差距和优化
  • 王劲松《人民日报》撰文 重读抗战家书不忘来时路
  • 用电脑通过USB总线连接控制keysight示波器
  • 第22讲、Odoo18 QWeb 模板引擎详解
  • 亚川科技IBMS集成管理平台:构建商业综合体智慧中枢
  • 纳米AI搜索与百度AI搜、豆包的核心差异解析
  • Parameter ‘XXX‘ not found. Available parameters are [list, param1]
  • 手写Promise.all
  • 图卷积网络:从理论到实践
  • JavaScript篇:字母侦探:如何快速统计字符串里谁才是‘主角‘?
  • STM32标准库-输入捕获
  • Faiss vs Milvus 深度对比:向量数据库技术选型指南
  • 《高等数学》(同济大学·第7版)第二章第五节“函数微分“
  • 18-Oracle 23ai JSON二元性颠覆传统
  • SpringAI Alibaba实战文生图
  • git知识点
  • 华为云Flexus+DeepSeek征文|华为云一键部署知识库搜索增强版Dify平台,构建智能聊天助手实战指南
  • day49 python 注意力热图
  • 将单体架构项目拆分成微服务时的两种工程结构
  • Spring Cloud Hystrix熔断机制:构建高可用微服务的利器
  • OkHttp 3.0源码解析:从设计理念到核心实现
  • 向日葵远程控制debian无法进入控制画面的解决方法
  • Git开发实战
  • ELK日志管理框架介绍
  • WPS中将在线链接转为图片
  • JAVA实战开源项目:信息技术知识赛系统 (Vue+SpringBoot) 附源码