面试题解析 | C++空类的默认成员函数(附生成条件与底层原理)

在C++面试中,“空类默认生成哪些成员函数”是考察对象模型和编译器行为的高频题目。许多资料仅提及前4个函数,但完整的答案应包含6个核心函数,并结合C++标准深入解析其生成规则与使用场景。

一、空类默认生成的6大成员函数

1. ​缺省构造函数

原型​:ClassName()
触发条件​:通过ClassName obj;声明对象时自动生成。若用户显式定义其他构造函数(如拷贝构造),编译器不再生成默认版本。
底层行为​:对空类无实际初始化操作,仅分配内存。

2. ​缺省拷贝构造函数

原型​:ClassName(const ClassName&)
触发条件​:对象拷贝初始化(如ClassName obj2 = obj1;)。
默认行为​:浅拷贝所有非静态成员变量(空类无实际效果)
风险​:若类含指针成员,需手动实现深拷贝以避免重复释放。

3. ​缺省析构函数

原型​:~ClassName()
触发条件​:对象生命周期结束(如局部对象离开作用域)。
关键点​:若类管理动态资源(如new内存),必须显式重写析构函数

4. ​缺省赋值运算符

原型​:ClassName& operator=(const ClassName&)
触发条件​:对象赋值操作(如obj2 = obj1;)。
与拷贝构造的区别​:作用于已存在的对象,而非新对象初始化

5. ​缺省取址运算符

原型​:ClassName* operator&()
作用​:返回对象的地址(等价于return this;)。
示例​:

Empty obj;
Empty* p = &obj;  // 调用默认取址运算符[6,10](@ref)

6. ​缺省取址运算符 const

原型​:const ClassName* operator&() const
作用​:返回const对象的地址,用于const对象调用场景

二、编译器行为与生成规则

1. ​按需生成机制

所有默认函数仅在第一次被调用时生成,而非声明类时立即生成

例如:

class Empty {};
Empty e1;          // 触发缺省构造函数生成
Empty e2 = e1;     // 触发拷贝构造函数生成

2. ​覆盖规则

若用户显式定义任意成员函数(如拷贝构造),编译器不再生成对应的默认版本

例如:

class Empty {
public:Empty(const Empty&) {}  // 显式定义拷贝构造
};
Empty e1;        // 错误!缺省构造函数未生成

3. ​空类内存布局

即使没有成员变量,编译器仍为每个对象分配1字节占位符,确保地址唯一性

class Empty {};
cout << sizeof(Empty);  // 输出1

三、常见面试扩展问题

1. ​为什么取址运算符容易被忽略?​

  • 历史原因​:早期C++标准(C++03)未明确要求生成,部分书籍未提及
  • 隐式调用​:取址操作通常无需显式重载,开发者感知度较低。

2. ​C++11新增的移动语义

从C++11起,空类还会生成移动构造函数移动赋值运算符,但需满足以下条件:

  • 用户未显式定义拷贝构造、析构函数等
  • 移动语义通过右值引用(ClassName&&)触发,避免深拷贝开销

3. ​Rule of Three/Five/Zero原则

  • Rule of Three​:若自定义析构函数、拷贝构造或拷贝赋值,需同时定义三者(避免资源泄漏)。
  • Rule of Five​(C++11+):扩展至包含移动构造和移动赋值
  • Rule of Zero​:优先使用智能指针等RAII机制,避免手动管理资源

四、总结

成员函数触发场景C++标准支持
缺省构造函数无参对象构造C++98+
缺省拷贝构造函数对象拷贝初始化C++98+
缺省析构函数对象销毁C++98+
缺省赋值运算符对象赋值操作C++98+
缺省取址运算符取非const对象地址C++98+
缺省取址运算符 const取const对象地址C++98+

面试回答技巧​:

“C++空类默认生成6个成员函数:缺省构造、拷贝构造、析构、赋值运算符,以及两个取址运算符。这些函数仅在首次使用时由编译器隐式生成,且均为publicinline。若用户显式定义任意函数,编译器将不再生成对应默认版本。需特别注意,C++11后新增的移动语义相关函数(移动构造/赋值)也属于默认生成范畴,但仅在满足特定条件时触发。”

【C语言】零基础到项目实战

【C语言/C++】零基础到项目实战

初学者营地:1021486511

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/905238.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

视频编解码学习7之视频编码简介

视频编码技术发展历程与主流编码标准详解 视频编码技术是现代数字媒体领域的核心技术之一&#xff0c;它通过高效的压缩算法大幅减少了视频数据的体积&#xff0c;使得视频的存储、传输和播放变得更加高效和经济。从早期的H.261标准到最新的AV1和H.266/VVC&#xff0c;视频编码…

使用Stable Diffusion(SD)中,步数(Steps)指的是什么?该如何使用?

Ⅰ定义&#xff1a; 在Stable Diffusion&#xff08;SD&#xff09;中&#xff0c;步数&#xff08;Steps&#xff09; 指的是采样过程中的迭代次数&#xff0c;也就是模型从纯噪声一步步“清晰化”图像的次数。你可以理解为模型在画这张图时“润色”的轮数。 Ⅱ步数的具体作…

消息队列如何保证消息可靠性(kafka以及RabbitMQ)

目录 RabbitMQ保证消息可靠性 生产者丢失消息 MQ丢失消息 消费端丢失了数据 Kakfa的消息可靠性 生产者的消息可靠性 Kakfa的消息可靠性 消费者的消息可靠性 RabbitMQ保证消息可靠性 生产者丢失消息 1.事务消息保证 生产者在发送消息之前&#xff0c;开启事务消息随后生…

如何查看项目是否支持最新 Android 16K Page Size 一文汇总

前几天刚聊过 《Google 开始正式强制 Android 适配 16 K Page Size》 之后&#xff0c;被问到最多的问题是「怎么查看项目是否支持 16K Page Size」 &#xff1f;其实有很多直接的方式&#xff0c;但是最难的是当你的项目有很多依赖时&#xff0c;怎么知道这个「不支持的动态库…

HttpServletResponse的理解

HttpServletResponse 是 Java Servlet API 提供的一个接口 常用方法 方法用途setContentType(String type)设置响应内容类型&#xff08;如 "application/json"、"text/html"&#xff09;setStatus(int sc)设置响应状态码&#xff08;如 200、404&#x…

可灵 AI:开启 AI 视频创作新时代

在当今数字化浪潮中&#xff0c;人工智能&#xff08;AI&#xff09;技术正以前所未有的速度渗透到各个领域&#xff0c;尤其是在内容创作领域&#xff0c;AI 的应用正引发一场革命性的变革。可灵 AI 作为快手团队精心打造的一款前沿 AI 视频生成工具&#xff0c;宛如一颗璀璨的…

用 AltSnap 解锁 Windows 窗口管理的“魔法”

你有没有遇到过这样的场景&#xff1a;电脑屏幕上堆满了窗口&#xff0c;想快速调整它们的大小和位置&#xff0c;却只能拖来拖去&#xff0c;费时又费力&#xff1f;或者你是个多任务狂魔&#xff0c;喜欢一边写代码、一边看文档、一边刷视频&#xff0c;却发现 Windows 自带的…

深度策略梯度算法PPO

一、策略梯度核心思想和原理 从时序差分算法Q学习到深度Q网络&#xff0c;这些算法都侧重于学习和优化价值函数&#xff0c;属于基于价值的强化学习算法&#xff08;Value-based&#xff09;。 1. 基于策略方法的主要思想&#xff08;Policy-based&#xff09; 基于价值类方…

【LaTeX】Word插入LaTeX行间公式如何编号和对齐

在 Word 文档中插入公式&#xff0c;需要用到 LaTeX \LaTeX LATE​X 。但遗憾的是&#xff0c;Word 只支持部分 LaTeX \LaTeX LATE​X 语法&#xff0c;这就导致很多在 Markdown 能正常渲染的公式在 Word 中无法正常显示。 “内嵌”和“显示” 首先介绍一下 Word 的“内嵌”…

互联网大厂Java面试实战:Spring Boot到微服务的技术问答解析

&#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精通 &#x1f601; 2. 毕业设计专栏&#xff0c;毕业季咱们不慌忙&#xff0c;几百款毕业设计等你选。 ❤️ 3. Python爬虫专栏…

spring boot3.0自定义校验注解:文章状态校验示例

文章目录 Spring Boot 自定义校验注解&#xff1a;状态校验示例一、创建 State 注解步骤&#xff1a;1. 创建自定义注解&#xff1a;2. 实现校验逻辑&#xff1a; 二、 实现自定义校验步骤:1. 在实体类中使用自定义校验注解 State&#xff1a;2. 添加 State 注解&#xff1a; 总…

无侵入式弹窗体验_探索 Chrome 的 Close Watcher API

1. 引言 在网页开发中,弹窗(Popup)是一种常见的交互方式,用于提示用户进行操作、确认信息或展示关键内容。然而,传统的 JavaScript 弹窗方法如 alert()、confirm() 和 prompt() 存在诸多问题,包括阻塞主线程、样式不可定制等。 为了解决这些问题,Chrome 浏览器引入了 …

调出事件查看器界面的4种方法

方法1. 方法2. 方法3. 方法4.

Ubuntu 安装远程桌面连接RDP方式

1. 安装 XFCE4 桌面环境 如果你的 Ubuntu 系统默认使用 GNOME 或其它桌面环境&#xff0c;可以安装轻量级的 XFCE4&#xff1a; sudo apt update sudo apt install xfce4 xfce4-goodies 说明&#xff1a;xfce4-goodies 包含额外的插件和工具&#xff08;如面板插件、终端等&a…

LWIP传输层协议笔记

传输协议简介 文件/图片/视频 都是一堆二进制数据 经过传输层来传输 这两种协议有什么区别呢&#xff1f; 传输层的TCP/UDP三个步骤 TCP使用传输流程 1、三次握手 作用&#xff1a;三次握手就是建立连接的过程 2、传输数据 作用&#xff1a;建立连接完成之后&#xff…

数据分析与逻辑思维:六步解决业务难题;参考书籍《数据分析原理:6步解决业务分析难题 (周文全, 黄怡媛, 马炯雄)》

文章目录 一、懂业务&#xff1a;业务背景与逻辑前提1.1 明确业务目标与问题定义1.2 培养批判性思维与高于业务视角 二、定指标&#xff1a;构建科学的指标体系2.1 指标拆解与维度分析2.2 典型指标体系案例&#xff1a;用户与业务视角 三、选方法&#xff1a;匹配业务需求的分析…

开启WSL的镜像网络模式

开启WSL的镜像网络模式 前提 Windows主机系统版本高于Windows 11 22H2。WLS版本>2.0。 可输入wsl --version查看当前系统wsl版本。 修改设置 图形界面修改 在开始菜单中搜索&#xff1a;wsl settings&#xff0c;结果如下图所示&#xff1a; 点击“打开”&#xff0…

Python爬虫第20节-使用 Selenium 爬取小米商城空调商品

目录 前言 一、 本文目标 二、环境准备 2.1 安装依赖 2.2 配置 ChromeDriver 三、小米商城页面结构分析 3.1 商品列表结构 3.2 分页结构 四、Selenium 自动化爬虫实现 4.1 脚本整体结构 4.2 代码实现 五、关键技术详解 5.1 Selenium 启动与配置 5.2 页面等待与异…

聚类分析的原理、常用算法及其应用

聚类分析的原理、常用算法及其应用 一、聚类分析的基本原理 &#xff08;一&#xff09;什么是聚类分析 聚类分析是一种无监督学习方法&#xff0c;其目标是将数据集中的样本划分为若干个簇&#xff0c;每个簇包含相似的样本。聚类分析的核心思想是通过某种相似性度量&#…

Aware和InitializingBean接口以及@Autowired注解失效分析

Aware 接口用于注入一些与容器相关信息&#xff0c;例如&#xff1a; ​ a. BeanNameAware 注入 Bean 的名字 ​ b. BeanFactoryAware 注入 BeanFactory 容器 ​ c. ApplicationContextAware 注入 ApplicationContext 容器 ​ d. EmbeddedValueResolverAware 注入 解析器&a…