C++ 类编译器默认生成的十大特殊成员函数

MicroCap声学仿真介绍(四)-扬声器仿真 将“障板”模块放置到工作区,“Param:AREAm2=”是指的是障板孔的面积,一般可以输入喇叭的面积Sb;“Param:DISTm=”指的是测试麦克风与障板的距离,这里我们可以填入1米,小喇叭可以填入0.1m;此时工作区的电阻是竖直的,为了方便,我们需要将其变成水平的。其中,频率范围为20~20KHz,仿真点数为500个点,先仿真频响曲线和相位曲线,点击左上角的run,界面如下。鼠标单击工作区,弹出如下界面:在弹出的界面中输入“.define Re 3.82 “,点击”确定“按钮。 阅读详情

C++ 类编译器默认生成的十大特殊成员函数

一、完整列表(C++98 ~ C++11 统一标准)

如果类没有手动声明对应函数,编译器会隐式自动生成:

  1. 默认构造函数(无参构造)
  2. 拷贝构造函数(复制构造)
  3. 拷贝赋值运算符 operator=
  4. 析构函数
  5. 移动构造函数(C++11 新增)
  6. 移动赋值运算符 operator=(C++11 新增)

前4个是C++98就有,后2个移动语义是C++11引入。

二、逐个详解生成规则、触发条件、禁用场景

1. 默认构造函数 T()

生成条件

类没有任何自定义构造函数(有参、无参都算自定义),编译器生成空无参构造。

struct A {
    int x;
};
// 编译器生成:A::A() {}
A a; // 合法调用默认构造
不生成的情况

只要写了任意构造函数(哪怕带参数),编译器不再生成默认构造:

struct A {
    A(int) {} // 自定义构造,无默认构造
};
A a; // 编译报错
特殊限制
  • 类含const成员/引用成员:自动默认构造函数会被删除(无法初始化)。
  • 成员无默认构造:本类默认构造被删除。

2. 拷贝构造函数 T(const T&)

生成条件

没有手动声明拷贝构造,编译器生成浅拷贝版本:逐成员拷贝(值拷贝)。

struct A { int x; };
// 自动生成 A(const A& other) : x(other.x) {}
A a1;
A a2 = a1; // 调用拷贝构造
不生成/被删除场景
  1. 手动写了拷贝构造;
  2. 类包含不可拷贝成员(引用、const成员、unique_ptr、无拷贝构造的成员);
  3. 基类拷贝构造被删除/私有。

3. 拷贝赋值 T& operator=(const T&)

生成规则

无手动重载赋值,生成逐成员赋值浅拷贝。

A a1, a2;
a2 = a1; // 调用自动拷贝赋值
自动删除场景
  • 有 const / 引用成员(引用不能重新赋值);
  • 成员不可赋值(unique_ptr等);
  • 基类赋值运算符被删除。

4. 析构函数 ~T()

生成条件

没有手动写析构,编译器生成空析构:

struct A { int x; };
// 自动生成 ~A(){},对象销毁时调用
特殊规则
  1. 哪怕写了其他构造,析构依然会默认生成;
  2. 析构不会被自动删除,只有手动 ~A() = delete; 才禁用;
  3. 基类析构建议加 virtual,否则多态释放内存泄漏(编译器不会自动virtual)。

5. 移动构造 T(T&&) C++11

生成前提(全部满足才生成)
  1. 没有自定义:拷贝构造、拷贝赋值、移动构造、移动赋值、析构;
  2. 所有非静态成员、基类都支持移动构造。
作用

转移资源所有权(std::move),性能优于拷贝。

触发删除

只要手动写了拷贝构造/析构等任一函数,编译器不再生成移动构造。


6. 移动赋值 T& operator=(T&&) C++11

生成规则和移动构造完全一致:只要手动定义拷贝/析构等,就不会自动生成。

三、记忆速记:三/五法则

1. C++98 三法则(Rule of Three)

如果你手动定义了下面任意一个,建议手动写出另外两个:

  • 析构函数
  • 拷贝构造
  • 拷贝赋值运算符

原因:通常是管理堆内存/资源,默认浅拷贝会双重释放、内存泄漏。

2. C++11 五法则(Rule of Five)

扩展两条移动函数:
手动定义析构/拷贝构造/拷贝赋值任一,编译器不会自动生成移动构造、移动赋值;
此时资源类建议显式定义/禁用全部5个特殊函数:

  1. 默认构造
  2. 拷贝构造
  3. 拷贝赋值
  4. 移动构造
  5. 移动赋值
  6. 析构

四、示例:全部显式声明/禁用

class Demo {
public:
    // 1. 默认构造
    Demo() = default;
    // 2. 拷贝构造
    Demo(const Demo&) = delete;
    // 3. 拷贝赋值
    Demo& operator=(const Demo&) = delete;
    // 4. 移动构造
    Demo(Demo&&) = default;
    // 5. 移动赋值
    Demo& operator=(Demo&&) = default;
    // 6. 析构
    ~Demo() = default;
};

五、补充:不自动生成的常用运算符(容易混淆)

下面这些不会由编译器默认生成,必须手动重载:

  • operator+、operator- 算术运算符
  • operator==、operator< 比较运算符
  • operator[]、operator()、operator*
  • 流运算符 << / >>

只有上面6个特殊成员函数是编译器按需隐式生成。

另外四个

一、先说结论

编译器会隐式生成两个取地址重载,但它们不属于「六大特殊成员函数」,平时讲默认生成的特殊函数一般不提:

  1. 普通取地址:T* operator&()
  2. const取地址:const T* operator&() const

1. 自动生成规则

只要你没有手动重载 operator&,编译器就会自动生成这两个版本:

struct A {
    int x;
};
// 编译器隐式生成等价代码:
A* operator&() { return this; }
const A* operator&() const { return this; }

作用:直接返回当前对象 this 指针。

使用示例

A a;
A* p = &a;      // 调用 operator&()
const A ca{};
const A* cp = &ca; // 调用 const 版本

2. 为什么平时讲默认函数很少提它?

(1)标准定义区分两类成员

C++标准里把成员函数分成两类:

  1. 特殊成员函数(special member functions):
    默认构造、拷贝构造、拷贝赋值、析构、移动构造、移动赋值(共6个)
    这一组有严格的生成/抑制规则(三/五法则只针对它们)。

  2. 内置运算符成员(如 operator&):
    operator&、operator->、operator[] 等不属于特殊成员;
    只要不手动写,就自动生成,不受三/五法则影响。

(2)几乎没人重载 operator&

正常业务代码完全不需要改写取地址;
只有少数黑魔法库(智能指针代理、侵入式容器、调试追踪内存)才会手动重载 operator&,属于非常规操作。

3. 手动重载后,编译器不再生成默认版本

一旦自己写任意一个 operator&,编译器就不会再生成默认的两个版本:

struct A {
    // 手动重载取地址,编译器不再生成默认的 &
    int* operator&() {
        return &x;
    }
    int x;
};

A a;
&A; // 调用自定义版本,返回 int*,不再返回 A*
const A ca{};
&ca; // 编译报错:没有 const 版 operator&

4. 补充:还有两个配套默认生成的一元运算符

除了 operator&,编译器还会隐式生成:

  • operator->(箭头):只有类是智能指针/包装器风格才会用到,普通类不会触发使用
  • operator*(解引用):同样极少重载

总结对比

  1. 六大特殊成员函数(考试/面试必考):默认构造、拷贝构造、拷贝赋值、析构、移动构造、移动赋值;受三/五法则约束。
  2. 默认生成但不属于特殊成员:operator&() / operator&() const;不受三/五法则约束,教材一般不列入“默认生成函数”清单。

面试如果问:“C++ 类编译器默认生成哪些成员函数?”
优先答6个特殊成员;如果面试官追问有没有其他默认生成的运算符,再补充取地址重载。

lammps模拟技巧:高熵合金势函数设置三种方法 大家好,我是小马老师。 本文继续介绍lammps模拟中的势函数设置方法。 在前面的文章中,介绍过高熵合金的建模:高熵合金建模 高熵合金包含的原子数较多,势函数的设置相对复杂,在平时一对一的咨询中,这种问题也相对较多。 下面介绍三种高熵合金势函数设置方法。 1.下载专用势函数 下面的网站包含了大多数原子的势函数: https://www.ctcms.nist.gov/potentials/ 如需下载包含Fe原子的势函数,直接点Fe: 出现势函数列表: 比如Al-Co-Cr-Fe-Ni就是高熵合金AlCoC 阅读详情

相关推荐

SDN:使用Postman控制ODL查看和下发流表

所谓,其实可被视作是SDN对网络设备的数据转发功能的一种抽象。在传统网络设备中,交换机和路由器的数据转发需要依赖设备中保存的二层MAC地址转发表或者三层的IP地址路由表,SDN交换机中使用的流表也是如此,不过在它的表项中整合了网络中各个层次的网络配置信息,从而在进行数据转发时可以使用更丰富的规则。其流表中的每个表项结果如下图所示:OpenFlow1.3流表的每个表项由6部分组成:1、匹配域:匹配域即OpenFlow1.0流表中的包头域,用于对交换机接收到的数据包的包头内容进行匹配。Ehter Des。

lyhaoyuhangyuan的博客 2535

【C++】类的默认成员函数

主要阐述了类的六个默认成员函数

dab112的博客 1822

2. Netty使用JSerialComm进行串口读取(二)

现在开始处理这些问题 第一个问题:串口读取超时异常一路传播到最后也没有处理。 ​ 第二个问题:即使处理了该异常,程序仍然退出,这不能满足一些实际使用要求需求。该问题与设置很长的读取超时时间没关系,无论多长到时间后总会退出。

s3c2410的博客 2463

【C++指南】类和对象(二):类的默认成员函数——全面剖析 :构造函数

在C++编程中,类的设计是实现面向对象编程(OOP)理念的核心。类不仅封装了数据(即属性)和操作这些数据的方法(即成员函数),还通过特定的成员函数——默认成员函数,管理着对象的生命周期和状态变化。 这些默认成员函数,包括构造函数、析构函数、拷贝构造函数以及赋值运算符重载函数,是C++类设计中不可或缺的部分,它们定义了对象如何被创建、销毁、复制以及赋值。

倔强的石头的博客 3057

谷歌(Google) Pixel 8/9 Pro(xl)如何获取 root 权限

谷歌(Google)Pixel8/9Pro(xl)等系列手机破解后,会在你的init_boot.img同路径生成一个magisk_patched.img,把这个文件拷贝到adb目录下,稍后还得把它刷回手机,这样手机才能获得Root权限,因为安卓14、15以后的内核结构调整,和Pixel7及以下的6、5、4、3、2等系列手机破解稍微不一致。因为ROOT权限的获取,需要使用ROM中的内核文件,个人强烈建议在官网下载ROM,直接刷最新版,其他地方的ROM如果没有校验码,请自行斟酌是否使用。

bugsycrack的博客 3491

STM32 HAL 模拟I2C从机实战:软件实现与多设备通信优化

本文详细介绍了STM32 HAL库下软件模拟I2C从机的实现方法,包括GPIO开漏配置、基础信号实现、数据收发函数编写和多设备通信优化策略。通过灵活的软件模拟方案,解决了硬件I2C接口数量限制和稳定性问题,为多传感器数据采集等应用提供了可靠的通信保障。

motor的博客 924

【C++初阶】一文讲通默认成员函数~类和对象(中)

1. 类的默认成员函数 2. 构造函数 3. 析构函数 4. 拷贝构造函数 5. 赋值运算符重载 5. 1 运算符重载 5. 2 赋值运算符重载 6. 取地址运算符重载 6. 1 const成员函数 6. 2 取地址运算符重载

fhvyxyci的博客 4260

飞塔CVE-2022-40684复现

admin 无密码直接回车(会提示修改密码)

G3et的博客 1148

编译器默认生成的c++类六大成员函数

当你遵循“零法则”时,你的类(即使非空)也能像空类一样,让编译器为其生成正确、高效的特殊成员函数。这些标准库组件本身已经完美地实现了“五法则”,你的类只需组合它们,就能自动获得正确的资源管理行为。这使得代码更简洁、更安全、更易于维护。

u011743621的博客 833

EDKII环境配置完整版

参考博客【EDK2 UDK2018的环境搭建】:https://blog.youkuaiyun.com/qq_39155263/article/details/82965744下载EDK2 1.直接从https://github.com/tianocore/edk2/ 网站下载.zip压缩文件 2.运用svn 从http://svn.code.sf.net/p/edk2/code/trunk/edk2edk2下载 3.安装Visual Studio2017 安装其他Tool 1.IASL 从https..

tianpu2320959696的博客 1857

基于深度学习的垃圾邮件识别

垃圾邮件的大量存在严重威胁着电子邮件系统的安全和效率。基于深度学习的垃圾邮件识别技术已经成为目前最有效的解决方案之一。本文将详细介绍使用深度学习技术进行垃圾邮件识别的方法,并提供相应的代码实现。 随着电子邮件的广泛应用,垃圾邮件的数量不断增加,传统的规则和统计方法已经无法满足对垃圾邮件进行准确识别的需求。深度学习技术以其强大的模式识别能力和自动特征提取能力成为解决垃圾邮件识别难题的有效工具。

一键难忘的博客 1095

【 C++ 】类和对象(中)—— 类的6个默认成员函数

目录 1、类的6个默认成员函数 2、构造函数 构造函数概念 构造函数特性 3、析构函数 析构函数概念 析构函数特性 4、拷贝构造函数 拷贝构造函数概念 拷贝构造函数特性 5、赋值运算符重载 运算符重载 赋值运算符重载 6、const成员 const修饰类的成员函数 7、取地址及const取地址操作符重载 1、类的6个默认成员函数 ......

bit_zyx的博客 4033

ShardingSphere 5.3 系列Spring 配置升级指南 | Spring Cloud 47

在 `5.3.0` 版本以前,`ShardingSphere-JDBC` 同时支持 `Java API`、`YAML`、`Spring Boot Starter` 和 `Spring Namespace` 等配置方式。 - 当新增或更新 API 时,需要调整多项配置文件,工作量大 - 社区需要维护多重配置文档和示例 - `Spring Bean` 生命周期管理容易受到项目其他依赖的影响,比如 `PostProcessor` 无法正常执行 - `Spring Boot Starter` 和 `Spring N

gmHappy 2万+

【C++】类和对象(中)——默认成员函数详解(万字)

本文主要讲解类和对象中的默认成员函数知识,包括构造函数、析构函数、拷贝构造函数、赋值重载函数、取地址重载函数和 const 取地址重载函数。

2401_87820834的博客 7278

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【C++】再识类和对象——六大默认成员函数

介绍六大默认成员函数,增加对类和对象的了解,进一步学习C++,为日后学习打下基础。

Mesar的博客 2149

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

【C++类和对象】类有哪些默认成员函数呢?(上)

构造函数、析构函数、拷贝构造函数、赋值运算符重载

m0_57388581的博客 1369

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

《C++初阶之类和对象》【类的六大默认成员函数】

本文介绍了C++类的六大默认成员函数,重点讲解了构造函数、析构函数、拷贝构造函数和拷贝赋值运算符四种关键函数。这些默认成员函数是理解C++对象生命周期的核心知识,本文通过大量代码示例(如Stack类实现)展示了如何正确使用这些函数。

序属秋秋秋的博客 1980

【C++】类的6个默认成员函数

1. 类的6个默认成员函数2. 构造函数3. 析构函数4. 拷贝构造函数5.1运算符重载5.2赋值运算符重载5.3前置++和后置++重载,前置--和后置--重载5.4日期类的实现6. const成员函数7. 取地址及const取地址操作符重载

m0_64538862的博客 1545

【C++】:类和对象(中)之类的默认成员函数——构造函数and析构函数

如果一个类中什么成员都没有,简称为空类空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数由于编译器的优化 我们未给_a赋值 这里是不会报错的这里还需要强调一个点就是成员函数的地址不在对象中成员变量存放在对象中。

优快云官方认证C/C++研发领域优质创作者 优快云官方2023年成都赛道Top3 第16届蓝桥杯C/C++软件赛四川赛区二等奖 带你玩转C/C++ 数据结构与算法 Linux系统编程/Linux网络编程 MySQL数据库 软件测试开发 2244

C++初阶(类中的默认成员函数)

C++类和对象中,带你了解类中的默认成员函数。

Yui_的博客 1787

【C++】类的六个默认成员函数

类的六个默认成员函数:构造、析构、拷贝赋值还有operator关键字......

To_be_a_master的博客 1404

C++类和对象之默认成员函数

这样的语句创建对象obj时,默认构造函数就会被调用。不过需要注意的是,编译器生成的默认构造函数只是对对象的成员进行默认初始化,对于内置类型,其值是未定义的;我们不写,编译器默认⽣成的构造,对内置类型成员变量的初始化没有要求,也就是说是是否初始化是不确定的,看编译器。对于大多数简单类,默认析构函数就足够了,它会自动调用成员对象的析构函数,释放对象成员占用的资源。如果⼀个构造函数的第⼀个参数是⾃⾝类类型的引⽤,且任何额外的参数都有默认值,则此构造函数也叫做拷⻉构造函数,也就是说拷⻉构造是⼀个特殊的构造函数。

zzh_Zao的博客 1649

C++ 类的6个默认成员函数

如果一个类中什么成员都没有,简称为空类。空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。

wangdongdong23的博客 1044

C++的六个默认成员函数

对于类来说,如果类中没有任何成员则被称为空类。但空类就意味着没有类吗?答案是否定的,因为类中存在着一些默认成员函数,这些默认成员函数构成类的基本功能。既然类已经默认设置了其成员函数的功能,为何需要我们了解呢?

2401_84360682的博客 2163

【C++】类和对象(二)默认成员函数之构造函数、析构函数

通俗来说,就是我们不写,编译器默认自动生成的函数。一个类,我们不写的情况下编译器会默认生成6个默认成员函数,需要注意的是这6个中最重要的是前4个,最后两个取地址重载不重要,稍微了解一下即可。其次就是C++11以后还会增加两个默认成员函数,移动构造和移动赋值,这个我们后面再讲解。默认成员函数很重要,也比较复杂。六种:构造函数、析构函数、拷贝构造函数、拷贝赋值重载、普通对象和const对象取地址重载。初始化和清理构造函数主要完成初始化工作。析构函数主要完成清理工作拷贝复制。

2302_79531041的博客 1638

c++类的默认成员函数

6个默认成员函数 这些默认的类成员函数, 在类创建的时候, 编译器会自动调用, 但是自动调用并不意味着他们能完成用户所期待的所有任务, 像构造函数, 析构函数, 拷贝构造函数, 赋值重载会在某些情况下需要用户根据程序的需要自定义实现. 构造函数 构造函数的主要工作是在对象创建的时候就完成初始化工作. 特性 函数名与类名相同。 无返回值。 对象实例化时编译器自动调用对应的构造函数。 构造函数可以...

Sock的博客 5043
上一篇: C++模板
下一篇: C++ 虚继承对象内存布局
越甲八千
博客等级 码龄11年 2959粉丝 553原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值